SQL Server 在2017開始支援Linux,在高可用性部份有支援HA(High Availablity),AG(Availabity Group),本文為紀錄HA容錯移轉叢集的實際設定過程。
SQL Server 2017的HA官方文件請參考https://docs.microsoft.com/zh-tw/sql/linux/sql-server-linux-shared-disk-cluster-configure
以往在Windows平台設定SQL HA不難,但在Linux平台沒有AD要怎麼設定呢?答案是透過第3方套件Pacemaker、Corosync 等進行叢集的協調通訊事宜
整個設定過程分為6大步驟
1.安裝及設定 Linux
於是我在Azure上建了3台Red Hat 7.4的虛擬機器分別是sql2017-1、sql2017-2(叢集的2台SQL主要及次要端)及sql2017-nfs(共享磁碟)
2.安裝及設定 SQL Server
安裝部份請參閱前一篇SQL Server 2017 on Linux自動安裝
安裝好後開始設定,首先要在次要節點停掉並禁用SQL Server服務
sudo systemctl stop mssql-server
sudo systemctl disable mssql-server
從主要端將加密金鑰複製至次要端(因為在Linux,都是呼叫 mssql 本機帳戶執行 SQL Server。 因為它是本機帳戶,其識別身分不被共用在節點之間。 因此,要複製的加密金鑰從主要節點,到每個次要節點讓每個本機 mssql 帳戶可以存取它來解密 Server 主要金鑰)
次要端備份原来的machine-key
sudo su
cd /var/opt/mssql/secrets
mv machine-key machine-key.original.bak
主要端把machine-key透過scp複製到次要端
sudo su
cd /var/opt/mssql/secrets/
scp machine-key root@**<Secondary Node IP Address>**:/var/opt/mssql/secrets/
因為複製過來的權限為root需要變更為msssql
chown mssql:mssql machine-key
主要端,為 Pacemaker 建立 SQL server 登入並授與登入執行的權限
sudo systemctl start mssql-server
sqlcmd -S localhost -U sa -P **<Your Password>**
USE [master]
GO
CREATE LOGIN [<loginName>] with PASSWORD= N'<loginPassword>'
ALTER SERVER ROLE [sysadmin] ADD MEMBER [<loginName>]
我是建一個pacemaker的帳號,並給予sysadmin的權限
在主要端停掉並禁用SQL Server服務
sudo systemctl stop mssql-server
sudo systemctl disable mssql-server
3.設定主機檔案,開啟/etc/hosts檔案將2個節點ip都加入,可以透過以下指令查詢主機ip
sudo ip addr show
4.設定共用存放裝置,並移動資料庫檔案
官方文件提供了3種儲存類型存放裝置的設定文件(共享磁碟),本篇以NFS為主
連線至剛剛建立的sql2017-nfs上安裝nfs
sudo yum -y install nfs-utils
啟用rpcbind服務
sudo systemctl enable rpcbind && systemctl start rpcbind
啟用nfs-server服務
sudo systemctl enable nfs-server && systemctl start nfs-server
修改 /etc/exports設定共享資料夾
建立共享資料夾,確認擁有完整權限 (777)
mkdir /mnt/nfs
chmod 777 /mnt/nfs
檢查設定是否成功
sudo exportfs -rav
sudo showmount -e
若出現錯誤訊息例如clnt_create: RPC: Program not registered請重啟服務
systemctl restart rpcbind.service
systemctl restart nfs.service
設定異常配置
sudo setsebool -P nfs_export_all_rw 1
設定防火牆結束NSF Server的設定
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload
回到主要及次要端,安裝NFS軟體
sudo yum -y install nfs-utils
設定防火牆
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload
確認是否可以看到NFS Server
sudo showmount -e **<IP OF NFS SERVER>**
接下來要掛載NFS並將SQL檔案複製過去,可以選擇主要或次要端任一台,這裡選主要端進行
再次確認已停用主要端的SQL
sudo systemctl stop mssql-server
sudo systemctl status mssql-server
由root切換至mssql並建立暫存目錄
su mssql
mkdir /var/opt/mssql/tmp
將SQL檔案複製至暫存目錄
cp /var/opt/mssql/data/* <TempDir>
檢查是否複製成功
ls TempDir
刪除SQL檔案
rm /var/opt/mssql/data/* -f
切換至root並掛載nfs
exit
mount -t nfs4 <IPAddressOfNFSServer>:<FolderOnNFSServer> /var/opt/mssql/data -o nfsvers=4.2,timeo=14,intr
檢查是否成功
mount
為了重開機後仍會自動掛載,請修改/etc/fstab
<IP OF NFS SERVER>:<shared_storage_path> <database_files_directory_path> nfs4 nfsvers=4.2,timeo=14,intr
修改後執行
mount -a
再切換至mssql將之前暫存的SQL檔案複製至掛載的目錄
su mssql
cp /var/opt/mssql/tmp/* /var/opt/mssql/data/
rm /var/opt/mssql/tmp/* -f
檢查檔案是否有複製成功
ls /var/opt/mssql/data
回到root啟動mssql
exit
sudo systemctl start mssql-server
sudo systemctl status mssql-server
透過sqlcmd檢查SQL是否正常運作
確認成功後停止主要端SQL
sudo systemctl stop mssql-server
sudo systemctl status mssql-server
之後在次要端重複剛剛的步驟
sudo systemctl stop mssql-server
sudo systemctl status mssql-server
su mssql
rm /var/opt/mssql/data/* -f
mount -t nfs4 <IPAddressOfNFSServer>:<FolderOnNFSServer> /var/opt/mssql/data -o nfsvers=4.2,timeo=14,intr
exit
sudo systemctl start mssql-server
sudo systemctl status mssql-server
確認成功後停止次要端SQL
sudo systemctl stop mssql-server
sudo systemctl status mssql-server
未完待續.....