SQL Server AlwaysOn部署

SQL Server AlwaysOn部署

杜飞

经过几天理论的学习,今天准备通过动手实践的方式把整个AlwaysOn的部署再梳理一遍,环境如下:

步骤1:域环境准备,安装域控,各节点加入到域中。此步骤在此直接略过,不再详细介绍。

步骤2:在节点上安装SQL Server 2012,注意是单实例安装,而不是创建群集

步骤3:创建Windows Server 的故障转移群集。

步骤4:启用AlwaysOn可用性组。

步骤5:配置AlwaysOn可用性组。

   为了节省时间,突出关键内容,步骤1和步骤2,我们就不再详细介绍了。只是在步骤2中,一定要注意,选择“全新SQL Server独立安装或向现有安装添加功能”,而不是创建SQL Server群集。其实就是普通的全新安装即可。

创建Windows Server故障转移群集

首先,需要对群集节点进行验证,以查看群集的基本环境是否满足。

验证通过之后,创建群集,指定Windows群集名称和群集IP地址,如下图所示:

连续下一步之后就等待群集创建吧。

接下来,可以根据需要对群集进行基本设置并且进行切换测试,在此我就直接默认了。下面才是今天的主要内容。

创建AlwaysOn可用性组

1. 启用AlwaysOn功能

在创建AlwaysOn可用性组之前,需要在SQL Server配置管理器中,打开SQL Server服务—SQL Server属性,启用AlwaysOn可用性组,但需要重新启动服务。如下图所示。

注意:此操作在每一个节点上都要进行。

2. 创建可用性组:使用SSMS连接到节点1上,在“可用性组”上右键属性---“新建可用性组向导”。

首先出现,新建可用性组的条件,例如:指定一个名称(AG01);选择此实例上的一个或多个用户数据库(我刚刚偷偷创建了两个测试库DB01和DB02,并且各创建一张表插入一条记录);指定辅助副本的实例(当然是SQL02);指定侦听器(AG01-Listener);初始数据同步选项(同步提交),好吧,准备开始吧。

在此操作前,先准备测试库,并进行备份,如下图所示:

接下来指定可用性组的名称,在此我使用AG01,如下图所示:

下一步之后,选择可用性组上的用户数据库,如下图所示:

但数据库必须满足以下条件:只能是用户数据库,系统数据库不行,数据库可以读写,只读数据库不行;数据库必须处理于多用户模式,单用户模式不行;数据恢复模式必须是完全模式并且做过完整备份;没有配置数据库镜像;不属于其他可用性组。

接下来,指定辅助副本的SQL Server实例,在此把所有的可用性副本都加进来,当然我们现在只剩下SQL02了,果断加入。

端点:切换到端点选项卡中,可以看到系统已经为每个副本创建了一个端点,这和数据库镜像中的端点格式是一样的,端口号也是5022。每个可用性副本的服务账户都需要具有对其他副本上端点的connect权限。端点的主要作用包括:主副本和辅助副本之间通过端点传送日志块和消息,实现数据同步;主副本和辅助副本之间通过商战互相发送ping来确定彼此是否互通。

如果有多块网卡的,取决于DNS将服务器的域名解析成哪一个IP地址则使用哪一块网卡。

备份首选项:考虑到性能问题,如果在主副本上进行备份可能会给I/0和CPU带来一定压力。可以将备份工作放到辅助服务器上完成,数据是几乎一样的。辅助副本上可以执行完整备份和日志备份,但是不支持差异备份。AlwaysOn允许管理员设置备份在哪一个副本上执行,原理是:AlwaysOn引入了一个函数:sys.fn_hadr_backup_is_preferred_replica。在TSQL脚本里运行这个函数,可以判断出当前运行的这个副本是否是希望做备份的那个副本。

备份作业脚本的典型代码如下:

if  (not select sys.fn_hadr_backup_is_preferred_replica(@DBNAME))

BEGIN

     select ‘此副本不是备份首选副本,脚本退出’

     Return 0

END

BACKUP DATABASE @DBNAME TO 备份目标

这样管理员可以在所有副本上都创建相同的备份作业,只是在备份作业的脚本里调用select sys.fn_hadr_backup_is_preferred_replica(‘副本名‘),确定当前副本是否为首选的备份副本,如果是则返回值为1,继续执行备份作业,否则返回值为0,退出脚本。这样即使同一时间多个副本都运行备份作业,也只有一个作业真正备份。select sys.fn_hadr_backup_is_preferred_replica的函数值是由备份首选项上的设置决定的。

首选辅助副本:在辅助副本上运行备份,如果辅助副本不可用,则在主副本上执行备份。

仅辅助副本:在辅助副本上运行备份,如果辅助副本不可用,则不执行备份。

主副本:备份只在主副本上进行。

任意副本:在备份时会忽略可用性副本的角色。但会根据备份优先级、同步状态及连接状态来决定使用哪个副本备份。

备份优先级:1最低,100最高,如果设置相同,则比较同步状态及连接状态。

排除副本:如果哪一个副本不希望它参与备份,就排除。

下面,看一下侦听器选项卡:

侦听器:在此,可以选择是否要为可用性组创建一个Listener。可以现在创建,也可以后面再添加。其实就是虚拟网络名称,如下图所示:

数据同步首选项:目的是在其他副本上如何初始化可用性组中的数据库,有三个选项,如下图所示:

完整:要求提供一个当前服务器上的共享目录,向导自动对数据库做一个完整备份和日志备份并将备份文件存放到这个目录。其他副本通过这个共享目录获得数据库备份并还原。这里需要注意的是每个副本的服务账户对共享目录和本地目录有读写权限。并且数据库文件路径各辅助副本上也存在。那么,作为演示,我就直接使用完整方式了。但在生产环境中,考虑到时间问题,建议使用仅联接。

仅联接:这个选项用于已经手动在各个辅助副本上还原了数据库。可以直接将辅助副本加到可用性组中。以减少初始化数据库的时间,还可以自定义辅助副本上数据库文件的路径

跳过初始化数据同步:在此不进行初始数据同步操作,以后在主副本上对数据库进行完整备份和日志备份并还原到所有辅助副本,并将辅助副本加入到可用性组中。

建议:最好还是让主数据库和辅助数据库路径保持一致,以后为主数据库添加一个文件时,辅助数据库也会将文件添加在相同的路径。

最后一步,对各种配置进行验证,以确保之前的配置都符合要求,如下图所示:

然后,下一步之后,点击完成,直到出现下图所示:

可用性组创建完成后,我们可以在多个地方看到可用性组的信息:

1. 在SSMS中可以看到所创建的可用性组的信息,在辅助副本上也可以看到相应的信息。如下图所示:

2. 可以通过Windows群集管理器查看到可用性组的资源组信息,如下图所示:

在此界面中可以看到可用性组的名称AG01已经作为一个角色(资源组)出现了,包括侦听器的名称(AG01-Listener),IP地址(10.200.1.203)。

备份目录下会自动生成备份文件,供辅助副本读取并还原:

在此,我们使用SQL Server Manager Studio连接一下,服务器名称中输入侦听器的名字:

在生产环境中,此时就要进行各种切换测试了,如手动切换、插拔网线、服务器重启等。

下面,咱们看一下只读路由的配置:

步骤1:配置辅助副本接受只读连接

   在创建可用性组就可以为每个副本设置其作为辅助副本时的连接访问类型,但当时我们选择的是否,如下图所示:

否:辅助数据库不接受任何类型的数据访问,这也是默认值

只读:当连接字符器中的applicationintent属性被设置为ReadOnly时,能被访问。

是:任何连接都可以连接到辅助数据库,但是只能读请求才能够成功,尝试写操作都会失败。这个选项主要用于无法使用applicationintent关键字的客户端。

下面,我们就将两个副本在辅助角色时设置为接受只读连接,如下图所示:

我们使用SSMS来以只读方式连接到SQL02上进行测试:

连接成功后,我们去查询DB01中的T1表,如下图所示:

成功了,现在以只读方式连接到了到辅助副本,但这是以真实实例的方式连接上来的,如果SQL02实例损坏,无法连接怎么办?也就是说它不会发生重定向。所以,我们希望此连接还能够连接到其他副本上,那这就要用到只读路由。

步骤2:为可用性副本配置只读路由

    包括为每个副本配置一个只读路由URL;为每个副本设置其作为主副本时的只读路由列表。也就是说这两个操作每个副本上都要操作。在此,我们有两个副本。因此我们的操作如下:

在任意一个节点上操作,我在此就在SQL01上执行以下命令:

Alter  AvailabiLity Group [AG01]    
MODIFY REPLICA ON ‘SQL01‘ WITH    
(SECONDARY_ROLE(ALLOW_CONNECTIONS=READ_ONLY))    
--定义此副本作为辅助副本时接受只读连接

Alter   Availability Group [AG01]  
MODIFY REPLICA ON ‘SQL01‘ WITH    
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL=‘TCP://SQL01.ZYQ.COM:1433‘));    
--定义此副本作为辅助副本时只读URL

Alter  AvailabiLity Group [AG01]    
MODIFY REPLICA ON ‘SQL02‘ WITH    
(SECONDARY_ROLE(ALLOW_CONNECTIONS=READ_ONLY))    
--定义此副本作为辅助副本时接受只读连接

Alter   Availability Group [AG01]  
MODIFY REPLICA ON ‘SQL02‘ WITH    
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL=‘TCP://SQL02.ZYQ.COM:1433‘));    
--定义此副本作为辅助副本时只读URL

ALTER AVAILABILITY GROUP [AG01]  
MODIFY REPLICA ON ‘SQL01‘ WITH    
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(‘SQL02‘,‘SQL01‘)))    
--定义此副本作为主副本时只读路由

ALTER AVAILABILITY GROUP [AG01]  
MODIFY REPLICA ON ‘SQL02‘ WITH    
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(‘SQL01‘,‘SQL02‘)))    

如下图所示:

OK,到此就配置结束。客户端再次连接时在字符串中指定Applicationintent=ReadOnly,同时用侦听器来连接到可用性组,如果是读写操作则主副本处理,如果是读意向的操作,则主副本会检查路由列表送到第一个辅助副本上,如果第一个辅助副本不可用,则依次重定向到列表中的下一个节点。

本文出自 “杜飞” 博客,请务必保留此出处http://dufei.blog.51cto.com/382644/1386690

SQL Server AlwaysOn部署,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。