AlwaysOn是在SQL Server 2012中新引入的一种高可用技术,从名称中可以看出,AlwaysOn的设计目标是保持数据库系统永远可用。AlwaysOn利用了Windows服务器故障转移集群(Windows Server Failover Clustering,简称WSFC)的健康检测和自动故障转移的特性,因此,必须建立在WSFC之上,搭建WSFC的过程,请参考《部署AlwaysOn第一步:搭建Windows服务器故障转移集群》。

AlwaysOn支持的高可用单位是可用性组(Availability Group,简称AG),AG是包含了一个或多个用户数据库(User Database)的容器,AG里不能包含系统数据库;AG以用户数据库的集合为单位进行健康检测和故障转移,就是说,AG中的所有数据库作为一个整体发生故障转移。

一,AlwaysOn的基本架构

1,了解AlwaysOn的关键特性

  • AlwaysOn支持的故障转移,不是以整个SQL Server实例为单位,而是以AG为单位,AG中的多个用户数据库一起进行故障转移;
  • AG提供虚拟的服务器网络名,也就是AG Listener,无论哪台服务器是当前的Primary Server,客户端都可以使用统一的AG Listener进行连接;
  • AlwaysOn在辅助服务器(Secondary Server)上维护用户数据库组的副本,同步提交方式能够使Primary Server和Secondary Server上的数据保持完全同步;
  • 在特定的配置情况下,客户端的只读请求可以被自动定向到辅助服务器,减少了Primary Server的IO压力;
  • 一台主服务器最多对应4台辅助服务器,总共5台服务器,发生故障转移时,可以切换到任意一台辅助服务器上;

2,推荐安装SQL Server单机实例(stand-alone)

部署AlwaysOn之前,必须搭建WSFC环境;在Windows集群的结点上,推荐安装SQL Server单机实例,AlwaysOn仅要求所有的SQL Server实例都运行在同一个Windows集群环境中,但SQL Server实例本身不需要是集群模式的,推荐安装SQL Server单机实例。在SQL Server安装中心中,选择“全新SQL Server独立安装或向现有安装添加功能(New SQL Server stand-alone installation or add features to an existing installation)”。

3,可用性数据库(Availability Database)

AlwaysOn可用性组里包含一个或多个用户数据库,称作可用性数据库(Availability Database),每个可用性副本上都存储可用性数据库的副本,这些数据库副本彼此之间互相同步,如果可用性副本是SQL Server单机实例,那么数据库副本就存储在实例的本地磁盘(Local Disk)中。可用性组不能包括系统数据库,就是说,系统数据库不能通过AlwaysOn实现高可用性。

在多个可用性副本上,只有一个可用性副本上运行的数据库处于可读写状态,这个可读写的数据库称作Primary Database,这个可用性副本称作Primary Replica,其余的副本都称作辅助副本(Secondary Replica),辅助副本上的数据库可能是不可访问的,或者是只读的,这些数据库称作辅助数据库。一旦发生故障转移,任何一个辅助副本都可以成为新的Primary Replica,主副本会不断地将Primary database上的数据更新发送到辅助副本,实现副本间的数据同步。

4,AG是集群的资源组

从WSFC的角度来看,AG是集群的资源组,因此,AG中包含的所有用户数据库是作为一个整体在集群的结点之间进行故障转移的,这使得AlwaysOn非常适合那些需要用到多个数据库的应用程序。

5,侦听器(Listener)

在故障转移集群管理器(Failover Cluster Manager)中,WSFC只能看到一个资源组,就是AlwaysOn的可用性组(AG),但是应用程序不能使用资源组的名字登录SQL Server实例,必须知道当前主副本(Primary Replica)的名字,使用这个服务器名称连接SQL Server实例。一旦发生可用性组(AG)的故障转移,应用程序必须通过修改连接字符串(Connection String)重新连接到新的Primary Replica上,这很麻烦。通过可用性组侦听器(Availability Group Listener,简称Listener),能够解决该问题。Listener是一个虚拟的服务器,用于让应用程序透明的连接到主副本而不会受到故障转移的影响,一个Listener包含虚拟的网络名(DNS Name),虚拟IP地址和端口号。创建了Listener之后,WSFC就会为可用性组资源添加虚拟IP地址和虚拟网络名资源,应用程序通过连接虚拟网络名,连接主副本(Primary Replica)上的SQL Server实例。

应用程序使用Listener的虚拟网络名连接SQL Server实例,是以一个默认实例的形式访问的,只有服务器名,没有SQL Server实例名,因此应用程序不会尝试使用SQL Brower 服务。推荐AlwaysOn的各个副本都使用默认实例,默认端口。如果Listener使用的端口号是默认端口1433,那么应用程序能够直接使用虚拟网络名连接到SQL Server实例。

二,AlwaysOn的数据同步原理

AlwaysOn会在各个副本上维护数据库的副本,主副本上发生的数据更新,都会同步到辅助副本上,为了实现数据同步,AlwaysOn需要完成三个任务:

  • 把主副本上发生的数据更新的事务日志记录下来;
  • 把事务日志记录传输到各个辅助副本;
  • 在各个辅助副本上重做数据更新;

在主副本和辅助副本上,SQL Server都会启动相应的线程来完成相应的任务。

1,日志持久化

任何一个SQL Server都有个Log Writer线程,当事务提交一个数据更新时,Log Writer把数据更新的日志写入到物理事务日志文件。

2,主副本的日志传输

对于配置AlwaysOn 主副本的数据库,SQL Server创建一个Log Scanner线程,负责将日志记录从日志缓冲区或者事务日志文件读出,打包成日志块,发送到各个辅助副本,由于Log Scanner线程的不间断工作,使得主副本上的数据变化,不断地向辅助副本上传播。

3,辅助副本上的固化(Harden)和重做(Redo)

在辅助副本上,同样有两个线程固化线程和重做线程完成相应的数据更新操作。固化线程将主副本上Log Scanner传入的日志块写入辅助副本的硬盘上的事务日志文件里,而重做线程,负责从硬盘上读取事务日志,将日志记录翻译成数据更新操作,在辅助副本的数据库上重做主副本的数据更新操作。

当重做线程完成工作之后,辅助副本上的数据库和主副本保持同步,重做线程每隔固定的时间间隔,就会向主副本报告自己的工作进度,主副本根据各个辅助副本的工作进度,就能计算数据的差异。

在AlwaysOn中,在固化线程和重做线程是完全独立工作的,固化线程负责将主数据库传递的日志写入到硬盘上的日志文件中,将日志持久化存储;而重做线程负责读取和翻译已被固化线程存储的日志,将主数据库上的数据更新操作在辅助数据库上重新执行。

三,AlwaysOn的可用性模式

可用性模式决定了主副本在提交事务之前,是否需要等待某个辅助副本将事务日志记录固化到硬盘,AlwaysOn可用性组支持两种可用性模式:异步提交模式和同步提交模式。

1,异步提交模式

当辅助副本处于异步提交模式时,主副本无需等待辅助副本完成日志固化,就可以提交事务,因此,主副本事务提交不会受到辅助数据库的影响而产生等待,但是,辅助数据库的更新会滞后于主数据库,如果发生故障转移,可能会导致某些数据更新丢失。

在异步提交模式下,辅助副本会尽量和主副本的日志记录保持一致,不过,即使辅助数据库和主数据库上的数据是同步的,可用性组始终认为辅助数据库处于“在同步”(SYNCHRONIZING)状态,因为,理论上在异步模式下,辅助数据库在任何时间点都可能滞后于主数据库。

2,同步提交模式

在同步提交模式下,主数据库在提交事务之前,主副本必须等待辅助副本将日志固化到硬盘上,主副本只有收到来自辅助副本的日志固化成功的确认信息之后,才能提交事务;只要辅助副本没有向主副本报告日志固化完成,主副本上的事务就不能提交。这样能够保持主副本和辅助副本的数据始终是同步的,只要一直进行数据同步,辅助数据库就会保持”已同步“(SYNCHRONIZED)状态。

同步提交模式能够实现辅助数据库和主数据库上的数据的完全同步,但是,代价是主数据库上的事务提交延迟增加,可以说,同步提交模式相对于性能来说,更强调高可用性。

3,可用性副本之间的短线连接状态

”DISCONNECTED“连接状态:AlwaysOn可用性组之间有一个会话超时机制,默认值10s。主副本和辅助副本之间,按固定的时间间隔相互发送ping,在会话超时时间内,如果主副本收到辅助副本的ping命令,就说明副本之间的连接正常;一旦某个辅助副本因为故障而不能响应,产生会话超时,主副本将该辅助副本的连接设置为”DISCONNECTED“连接状态,即使使用同步提交模式,主副本的事务也不需要等待该副本的响应就可以提交。

4,辅助数据库的”NOT SYNCHRONIZING“状态

无论使用什么可用性模式,如果一个事务在辅助数据库上重做失败,就会导致辅助副本进入”NOT SYNCHRONIZING“状态,即使处于同步提交模式,主副本的事务也不需要等待该副本的响应就可以提交。

如果用户想中断数据库的数据同步,而不想影响可用性组中的其他数据库,可以通过在SSMS中选择Suspend Data Movement来手动挂机,挂起之后,该数据库在各个可用性副本上的状态都会变成”NOT SYNCHRONIZING“状态。

四,AlwaysOn的故障转移

当WSFC触发故障转移之后,一个辅助副本被选择成为新的主副本角色,该副本上的SQL Server实例对可用性数据库执行恢复操作,使其成为新的主数据库;在故障转移完成之后,如果原先的主副本还可用,那么它就成为辅助副本,它上面的数据库就成为了辅助数据库。

但AlwaysOn发现故障之后,是否立即出发故障转移呢?这取决于可用性副本的可用性模式和故障转移模式,如图:

只有主副本和转移的目标副本都配置为”同步提交模式+自动故障转移“模式时,才能实现两个可用性副本之间的自动故障转移。在三种故障转移模式中,只有强制故障转移可能丢失数据。自动故障转移和手动故障转移,都必须配置在同步提交模式下,必须数据库都处于SYNCHRONIZED状态。对于异步提交模式的辅助副本,无论数据是否已经达到同步,都只会处于SYNCHRONIZING状态,只能支持强制故障转移。

五,创建可用性组

1,在创建AG之前,配置SQL Server实例启用AlwaysOn

在SQL Server配置管理器(SQL Server Configuration Manager)中打开SQL Server 实例的属性,输入Windows 故障转移集群的名称,并勾选“Enable AlwaysOn Availabilitty Groups”选项启用AlwaysOn 可用性组,在所有可用性副本上都启用SQL Server实例的AlwaysOn 可用性组。

2,使用SSMS连接任意主副本的SQL Server实例,打开新建AG向导(New Availability Group Wizard)

连接到主副本,是因为该副本上拥有所有的可用性数据库,如果所有的可用性副本上都有相同的数据库副本,那么可以连接任意一个副本。

3,指定AG的名字,勾选“Database Level Health Detection”选项

4,选择可用性数据

从数据库列表中需要添加到可用性组中的数据,这些数据库将成为一个整体一起发生故障转移,本例勾选Test_DW。

添加到可用性组中的数据库必须满足一定的要求:

  • 数据库可以读写;
  • 数据库的恢复模式是FULL;
  • 数据库已经做过完整备份;

5,添加可用性副本

使用“Add Replica”添加可用性副本,在Availability Replicas列表中,能够查看各个可用性副本的配置:

  • Server Instance:副本的实例名称
  • Initial Role :是副本初始角色,Primary是主副本,Secondary是辅助副本;
  • 勾选“Automatic Failover” :副本的故障转移模式是自动故障转移;
  • 勾选“Synchronous Commit”:副本的可用性模式是同步提交模式;
  • “Readable Secondary”:可读的辅助副本,主数据库是可读写的,辅助数据库可以设置为可读的;

6,创建Listener

创建一个可用性组的侦听器,实际上是虚拟的服务器,

  • Listener DNS Name:网络名,命名为TestAGListener;
  • Port:推荐使用默认端口1433;
  • Network Mode:IP地址的分配方式,建议使用Static IP,本例使用DHCP;
  • Subnet:子网,系统自动设置;

7,选择如何在辅助副本上初始化AG中的数据

FULL:向导自动对主数据库做完整备份和日志备份,并将备份文件存放在共享目录中,其他副本通过共享目录获得数据库的备份,并在各自的SQL Server实例上还原数据库。通过FULL初始化方式,必须确保主副本上的存储主数据库文件的路径在辅助副本上也存在,即数据库文件的存储路径一致。

Join Only:如果已经手动在各个辅助副本上还原了数据库,使用该选项,将各个辅助副本直接加入到可用性组中。

Skip Initial data sync:跳过该步骤,用户需要手动在主副本上对数据库做完整备份,并还原到所有的辅助副本,然后通过SSMS将数据库添加到可用性组中。

推荐将主数据库和辅助数据库的文件路径保持一致。

8,成功创建可用性组

执行后续的Validation和Summary之后,向导开始创建可用性组,在创建完成之后,使用SSMS打开“AlwaysOn High Availability”,能够看到创建成功的可用性组:“TestAG”,括号中的Primary表示当前的可用性副本是主副本(Primary Replica)。

到此,AlwaysOn部署完成,可以通过SSMS连接Listener,登录Primary Replica上的 SQL Server 实例。

参考文档:

《SQL Server 2012 实施与管理实战指南》第三章

虚拟化IDC的高可用和高可靠性解决方案

从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

AlwaysOn Failover Cluster Instances (SQL Server)

部署AlwaysOn第二步:配置AlwaysOn,创建可用性组的更多相关文章

  1. 在 Azure 虚拟机中配置 Always On 可用性组(经典)

    在开始之前,请先假设现在可以在 Azure Resource Manager 模型中完成此任务. 我们建议使用 Azure Resource Manager 模型来进行新的部署. 请参阅 Azure ...

  2. AlwaysOn可用性组测试环境安装与配置(二)--AlwaysOn配置(界面与T-SQL)

    四.AlwaysOn配置 1.开启AlwaysOn高可用性功能. 1.1.开启Server01的可用性组 1.2.需要重启服务:属于SQL server群集节点的服务,需要通过故障转移界面重启 1.3 ...

  3. SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn(实战篇)之AlwaysOn可用性组搭建

    因为篇幅原因,AlwaysOn可用性组被拆成了两部分:理论部分和实战部分.而实战部分又被拆成了准备工作和AlwaysOn可用性组搭建. 三篇文章各自的链接: SQL Server ->> ...

  4. SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)

    因为篇幅原因,AlwaysOn可用性组被拆成了两部分:理论部分和实战部分.而实战部分又被拆成了准备工作和AlwaysOn可用性组搭建. 三篇文章各自的链接: SQL Server ->> ...

  5. 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...

  6. (转) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    原文地址: http://www.cnblogs.com/lyhabc/p/4682986.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第三篇,这一篇才真正开始搭建Alwa ...

  7. 服务器搭建域控与SQL Server的AlwaysOn环境过程(四)配置AlwaysOn

    0 引言 这一篇才真正开始搭建AlwaysOn,前三篇是为搭建AlwaysOn 做准备的. 步骤 1.3 配置AlwaysOn 请先使用本地用户Administrator登录这两个集群节点并执行下面的 ...

  8. (转载) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    这一篇是从0开始搭建SQL Server AlwaysOn 的第三篇,这一篇才真正开始搭建AlwaysOn,前两篇是为搭建AlwaysOn 做准备的 步骤 这一篇依然使用step by step的方式 ...

  9. 【转】SQL Server 2012 配置AlwaysOn(三)

    转载自:http://www.cnblogs.com/lyhabc/p/4682986.html 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http:/ ...

随机推荐

  1. LeetCode题解之Remove Nth Node From End of List

    1.题目描述 2.问题分析 直接计算,操作. 3.代码 ListNode* removeNthFromEnd(ListNode* head, int n) { if (head == NULL) re ...

  2. SSM整合配置文件的主要内容

    web.xml: <servlet> <setvlet-name>springMVC</setvlet-name> <!-- 配置前端控制器 --> & ...

  3. MySQL索引原理及慢查询优化-zz

    https://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所 ...

  4. 【爬坑】MySQL 无法启动

    [说明] 启动 MySQL 的时候出现以下错误 [解决] 在网上查到了遇到相关问题的人的解决方法,参考连接 Mysql启动报错 原因是 MySQL 服务没启动,开启就好了. 最后分析之所以服务没开启, ...

  5. 【转】HTTP学习---TCP和UDP协议的区别与应用

    [原文]https://www.toutiao.com/i6592813624689951239/ 概述 ⊙TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICM ...

  6. 看代码网备份|利用WebClient|eKing.CmdDownLoadDbBakOper|实现定时拷贝数据库备份文件到文件服务器

    摘要: 1.有两台服务器 (1)看代码网(记为A):内网IP:10.186.73.30 (2)文件服务器(记为B):内网IP:10.135.87.157 2.在A架设一个网站,端口8088(防火强设置 ...

  7. 乘风破浪:LeetCode真题_040_Combination Sum II

    乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...

  8. October 20th 2017 Week 42nd Friday

    My life is in these books. Read these and know my heart. 我的人生就在这些书中,读完他们就能读懂我的心. Some people say tha ...

  9. ConstraintLayout使用手册

    1. 解决痛点 主要用拖拽 解决嵌套过多 2. 简易使用手册 增加约束 四个角直接拖拽就好了 删除约束 match_constraint 属性 这个属性类似于match_parent,去掉margin ...

  10. 【Android自动化】测试系统的应用程序安装与卸载性能,判断长时间反复安装对系统的整体性能影响

    # -*- coding:utf-8 -*- import sys import os import time import subprocess from uiautomator import de ...