SQL Server 2012 实施与管理实战指南Note:高可用性和灾难恢复技术
SQL Server 2012 实施与管理实战指南Note:高可用性和灾难恢复技术
SQL Server “高可用性”和“灾难恢复”四个传统技术:故障转移群集(Cluster)、日志传送(Log Shipping)、复制(Replication)和数据库镜像(database Mirroring)
“高可用性”与“灾难恢复”
数据库服务的可用时间=在线时间/(在线时间+宕机时间)

SQL Server服务由两部分组成:
- SQL Server作为应用服务,由Windows上的可执行文件提供功能。
- 储存在硬盘上的数据。
“高可用性”(High Availability,简称HA)指的是数据库服务能够始终保持在线运行,针对的是软件或硬件问题造成的数据库系统不可用。
“灾难恢复”(Disaster Recovery,简称DR)指的是当数据库中的数据发生损坏或者不可访问时,可以在尽可能短的时间恢复全部数据或者恢复尽可能多的数据,从而保证应用系统的正常运行,针对的是保存在数据库系统中的数据不可用。
SQL Server故障转移群集
SQL Server故障转移群集是一项基于Windows故障转移群集的一种技术。
Windows故障转移群集
结构

- Windows故障转移群集由多个服务器(Node)组成,每个Node都运行着Microsoft集群服务(MSCS)
- 共享磁盘(Shared Array):存放需要共享的数据,如SQL Server的数据库文件、错误日志等
- 本地磁盘(Drive C):每个节点的本地磁盘,存放不需要共享的内容。当某节点是活跃节点时,用户可以访问其本地磁盘而不能访问其他Node的本地磁盘。
- 私有网络(Private Network):由每个Node上的私有网卡相互连接形成,用于“心脏线”信号,即节点相互感知彼此是否正常工作,如某节点无法回应信号,即被排出群集。
- 公用网络(Public Network):外部资源通过节点上的公共网卡访问该节点。
- 混合网络(Mixed Network):由于私有网卡和公共网卡在物理上可以是一块网卡,群集可以通过一个网络完成私有和公共网络的功能。
- 虚拟服务器(Virtual Server):由群集内所有节点组成的一个(虚拟)服务器。有与群集内任何节点都不同的IP地址(虚拟IP)和机器名(虚拟网络名)。虚拟IP一定要和公共网络配置在同一个网段里。
- 资源:指在Windows群集中,虚拟IP,虚拟网络名,共享磁盘,SQL Server等等。在任意时刻,只有群集中的一个节点(活跃节点,用户实际登录的节点)能提供用户所需的服务和资源,而其他节点都处于空闲状态。
- 活跃节点:当前拥有该群集资源的节点,由Windows群集服务决定。
- 客户端的连接指令始终都是一样的:指向虚拟IP,或者虚拟网络名,对虚拟服务器的请求会被转向到活跃节点上。
故障转移(Failover)

当前拥有资源的节点NodeA出现故障时,Windows群集会自动发起故障转移,转移后NodeB拥有资源。
故障转移发生:
- 由于故障自动切换
- 系统管理员手动切换
SQL Server故障转移群集
SQL Server故障转移群集,即将SQL Server部署在Windows群集中的多个节点上以组成一个虚拟SQL Server实例。在当前活跃节点不可用时,SQL Server可以被切换到工作正常的节点上继续进行服务。
SQL Server群集资源组的结构
“资源组”是由一个或者多个(相互关联)的资源组成的组,在任何时候每个资源组都仅属于其“活跃节点”,所有的故障转移都是以资源组为单位发生。
对于SQL Server资源组,通常包含以下资源:

SQL Server网络名和SQL Server IP地址
SQL Server实例拥有专属的虚拟网络名和IP地址,它们提供了应用程序访问SQL Server时使用的机器名或者IP地址。SQL Server群集并不使用Windows群集的虚拟网络名和虚拟IP地址来作为应用程序访问它的接口。
SQL Server和SQL Server Agent
SQL Server群集中所有节点都安装有SQL Server和SQL Server Agent服务以及与服务所对应的二进制文件、注册表键值等。
在群集正常运行的情况下,只有活跃节点的SQL Server实例是Running的,其他节点上都是Stopped。
SQL Server资源名:
- SQL Server是默认实例,资源名为SQL Sever
- SQL Server是命名实例,资源名为SQL Server(实例名),eg “SQL Server (MSSQLSERVER)”
客户端程序通过“虚拟网络名”访问SQL Server实例。
共享磁盘
共享磁盘资源可以是一块逻辑磁盘,也可以是一块磁盘上的一个mount point。
共享磁盘保存SQL Server群集实例的:
- 数据库的所有数据文件和事务日志文件(MDF,NDF和LDF)
- SQL Server和SQL Server Agent的日志文件(ERRORLOG)
- 其他的文件和目录
共享磁盘和SQL Server必须在用一资源组里,SQL Server依赖于共享磁盘。
一个共享磁盘资源只能属于一个SQL Server实例,但是一个SQL Server群集实例可以使用多个共享磁盘。
其他
可能包含:
- File Share资源:如果 SQL Server要使用FileStream
- Analysis Services资源
资源状态
上线(online):该资源在某个节点上正常工作中。
离线(offline):该资源在某个节点上处于停止工作状态,无法提供相应的服务。
失败(failed):该资源在某节点尝试上线,但是由于某些异常无法上线成功。
上线挂起(online pending):资源尝试进入上线状态,但是还没完全成功上线。
离线挂起(offline pending):资源尝试进入离线状态,但是还没完全成功离线。
集群资源的配置
在 Properties中,我们可以对于群集资源进行设置:
Dependencies
一个资源所依赖的其他资源必须要和这个资源处于同一个资源组里,跨资源组的依赖关系是不存在的


Policies
Policies决定了该资源发生故障转移时的行为。

Affect the Group设置:
- If resource fails, attempt restart on current node
- If restart is unsuccessful, fail over all resources in this service or application
适用于:SQL Server资源,共享磁盘资源,虚拟IP地址资源,虚拟服务名资源
Not affect the Group设置:
- If resource fails, attempt restart on current node
- If restart is unsuccessful, fail over all resources in this service or application
适用于:(出于最大化高可用目的,消除不必要的Failover)SQL Server Agent资源,Fill Share资源,Analysis Services资源
Advanced Policies

Basic resource health check interval
和Thorough resource health check interval
是Windows
Cluster在不同时间间隔做的两种不同程度的检查(Looks alive check,Is alive
check),用于确认每个资源是否在正常工作。
SQL Server群集什么时候会发生“故障转移”
当Looks alive check或Is alive check检查失败时,进行故障转移。由于故障转移一般是意外发生的,所以SQL Server切换到新节点以后,还需要一段时间来做数据库的recovery。
群集里的每个资源都是一种资源类型。根据不同类型的资源,会使用不同的方式进行isalive和looksalive检查。 | 资源 | 资源类型 | | ---------- | ------------ | | 共享磁盘 | physicaldisk | | 虚拟IP | IP Address | | SQL Server | SQL Server |

Windows群集服务进程clussvc.exe会产生名为RHS.exe的进程,RHS.exe会装载resource dll,并且调用dll中定义的方法来检查相应resource的状态。一个资源其属性的Advanced Polices选项卡中如果没有勾选“run this resource in a separate Resource ”,它的resource dll就会装载在一个默认的RHS.exe中;反之,则会有一个单独的RHS.exe来装载该资源的resource dll。所以在任务管理器中你可能看到多个RHS.exe进程。

Windows群集自带的资源类型:
- physical disk, IP, network name和DTC等
- 检查的方法定义在resource DLL,
clusres.dll
中
非Windows群集自带的资源类型:
SQL Server
如有专属资源类型和专属resource dll,在resource dll中定义检查方法
SQL ServerD的resource dll:
SQL Server资源(通常affect the group模式) -->
sqsrvres.dll
Looksalive:默认5秒一次,通过服务控制管理器(Service Control Manager,简称SCM)检查SQL Server服务在活跃节点是否处于“启动状态”
Isalive:默认60秒一次,如lookalive检查的结果失败,立刻触发Isalive检查。SQL 2012之前,通过连 接SQL Server群集实例并获取运行命令的返回结果来进行判断。如果连接不上SQL Server群集实例或 者语句运行失败,那么Isalive检查失败。此时Windows群集会再做3-5次(根据Windows的版本和设置 不同)Isalive检查。如最终检查失败,则进行故障转移。
SQL Server Agent资源-->
sqagtres.dll
”通用服务“(Generic Service)资源类型:
- Analysis Service
- 使用
clusres.dll
来作为resource dll并沿用定义进行检查。
Cluster-aware服务:
- 可以通过resource dll形成群集资源
- SQL Server、SQL Server Agent,Analysis Service服务
非Cluster-aware服务:
- 无法通过任何resource dll在Windows群集中形成资源,即使安装在群集的节点上也会被视作安装在单机环境,无法故障转移。
- SQL browser, Reporting Service等
- Integration Services不是Cluster-aware,可以人为配置为群集资源(不推荐),但是不具有自动故障转移功能。