下麵簡單介紹一下如何在Red Hat Enterprise Linux上一步一步創建一個SQL Server AG(Always On Availability Group),以及配置過程中遇到的坑的填充方法。 之前發表過一篇類似的文章是Configure Always On Availabilit ...
下麵簡單介紹一下如何在Red Hat Enterprise Linux上一步一步創建一個SQL Server AG(Always On Availability Group),以及配置過程中遇到的坑的填充方法。
之前發表過一篇類似的文章是Configure Always On Availability Group for SQL Server on Ubuntu——Ubuntu上配置SQL Server Always On Availability Group,有對Ubuntu感興趣的請看那一篇。
目前在Linux上可以搭建兩種類型的SQL Server AG,一種是高可用性的結構同時使用Cluster伺服器提供業務連續性。這種結構包括read-scale節點。接下來就會介紹這種AG的搭建方法。另外一種是沒有Cluster服務的read-scale AG,這種結構僅僅提供只讀的可擴展性,不提供高可用性功能。關於如何創建這種簡單的AG請參考:Configure read-scale availability group for SQL Server on Linux。
另外在CREATE AVAILABILITY GROUP時可以指定CLUSTER TYPE:
- WSFC:Windows server failover cluster。這個是Windows系統上的預設值;
- EXTERNAL:非Windows server上的failover cluster,比如Linux上的Pacemaker;
- NONE:不包含cluster manager,指的是創建read-scale類型的Availability Group。
其中Linux可以使用EXTERNAL或NONE,我理解的是EXTENRAL功能就是類似目前SQL Server中的AG,NONE則是一種新類型,沒有Cluster功能的不支持高可用性和災難恢復的AG。主要作用是分擔主伺服器的負載,支持多個只讀備用節點,同時這種類型也支持Windows上使用,是SQL Server 2017新支持的功能。更多詳細的信息請參考這裡:Read-scale availability groups。
接下來進入主題主要介紹一下高可用性結構的Availability Group的搭建方法。
1. 安裝及配置SQL Server
一個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。
2. 創建AG
在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。
- 創建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;
- 把Secondary節點加到AG中命令:
ALTER AVAILABILITY GROUP [RHELAG] JOIN WITH (CLUSTER_TYPE = NONE); ALTER AVAILABILITY GROUP [RHELAG] GRANT CREATE ANY DATABASE;
Note:這時的AG是沒有Listener的,目前版本也暫時無法創建Listener。
3. 配置一個集群資源管理器,如Pacemaker
具體步驟如下:
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>
4. 添加AG到Cluster集群中
具體步驟如下:
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加入到Cluster中作為一個資源的時候,就不能再使用TSQL去failover AG了。SQL Server服務端是不知道Cluster的存在的,整個系統是通過Linux Cluster來控制的,在Ubuntu和RHEL中用pcs命令,在SLES中用crm命令。
- 全部配置完成後,可以使用虛擬IP去訪問整個AG,這時可以在DNS中手動註冊一個Listener名字指向這個虛擬IP,就可以當成Windows中的AG Listener使用了。
- SQL Server 2017 CTP 1.4中新引入了一個sequence_number的概念防止數據丟失,詳細參考Understand SQL Server resource agent for pacemaker(https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-availability-group-cluster-rhel )。
參考鏈接:
- Configure Always On availability group for SQL Server on Linux
- Configure RHEL Cluster for SQL Server Availability Group
- Configure read-scale availability group for SQL Server on Linux
- Overview of Always On Availability Groups (SQL Server)
本文主要介紹瞭如何配置AG以及如何解決配置過程中遇到的問題,關於AG的管理使用上以後再詳細介紹,如有錯誤或者介紹不夠,敬請見諒。
[原創文章,轉載請註明出處,僅供學習研究之用,如有錯誤請留言,如喜歡請推薦,謝謝支持]
[原文:http://www.cnblogs.com/lavender000/p/6946848.html,來自永遠薰薰]