首页 > 技术文章 > SQL Server 2016 Failover Cluster + ALwaysOn

ios9 2018-08-25 11:23 原文


SQL Server 2016 Failover Cluster + ALwaysOn 环境的搭建


近期公司为了提高服务的可用性,就想到了部署AlwaysOn,之前的环境只是部署了SQL Server Failover Cluster,所以决定将云端放一台SQL Server来配置ALwaysOn,具体思路就是在本地的SQL Server Failover Cluster中再增加一个节点,然后将新家的节点放到Azure云端,然后在这两个实例之间配置AlwaysOn,部署后,有个问题就是集群之间无法自动故障转移,需要手动干预才可以具体后期我们再做详细介绍,废话就不多说了,开始实践配置;
环境介绍:

Hostname:DC1
Role:DC
IP:192.168.5.20
Domain:ixmsoft.com
Hostname:ISCSI
IP:192.168.5.38
Role:Storage
Hostname:S1
Role:SQL Server 2016
IP:192.168.5.41
Hostname:S2
Role:SQL Server 2016
IP:192.168.5.42
Hostname:AO1
Role:SQL Server 2016
IP:192.168.5.43
SQL-CLUSTER
192.168.5.46
SQLCLUSTER
192.168.5.47
HA-LP1
ListenIP:192.168.5.48
SCHEMA
因为要做磁盘共享,所以我们使用系统自带的ISCSI做为连接器;
我们首先安装配置ISCSI服务器:
首先是挂载两块盘:一块是Data:50G,一块是仲裁:10G
ISCSI
然后安装ISCSI目标服务器
ISCSI
我们安装后,我们打开ISCSI管理---创建ISCSI虚拟磁盘
ISCSI
我们新选择DATA盘
ISCSI
我们增加需要分配磁盘的计算机IP
我们增加两台SQL Server服务器
ISCSI
确认信息
ISCSI
创建完成
ISCSI
ISCSI
再次新建一个虚拟磁盘用于仲裁
ISCSI
设置磁盘名称
ISCSI
所有的磁盘已增加完成
ISCSI
我们开始从5.41上通过ISCSI连接程序连接共享磁盘
ISCSI
提示确认启动服务
ISCSI
输入ISCSI服务器地址,快速链接
ISCSI
已连接
ISCSI
卷和设备已加载
ISCSI
我们此时就可以在192.168.5.41上看见分配的两块磁盘了
ISCSI
我们同理也按照上面的方法,在192.168.5.42上进行ISCSI链接
准备好以上操作后,我们就可以开始安装故障转移集群了;
我们首先在S1上进行操作安装
ISCSI
安装完成
ISCSI
安装后,我们同样在第二台S2上进行安装,安装后,我们就打开集群管理器
右击故障转移集群管理器----验证配置
Failover + ALwaysOn
增加两台SQL Server服务器
Failover + ALwaysOn
验证通过后,点击完成
Failover + ALwaysOn
验证通过后,我们就可以创建了;
我们定义集群名称及IP
SQL-CLUSTER
192.168.5.46
Failover + ALwaysOn
定以后,确认信息
Failover + ALwaysOn
开始创建集群
Failover + ALwaysOn
定义完成
Failover + ALwaysOn
两个节点信息
Failover + ALwaysOn
磁盘信息
Failover + ALwaysOn
配置仲裁
Failover + ALwaysOn
高级仲裁选项
Failover + ALwaysOn
选择所有节点
Failover + ALwaysOn
选择仲裁磁盘
Failover + ALwaysOn
我们同时将第一个磁盘增加到群集共享卷
Failover + ALwaysOn
我们准备安装SQL Server 2016
Failover + ALwaysOn
定义SQL Server网络名称
SQLCLUSTER
Failover + ALwaysOn
选择数据磁盘
Failover + ALwaysOn
定义群集网络IP
192.168.5.47
Failover + ALwaysOn
定义账户信息
Failover + ALwaysOn
定义数据目录,自动选择磁盘共享卷目录
Failover + ALwaysOn
安装完成
Failover + ALwaysOn
我们在群集管理器中就可以看见多了一个角色及管理IP
Failover + ALwaysOn
我们准备安装第二个节点
Failover + ALwaysOn
下一步即可
Failover + ALwaysOn
默认即可
Failover + ALwaysOn
确认信息
Failover + ALwaysOn
Failover + ALwaysOn
节点增加完成
Failover + ALwaysOn
测试集群
我们从节点1切换到节点2
Failover + ALwaysOn
切换中
Failover + ALwaysOn
切换完成
Failover + ALwaysOn
我们使用SSMS进行连接测试
我们使用SQL集群地址进行连接
Failover + ALwaysOn
我们使用群集网络地址链接
Failover + ALwaysOn
我们查看集群属性----集群化--true
Failover + ALwaysOn
到此我们SQL Server的Failover Cluster已经配置完成。。


SQL Server 2016 Failover + ALwaysOn功能配置介绍


我们上一篇介绍了SQL Server 2016 Failover Cluster的配置,今天我们继续上一篇没有完成的配置介绍,准备增加一个节点,然后配置实现AlwaysOn配置,实现SQL Server 2016 Failover Cluster+ ALwaysOn达到SQL Server的单点故障及高可用性,SQL Server 2016 Failover Cluster已经完成了配置,接着我们配置 ALwaysOn,我们准备了一台SQL服务器,但是也需要加入到集群节点;我们下面是上节的配置介绍图;
Hostname:DC1
Role:DC
IP:192.168.5.20
Domain:ixmsoft.com
Hostname:ISCSI
IP:192.168.5.38
Role:Storage
Hostname:S1
Role:SQL Server 2016
IP:192.168.5.41
Hostname:S2
Role:SQL Server 2016
IP:192.168.5.42
Hostname:AO1
Role:SQL Server 2016
IP:192.168.5.43
SQL-CLUSTER
192.168.5.46
SQLCLUSTER
192.168.5.47
HA-LP1
ListenIP:192.168.5.48
SCHEMA
我们首先在新的节点上安装集群故障转移角色
Failover + ALwaysOn
我们现在在群集节点上增加节点,将第三台SQL加入该节点
Failover + ALwaysOn
输入新节点的名称
Failover + ALwaysOn
验证通过
Failover + ALwaysOn
测试通过后,直接增加节点
Failover + ALwaysOn
节点增加完成
Failover + ALwaysOn
我们再次查看节点信息
Failover + ALwaysOn
我们接着安装独立SQL实例
Failover + ALwaysOn
我们安装功能角色
Failover + ALwaysOn
必须要命名一个实例,因为已经在集群中创建了一个默认实例;如果你已在群集中装了一个SQL群集实例,则再在群集中的节点上安装SQL实例时(无论单机
还是群集的),不能再使用这个实例名称。也就是说你已经在群集节点1、2上装了群集的SQL
默认实例的话,则在节点3上也不能再安装单机的SQL默认实例。这种情况下可以选择在节点
上3安装一个SQL命名实例,
Failover + ALwaysOn
定义账户信息
Failover + ALwaysOn
服务器配置信息
Failover + ALwaysOn
数据目录我们定义到本地即可
Failover + ALwaysOn
安装完成
Failover + ALwaysOn
节点三安装完后,我们发现服务没有端口,默认额SQL 端口是1433,所以我们修改默认端口---SQL Server配置管理中
Failover + ALwaysOn
Failover + ALwaysOn




SQL Server 2016 Failover Cluster+ ALwaysOn(三)
我们前面两篇文章介绍了SQL Server 2016 Failover Cluster的配置,同时又介绍配置新增AlwaysOn节点的先前条件,今天我们主要介绍Always的详细配置。我们前面已经提到了,如果要实现SQL Server 2016 Failover Cluster+ ALwaysOn,SQL Server Failover Cluster两个节点或者多个节点安装一个SQL 实例,然后ALwaysOn也需要安装一个单独的实例,虽然AlwaysOn节点必须要加入Faillover Cluster中,但是要创建AlwaysOn必须要它和之前的SQL群集实例之间创建AlwaysOn可用性组关系。另外AlwaysOn功能的开启是在实例级设置的,这里一共有2个SQL实例,所以就需要对这2个SQL实例分别进行设置。对于SQL群集实例,在其任一所有者节点上使用SQL Server configuration manager设置一次就可以了(重启SQL服务后生效)。
我们还是继续回顾上面的架构图
SCHEMA
接下来我们配置ALwaysOn High Availability,我们发现提示错误,但是有引导我们如何配置
Failover + ALwaysOn
我们通过SSMS右击--AlwayOn High Avaliablity 会有一个提示,意思是必须为服务器实例启用AlwaysOn功能,之后才能在此实例上创建可用性组,若要启用AlowaysOn,请打开SQL Server配置管理器,右键单击SQL Server实例名称,选择属性,然后使用SQL Server属性对话框的AlwaysOn高可用性选项卡,我们链接集群地址,点击ALways High Availability,提示我们开启的方法了
注意:我们使用SSMS连接到SQL Server后,在服务器属性对话框中,单击一般页面。 的HADR启用属性
显示下列值之一:真正的如果启用了总是在可用性组织;假,如果总是在可用性组是禁用的。
Failover + ALwaysOn
所以我们要开启功能
Failover + ALwaysOn
SQL Server服务---属性--右击
Failover + ALwaysOn
我们将SQL Server服务的登录账户换成域账户
Failover + ALwaysOn
我们勾选启用AlwayOn可用性组
Failover + ALwaysOn
应用--确认后,需要重启数据库服务
Failover + ALwaysOn
正在重启服务
Failover + ALwaysOn
第二台服务器的AlwaysOn当节点切换到节点2的时候,发先是自动勾选的;所以不用勾选;另外当角色不在操作的节点的时候,我们就会发现LWAYSON高可用无法操作;属于正常现
象;我们可以通过系统提示的信息就会知道
Failover + ALwaysOn
我们再次查看角色的状态:以下状态属于正常现象,原因是由于启用了ALwaysOn高可用
Failover + ALwaysOn
这种情况下可以选择在节点上3安装一个SQL命名实例,然后在它和之前的SQL群集实例之间创建AlwaysOn可用性组关系。
另外AlwaysOn功能的开启是在实例级设置的,这里你一共有2个SQL实例,所以就需要对这2个SQL实例分别进行设置。对于SQL群集实例,在其任一所有者节点上使用SQL Server
configuration manager设置一次就可以了(重启SQL服务后生效)。
我们同样先将节点三的ALwaysOn高可用性功能打开
Failover + ALwaysOn
我们用SSMS链接实例
Failover + ALwaysOn
我们都知道高可用性是基于DB的,所以我们需要创建数据库:HAGourpDB1
Failover + ALwaysOn
同时创建一张表,perinfo
Failover + ALwaysOn
我们插入数据
Failover + ALwaysOn
我们开始在集群实例下创建高可用性组
Failover + ALwaysOn
勾选数据库层运行状态检测,定义高可用性组的名称:HA-GP1
Failover + ALwaysOn
提示需要首先完整备份
Failover + ALwaysOn
所以我们先备份一下
Failover + ALwaysOn
完整备份及备份类型
Failover + ALwaysOn
备份完成
Failover + ALwaysOn
我们同样备份Log
Failover + ALwaysOn
我们需要将备份的数据库和log在三节点还原一次
Failover + ALwaysOn
恢复状态:RESTORE WITH NORECOVERY
Failover + ALwaysOn
恢复完成
Failover + ALwaysOn
数据库状态未还原模式
Failover + ALwaysOn
恢复事务log
Failover + ALwaysOn
同样选择恢复状态
Failover + ALwaysOn
恢复完成
Failover + ALwaysOn
我们继续创建高可用性组,满足条件继续下一步
Failover + ALwaysOn
我们增加副本
Failover + ALwaysOn
无论是主副本或者辅助副本都选择同步提交模式,辅助副本的Readable Secondary选择为Yes。只是为了后面的只读辅助数据库准备。
Failover + ALwaysOn
AlwaysOn和镜像一样都采用Endpoint(端点)来进行数据传输。AlwaysOn使用端点是为了和辅助副本进行日志传输和心跳线的通信
Failover + ALwaysOn
备份优先级勾选Prefer Secondary。意思是有限考虑辅助副本上做数据备份。只有在没有辅助副本的情况下才使用主副本。把辅助副本的优先级别调为100,而主副本50。
Failover + ALwaysOn
我们监听端口稍后创建
Failover + ALwaysOn
确认即可---yes
Failover + ALwaysOn
这个地方是选择初始化数据库的方式。如果你选择Full,你需要提供一个共享地址,AlwaysOn自己自动备份数据库然后还原到目标的辅助副本上。这里我们选择Join only,所以
我们需要事先把数据库备份并还原到目标的辅助数据库上----Join only
Failover + ALwaysOn
开始下一步后,我们查看状态
Failover + ALwaysOn
创建完成
Failover + ALwaysOn
Failover + ALwaysOn
我们展开数据库高可用性组
Failover + ALwaysOn
我们查看角色会多出一个高可用性组角色
Failover + ALwaysOn
我们接着创建一个监听
AlwaysOn创建后,客户端就需要进行连接,为了让应用程序能够透明地连接到主副本而不受故障故障转移的影响,我们需要创建一个侦听器,侦听器就是一个虚拟的网络名称,可以通过这个虚拟网络名称访问可用性组,而不用关心连接的是哪一个节点,它会自动将请求转发到主节点,当主节点发生故障后,辅助节点会变为主节点,侦听器也会自动去侦听主节点。
一个侦听器包括虚拟IP地址、虚拟网络名称、端口号三个元素,一旦创建成功,虚拟网络名称会注册到DNS中,同时为可用性组资源添加IP地址资源和网络名称资源。用户就可以使用此名称来连接到可用性组中。与故障转移群集不同,除了使用虚拟网络名称之外,主副本的真实实例名还可以被用来连接。
SQL Server2012早期版本的SQL Server只有在实例启动的时候地会尝试绑定IP和端口,但是SQL Server2012却允许在副本实例处于运行状况的时候随时绑定新的IP地址、网络名称和端口号。因此可以为随时为为可用性组添加侦听器,而且这个操作会立即生效。当添加了侦听器之后,在SQL Server的错误日志中可以看到类似:在虚拟网络名称上停止和启动侦听器的消息。
要注意的是,SQLBrowser服务是不支持Listener的。这是因为应用程序在使用Listener的虚拟网络名连接SQLServer时,是以一个默认实例的形式进行访问的(只有主机名,没有实例名),因此客户端根本就不会去尝试使用SQLBrowser服务。
Failover + ALwaysOn
定义监听名称及IP
名称:HA-LST;
IP地址:192.168.5.48;
Port为1433
Failover + ALwaysOn
定义完成
Failover + ALwaysOn
我们在查看角色,就会发现有对应的管理地址了
Failover + ALwaysOn
定义完成后,我们可以查看高可用行组的显示面板
Failover + ALwaysOn
我们可以通过显示面板查看高可用性组的状态
Failover + ALwaysOn
接下来我们切换一下;切换前我们需要注意一个问题:切换的时候不能在集群管理器里面切换,需要在高可用性组下切换,不然会有问题,就算切换成功了,有些数据也会出现问题
我们首先在集群管理器里面查看节点所有者
Failover + ALwaysOn
另外我们连接到群集节点后,发现高可用性组下的可用性副本的节点属于辅助节点;
Failover + ALwaysOn
接下来我们准备开始切换,我们使用SSMS连接到第三个节点实例
查看当前可用性组下在第三个节点处于辅助副本状态
Failover + ALwaysOn
我们开始切换
Failover + ALwaysOn
选择主副本
Failover + ALwaysOn
确认信息
Failover + ALwaysOn
转移完成
Failover + ALwaysOn
我们再查看AO1第三节点的AG状态就成了主副本了
Failover + ALwaysOn
我们再从主切换到备
Failover + ALwaysOn
选择新的主副本
Failover + ALwaysOn
链接副本
Failover + ALwaysOn
开始连接
Failover + ALwaysOn
链接成功
Failover + ALwaysOn
确认转移信息
Failover + ALwaysOn
转移完成
Failover + ALwaysOn
我们从SQLCLUSTER上插入一条数据
Failover + ALwaysOn
然后从AO1上查看数据
Failover + ALwaysOn
我们从AO1上插入数据提示,数据库为只读,所以无法插入数据
Failover + ALwaysOn
原因是由于当前节点属于第二节点,如果可读可写的话,需要将该节点转移到主副本节点才可以
Failover + ALwaysOn
我们将AO1\ALWAYON下的AG下的HA-GP1从从副本转移到主副本我们再次插入数据
Failover + ALwaysOn
转移完成
Failover + ALwaysOn
Failover + ALwaysOn
我们再次尝试插入数据
Failover + ALwaysOn
我们从SQLCLUSTER集群节点查看数据是否同步
Failover + ALwaysOn
我们再次到SQLCLUSTER节点插入数据,提示错误
原因是节点属于AO1
Failover + ALwaysOn
但是我们查看数据,从当前节点从AO1插入的数据依然可以同步到SQLCLUSTER
Failover + ALwaysOn
各副本间的数据同步
AlwaysOn必须要维护各副本间的数据一致性,当主副本上的数据发生变化,会同步到辅助副本上。这里AlwaysOn通过三个步骤来完成:
步骤1:主副本记录发生变化的数据;
步骤2:将记录传输到各个辅助副本;
步骤3:把数据变化操作在辅助副本上执行一遍。
具体实现如下:
在主副本和辅助副本上,SQL Server都会启动相应的线程来完成相应的任务。对于一般的SQL Server服务器,即没有配置高可用性,会运行Log Writer的线程,当发生数据修改事务时,此线程负责将本次操对应的日志信息记录到日志缓冲区中,然后再写入到物理日志文件。但如果配置了AlwaysOny主副本的数据库,SQL Server会为它建立一个叫Log Scanner的线程,不间断的工作,负责将日志从日志缓冲区或日志文件里读出,打包成日志块,发送到辅助副本。因此可以保证发生的数据变化,不断送给各辅助副本。
辅助副本上存在固化和重做两个线程完成数据更新操作,固化线程会将主副本Log Scanner所发过来的日志块写入辅助副本磁盘上的日志文件里,因此称为固化,然后重做线程负责从磁盘上读取日志块,将日志记录对应的操作重演一遍,此时主副本和辅助副本上的数据就一致了。重做线程每隔固定的时间点,会跟主副本通信,告知自己的工作进度。主副本由此知道两边数据的差距。Log Scanner负责传送日志块,不需要等待Log Writer完成日志固化;辅助副本完成日志固化以后就会发送消息到主副本,告知数据传输完成,而不需要等待重做完成,这样各自独立的设计,是尽可能减少 AlwaysOn所带来的操作对数据库性能的影响。



SQL Server 2016 ALwaysOn 增多个客户端访问点(侦听器)

我们前面3片文章介绍了SQL Server 2016 Failover Cluster+ ALwaysOn的完整配置,今天我们介绍一下如果给ALwaysOn增加多个客户端访问点,常规情况下,每个可用性组只有一个单独的可用性组侦听器(Listener),但是在某些极端情况下可能会对相同的可用性组创建多个侦听器。比如一些历史遗留问题。此时可能需要创建一个额外的侦听器用于硬编码。
但是,通过图形化界面(SSMS)、T-SQL甚至PowerShell都不能创建第二个侦听器,必须使用Failover Cluster Manager来实现。我们在我们的“SQLAG”角色内创建一个客户端接入点(Client Access Point)资源。按下面步骤:
我们打开故障转移群集管理器----角色---选择AG---增加资源--客户端访问点
Failover Cluster+ ALwaysOn
我们就可以定义客户端访问点名称及对应的访问点IP
Failover Cluster+ ALwaysOn
确认信息
Failover Cluster+ ALwaysOn
增加完成
Failover Cluster+ ALwaysOn
此时我们就可以在角色---AG下看见两个访问名称及IP地址
Failover Cluster+ ALwaysOn
状态是部分运行中
Failover Cluster+ ALwaysOn
我们资源---发现刚才新增加的是脱机状态
Failover Cluster+ ALwaysOn
此时我们右键新的客户端访问点并选择属性:
Failover Cluster+ ALwaysOn
依赖关系
Failover Cluster+ ALwaysOn
选择之前的监听器
Failover Cluster+ ALwaysOn
我们右击联机即可
Failover Cluster+ ALwaysOn
联机后,我们用这两个监听器地址都可以链接管理的

Failover Cluster+ ALwaysOn





SQL Server 2016 Failover +AlwaysOn 增加数据库到可用性组

SQL Server Failover +AlwaysOn 增加数据库到可用性组
前面几篇文章都已经详细介绍了SQL Server Failover +AlwaysOn 的配置,今天我们主要介绍SQL Server Failover Cluster+AlwaysOn下 增加数据库到可用性组
我们首先需要创建一个数据库及表
Failover  +AlwaysOn
数据库名称
HAGroupDB2
Failover  +AlwaysOn
创建表
Failover  +AlwaysOn
给表插入数据
Failover  +AlwaysOn
我们把这个数据库增加到高可用性组中;当前新建的数据库没有同步
Failover  +AlwaysOn
我们再高可用性组下增加数据库
Failover  +AlwaysOn
提示需要我们完整备份一下
Failover  +AlwaysOn
所以我们备份
Failover  +AlwaysOn
我们同时也备份事务日志
Failover  +AlwaysOn
备份完成后,我们换需要将备份的数据库和事物log在节点3上进行还原
Failover  +AlwaysOn
还原数据库
Failover  +AlwaysOn
还原时候,选项中必须选择还原状态:RESTORE WITH NORECOVERY
Failover  +AlwaysOn
数据库还原完成
Failover  +AlwaysOn
我们查看还原状态
Failover  +AlwaysOn
再还原事物日志
Failover  +AlwaysOn
Failover  +AlwaysOn
还原选项---我们选择第二个选项---RESOTRE WITH NORECOVERY
Failover  +AlwaysOn
还原完成
Failover  +AlwaysOn
我们还原了数据库和事务日志后,数据库的状态未正在还原状态
Failover  +AlwaysOn
接下来我们就开始增加数据库到AG中了
Failover  +AlwaysOn
我们选择Join only
Failover  +AlwaysOn
我们链接已存在的副本服务器
Failover  +AlwaysOn
连接成功
Failover  +AlwaysOn
加入成功
Failover  +AlwaysOn
我们查看AG中的数据库信息
Failover  +AlwaysOn
查看集群数据库的状态,也成为了已同步
Failover  +AlwaysOn
Failover  +AlwaysOn
我们查看面板,一切正常
Failover  +AlwaysOn
综合上面的操作,我们可以使用powershell来完成

$DatabaseBackupFile = "\\share\backups\MyDatabase.bak"  
$LogBackupFile = "\\share\backups\MyDatabase.trn"  
$MyAgPrimaryPath = "SQLSERVER:\SQL\PrimaryServer\InstanceName\AvailabilityGroups\MyAg"  
$MyAgSecondaryPath = "SQLSERVER:\SQL\SecondaryServer\InstanceName\AvailabilityGroups\MyAg"  

Backup-SqlDatabase -Database "MyDatabase" -BackupFile $DatabaseBackupFile -ServerInstance "PrimaryServer\InstanceName"  
Backup-SqlDatabase -Database "MyDatabase" -BackupFile $LogBackupFile -ServerInstance "PrimaryServer\InstanceName" -BackupAction 'Log'  

Restore-SqlDatabase -Database "MyDatabase" -BackupFile $DatabaseBackupFile -ServerInstance "SecondaryServer\InstanceName" -NoRecovery  
Restore-SqlDatabase -Database "MyDatabase" -BackupFile $LogBackupFile -ServerInstance "SecondaryServer\InstanceName" -RestoreAction 'Log' -NoRecovery  

Add-SqlAvailabilityDatabase -Path $MyAgPrimaryPath -Database "MyDatabase"  
Add-SqlAvailabilityDatabase -Path $MyAgSecondaryPath -Database "MyDatabase"  

推荐阅读