SQL Server 2017 on Linux failover cluster設定(上)

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

未完待續.....