下面简单介绍一下如何在Red Hat Enterprise Linux上一步一步建立一个SQL Server AG(Always On Availability Group),以及配置过程当中遇到的坑的填充方法。html
以前发表过一篇相似的文章是Configure Always On Availability Group for SQL Server on Ubuntu——Ubuntu上配置SQL Server Always On Availability Group,有对Ubuntu感兴趣的请看那一篇。node
目前在Linux上能够搭建两种类型的SQL Server AG,一种是高可用性的结构同时使用Cluster服务器提供业务连续性。这种结构包括read-scale节点。接下来就会介绍这种AG的搭建方法。另一种是没有Cluster服务的read-scale AG,这种结构仅仅提供只读的可扩展性,不提供高可用性功能。关于如何建立这种简单的AG请参考:Configure read-scale availability group for SQL Server on Linux。linux
另外在CREATE AVAILABILITY GROUP时能够指定CLUSTER TYPE:sql
其中Linux可使用EXTERNAL或NONE,我理解的是EXTENRAL功能就是相似目前SQL Server中的AG,NONE则是一种新类型,没有Cluster功能的不支持高可用性和灾难恢复的AG。主要做用是分担主服务器的负载,支持多个只读备用节点,同时这种类型也支持Windows上使用,是SQL Server 2017新支持的功能。更多详细的信息请参考这里:Read-scale availability groups。windows
接下来进入主题主要介绍一下高可用性结构的Availability Group的搭建方法。服务器
一个SQL AG至少有两个以上的节点,因为环境有限,这里只安装一个最简单的包含两个节点的AG。首先是按照SQL Server on Red Hat Enterprise Linux——RHEL上的SQL Server(全截图)中的介绍,安装两个RHEL机器和SQL Server。网络
Note:同一个AG的多个节点必须都是实体机或者虚拟机,当都是虚拟机的时候也必须都在同一个虚拟化平台上,缘由是因为Linux须要用fencing agent去隔离节点上的资源,不一样平台fencing agent类型是不一样的,详细参考Policies for Guest Clusters。tcp
在Linux上,必须先建立AG才能把它当成一个资源加到Cluster中进行管理。下面介绍一下如何建立AG。工具
a) 准备工做:学习
更新每个节点服务器的机器名符合这个要求:15个字符或者更少;网络上是惟一的。若是不符合要求可使用以下命令更改机器名:
sudo vi /etc/hostname
使用以下命令修改Hosts文件以保证同一个AG中多个节点能够互相通讯:
sudo vi /etc/hosts
这里必定注意:修改后能够用ping命令尝试ping hostname,必须返回对应的真正IP地址才行,也就是Hosts文件中不能包含相似hostname和127.0.0.1的对应记录,配置后以下,注意其中”127.0.1.1 RHEL73Bob3”这行被我注释了,不然开启Cluster 服务的时候可能会有问题:
若是不注释,ping hostname的返回结果是127.0.1.1,注释后返回的是真正IP:
须要返回真正IP后期配置才好使。
另外能够用这个命令查看当前server的IP:
sudo ip addr show
b) 在全部节点SQL Server上开启Always On Availability Group功能并重启服务:
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1 sudo systemctl restart mssql-server
c) 在全部节点上执行SQL语句开启AlwaysOn_health事件会话以方便诊断问题:
ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON); GO
更多关于Event Session信息能够参考:AlwaysOn Extended Events。
d) 建立db mirroring endpoint使用的用户:
CREATE LOGIN dbm_login WITH PASSWORD = '**<Your Password>**'; CREATE USER dbm_user FOR LOGIN dbm_login;
e) 建立证书:
Linux上的SQL Server Mirroring Endpoint是用证书去认证通讯的。下面的命令建立一个master key和证书并备份。链接到Primary端SQL Server并执行以下命令:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**<Master_Key_Password>**'; CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm'; BACKUP CERTIFICATE dbm_certificate TO FILE = '/var/opt/mssql/data/dbm_certificate.cer' WITH PRIVATE KEY ( FILE = '/var/opt/mssql/data/dbm_certificate.pvk', ENCRYPTION BY PASSWORD = '**<Private_Key_Password>**' );
f) 把证书的备份复制到全部的非Primary节点上,同时使用它建立证书:
先在Primary节点上执行以下命令复制证书的备份到其它节点上:
cd /var/opt/mssql/data scp dbm_certificate.* root@**<node2>**:/var/opt/mssql/data/
Note:若是遇到Permission denied,可使用sz和rz命令经过主机来传输文件。
再在目的端Secondary节点上执行以下命令给用户mssql添加足够的权限:
cd /var/opt/mssql/data chown mssql:mssql dbm_certificate.*
最后在目的端Secondary节点上利用备份的证书建立证书:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**<Master_Key_Password>**'; CREATE CERTIFICATE dbm_certificate AUTHORIZATION dbm_user FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer' WITH PRIVATE KEY ( FILE = '/var/opt/mssql/data/dbm_certificate.pvk', DECRYPTION BY PASSWORD = '**<Private_Key_Password>**' );
g) 在全部节点上建立database mirroring endpoint:
CREATE ENDPOINT [Hadr_endpoint] AS TCP (LISTENER_IP = (0.0.0.0), LISTENER_PORT = **<5022>**) FOR DATA_MIRRORING ( ROLE = ALL, AUTHENTICATION = CERTIFICATE dbm_certificate, ENCRYPTION = REQUIRED ALGORITHM AES ); ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED; GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [dbm_login];
Note:这里Listener IP暂时不能修改,只能是0.0.0.0,目前有BUG,将来可能会修复。
h) 在Primary节点上建立AG:
CREATE AVAILABILITY GROUP [RHELAG] WITH (DB_FAILOVER = ON, CLUSTER_TYPE = EXTERNAL) FOR REPLICA ON N'**<node1>**' WITH ( ENDPOINT_URL = N'tcp://**<node1>**:**<5022>**', AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, FAILOVER_MODE = EXTERNAL, SEEDING_MODE = AUTOMATIC ), N'**<node2>**' WITH ( ENDPOINT_URL = N'tcp://**<node2>**:**<5022>**', AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, FAILOVER_MODE = EXTERNAL, SEEDING_MODE = AUTOMATIC ); ALTER AVAILABILITY GROUP [RHELAG] GRANT CREATE ANY DATABASE;
Note:执行过程当中可能会出现这个警告”Attempt to access non-existent or uninitialized availability group with ID”,暂时忽略便可,将来版本可能会修复。
下图中RHELAG是新建立的AG,Secondary节点还处于OFFLINE状态:
i) 把其它Secondary节点加入到AG中:
ALTER AVAILABILITY GROUP [RHELAG] JOIN WITH (CLUSTER_TYPE = EXTERNAL); ALTER AVAILABILITY GROUP [RHELAG] GRANT CREATE ANY DATABASE;
下图为添加完节点后的状态:
j) 测试:建立一个DB并加入到刚刚建立的AG中:
CREATE DATABASE [db1]; ALTER DATABASE [db1] SET RECOVERY FULL; BACKUP DATABASE [db1] TO DISK = N'var/opt/mssql/data/db1.bak'; ALTER AVAILABILITY GROUP [RHELAG] ADD DATABASE [db1];
k) 验证:在Secondary端查看DB是否已经成功同步过去了:
SELECT * FROM sys.databases WHERE name = 'db1'; GO SELECT DB_NAME(database_id) AS 'database', synchronization_state_desc FROM sys.dm_hadr_database_replica_states;
这时,一个简单的AG就建立好了,可是它不能提供高可用性和灾难恢复功能,必须配置一个Cluster技术才能好使。若是上述h)和i)步骤的TSQL更换成如下两个,则建立出来的就是read-scale类型的AG。
CREATE AVAILABILITY GROUP [RHELAG] WITH (CLUSTER_TYPE = NONE) FOR REPLICA ON N'**<node1>**' WITH ( ENDPOINT_URL = N'tcp://**<node1>**:**<5022>**', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL) ), N'**<node2>**' WITH ( ENDPOINT_URL = N'tcp://**<node2>**:**<5022>**', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL) ); ALTER AVAILABILITY GROUP [RHELAG] GRANT CREATE ANY DATABASE;
ALTER AVAILABILITY GROUP [RHELAG] JOIN WITH (CLUSTER_TYPE = NONE); ALTER AVAILABILITY GROUP [RHELAG] GRANT CREATE ANY DATABASE;
Note:这时的AG是没有Listener的,目前版本也暂时没法建立Listener。
具体步骤以下:
a) 在全部的Cluster节点上安装和配置Pacemaker:
先设置防火墙容许相关端口经过,
sudo firewall-cmd --permanent --add-service=high-availability sudo firewall-cmd --reload
Note:若是使用其它firewall工具,须要开启以下这几个端口:
TCP: Ports 2224, 3121, 21064
UDP: Port 5405
在全部节点上安装Pacemaker软件包:
sudo yum install pacemaker pcs fence-agents-all resource-agents
设置Pacemaker和Corosync软件包在安装时建立的默认用户的密码,需保证全部节点上密码同样:
sudo passwd hacluster
b) 启用并开启pcsd和Pacemaker服务:
sudo systemctl enable pcsd sudo systemctl start pcsd sudo systemctl enable pacemaker
c) 建立Cluster并启动:
首先为了防止有Cluster的残余配置文件影响后期搭建,能够先执行以下命令删除已经存在的Cluster:
sudo pcs cluster destroy # On all nodes sudo systemctl enable pacemaker
而后建立并配置Cluster:
sudo pcs cluster auth **<nodeName1>** **<nodeName2>** -u hacluster -p **<password for hacluster>** sudo pcs cluster setup --name **<clusterName>** **<nodeName1>** **<nodeName2…>** sudo pcs cluster start --all
d) 配置隔离:STONITH。目前测试环境为了简单,暂时不配置了,这里先执行如下命令禁用隔离:
sudo pcs property set stonith-enabled=false
e) 设置start-failure-is-fatal为false:
pcs property set start-failure-is-fatal=false
默认值是true,当为true的时候,若是Cluster第一次启动资源失败,在自动Failover操做后,须要用户手动清空资源启动失败的数量记录,使用这个命令重置资源配置:
pcs resource cleanup <resourceName>
具体步骤以下:
a) 在全部节点上安装与Pacemaker集成的SQL Server资源包:
sudo yum install mssql-server-ha
b) 在全部节点上建立Pacemaker用的SQL Server登陆用户:
USE [master] GO CREATE LOGIN [pacemakerLogin] with PASSWORD= N'<Your Password>' ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin]
也能够不给sysadmin权限,给上以下足够的权限便可:
GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::RHELAG TO pacemakerLogin
c) 在全部节点上,保存SQL Server Login的信息:
echo 'pacemakerLogin' >> ~/pacemaker-passwd echo '<Your Password>' >> ~/pacemaker-passwd sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd sudo chown root:root /var/opt/mssql/secrets/passwd sudo chmod 400 /var/opt/mssql/secrets/passwd # Only readable by root
d) 在Cluster中Primary节点上建立AG的资源:
sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=RHELAG --master meta notify=true
e) 在Cluster中Primary节点上建立虚拟IP资源:
sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=**<10.2.38.202>**
f) 配置Cluster资源的依赖关系和启动顺序:
sudo pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Master sudo pcs constraint order promote ag_cluster-master then start virtualip
g) 最后查看Cluster状态以下:
sudo pcs status
能够用虚拟IP(10.2.38.202)访问这个AG:
至此,Red Hat Enterprise Linux上的Cluster管理的SQL Server Always On Availability Group就搭建完成了。
最后附一张配置了STONITH成功的截图:
Note:
参考连接:
本文主要介绍了如何配置AG以及如何解决配置过程当中遇到的问题,关于AG的管理使用上之后再详细介绍,若有错误或者介绍不够,敬请见谅。
[原创文章,转载请注明出处,仅供学习研究之用,若有错误请留言,如喜欢请推荐,谢谢支持]
[原文:http://www.cnblogs.com/lavender000/p/6946848.html,来自永远薰薰]