下面簡單介紹一下如何在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,來自永遠薰薰]