Ubuntu上配置SQL Server Always On Availability Group
下面簡單介紹一下如何在Ubuntu上一步一步創建一個SQL Server AG(Always On Availability Group),以及配置過程中遇到的坑的填充方法。
?
目前在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 Ubuntu——Ubuntu上的SQL Server(全截圖)中的介紹,安裝兩個Ubuntu機器和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?? Ubuntu1604Bob2”這行被我注釋了,否則開啟Cluster 服務的時候可能會有問題:
?
如果不注釋,ping hostname的返回結果是127.0.1.1,注釋后返回的是真正IP:
需要返回真正IP后期配置才好使。
另外可以用這個命令查看當前server的IP:
sudo ip addr showb)????? 在所有節點SQL Server上開啟Always On Availability Group功能并重啟服務:
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1sudo systemctl restart mssql-serverc)?????? 在所有節點上執行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/datascp dbm_certificate.* root@**<node2>**:/var/opt/mssql/data/Note:如果遇到Permission denied,可以使用sz和rz命令通過主機來傳輸文件。
再在目的端Secondary節點上執行如下命令給用戶mssql添加足夠的權限:
cd /var/opt/mssql/datachown 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 [UbuntuAG]WITH (DB_FAILOVER = ON, CLUSTER_TYPE = EXTERNAL) FOR REPLICA ONN'**<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 [UbuntuAG] GRANT CREATE ANY DATABASE;
Note:執行過程中可能會出現這個警告”Attempt to access non-existent or uninitialized availability group with ID”,暫時忽略即可,未來版本可能會修復。
下圖中UbuntuAG2是新創建的AG,Secondary節點還處于OFFLINE狀態:
i)??????? 把其它Secondary節點加入到AG中:
ALTER AVAILABILITY GROUP [UbuntuAG] JOIN WITH (CLUSTER_TYPE = EXTERNAL);ALTER AVAILABILITY GROUP [UbuntuAG] 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 [UbuntuAG] ADD DATABASE [db1];k)?????? 驗證:在Secondary端查看DB是否已經成功同步過去了:
SELECT * FROM sys.databases WHERE name = 'db1';GOSELECT 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 [UbuntuAG]WITH (CLUSTER_TYPE = NONE) FOR REPLICA ONN'**<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 [UbuntuAG] GRANT CREATE ANY DATABASE;
把Secondary節點加到AG中命令:
ALTER AVAILABILITY GROUP [UbuntuAG] JOIN WITH (CLUSTER_TYPE = NONE);ALTER AVAILABILITY GROUP [UbuntuAG] GRANT CREATE ANY DATABASE;Note:這時的AG是沒有Listener的,目前版本也暫時無法創建Listener。
?
3.????? 配置一個集群資源管理器,如Pacemaker
具體步驟如下:
a)?????? 在所有的Cluster節點上安裝和配置Pacemaker:
先設置防火墻允許相關端口通過(包括Pacemaker high-availability service、SQL Server Instance和Availability Group Endpoint),
sudo ufw allow 2224/tcpsudo ufw allow 3121/tcpsudo ufw allow 21064/tcpsudo ufw allow 5405/udpsudo ufw allow 1433/tcp # Replace with TDS endpointsudo ufw allow 5022/tcp # Replace with DATA_MIRRORING endpointsudo ufw reload
或者也可以直接禁用防火墻:
sudo ufw disable在所有節點上安裝Pacemaker軟件包:
sudo apt-get install pacemaker pcs fence-agents resource-agents設置Pacemaker和Corosync軟件包在安裝時創建的默認用戶的密碼,需保證所有節點上密碼一樣:
sudo passwd haclusterb)????? 啟用并開啟pcsd和Pacemaker服務:
sudo systemctl enable pcsdsudo systemctl start pcsdsudo systemctl enable pacemaker執行過程中可能出現這個錯誤”pacemaker Default-Start contains no runlevels, aborting.”,可以暫時忽略。
c)?????? 創建Cluster并啟動:
首先為了防止有Cluster的殘余配置文件影響后期搭建,可以先執行如下命令刪除已經存在的Cluster:
sudo pcs cluster destroy # On all nodessudo 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這時可能會出現這個錯誤”Job for corosync.service failed because the control process exited with error code. See "systemctl status corosync.service" and "journalctl -xe" for details.”診斷解決方法如下:
根據2-a)中的描述查看是否有問題;
使用如下命令查看配置文件中的Log路徑是什么。
查看相關文件是否存在,如不存在,則創建相關文件,假設上圖中logfile路徑為/var/log/cluster/corosync.log同時該文件還不存在,則執行如下命令,
d)????? 配置隔離:STONITH。目前測試環境為了簡單,暫時不配置了,以后會更新。正常來說生產環境需要一個fencing agent去隔離資源,關于支持信息請參考這里:Support Policies for RHEL High Availability Clusters - Virtualization Platforms。
另外我們這里先執行以下命令禁用隔離:
sudo pcs property set stonith-enabled=falsee)????? 設置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 apt-get install mssql-server-hab)????? 在所有節點上創建Pacemaker用的SQL Server登錄用戶:
USE [master]GOCREATE LOGIN [pacemakerLogin] with PASSWORD= N'<Your Password>'ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin]也可以不給sysadmin權限,給上如下足夠的權限即可:
GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::UbuntuAG TO pacemakerLoginc)?????? 在所有節點上,保存SQL Server Login的信息:
echo 'pacemakerLogin' >> ~/pacemaker-passwdecho '<Your Password>' >> ~/pacemaker-passwdsudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwdsudo chown root:root /var/opt/mssql/secrets/passwdsudo chmod 400 /var/opt/mssql/secrets/passwd # Only readable by rootd)????? 在Cluster中Primary節點上創建AG的資源:
sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=UbuntuAG --master meta notify=truee)????? 在Cluster中Primary節點上創建虛擬IP資源:
sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=**<10.2.38.204>**f)??????? 配置Cluster資源的依賴關系和啟動順序:
sudo pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Mastersudo pcs constraint order promote ag_cluster-master then start virtualipg)?????? 最后查看Cluster狀態如下:
sudo pcs status可以用虛擬IP(10.2.38.204)訪問這個AG:
?
至此,Ubuntu上的Cluster管理的SQL Server Always On Availability Group就搭建完成了。
?
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-ubuntu)。
參考鏈接:
Configure Always On availability group for SQL Server on Linux
Configure Ubuntu Cluster and Availability Group Resource
Configure read-scale availability group for SQL Server on Linux
Overview of Always On Availability Groups (SQL Server)
?
本文主要介紹了如何配置AG以及如何解決配置過程中遇到的問題,關于AG的管理使用上以后再詳細介紹,如有錯誤或者介紹不夠,敬請見諒。
相關文章
MSSQL-Scripter,一個新的生成T-SQL腳本的SQL Server命令行工具
SQL Server on Ubuntu——Ubuntu上的SQL Server(全截圖)
SQL Server on Linux 理由淺析
SQL Server 急救包(First Responder Kit)入門教程
SQL Server on Linux 理由淺析
SQLServer On Linux Package List on CentOS
SQL Server on Linux的文件和目錄結構
個性化配置你的SQL Server on Linux
SQL on Linux Run on Docker
如何使Mac Docker支持SQL on Linux容器Volume特性
原文地址:http://www.cnblogs.com/lavender000/p/6869757.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的Ubuntu上配置SQL Server Always On Availability Group的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CoreCLR源码探索(六) NullR
- 下一篇: 在Ubuntu 16.04环境下安装Do