在本教學課程中,您將了解如何:
- 建立虛擬機,將它們放在可用性設定組中
- 開啟高可用性 (HA)
- 建立 Pacemaker 叢集
- 透過建立 STONITH 裝置來配置隔離代理程式
- 在 Ubuntu 上安裝 SQL Server 和 mssql-tools
- 設定 SQL Server Always On 可用性群組
- 在 Pacemaker 叢集中設定可用性群組 (AG) 資源
- 測試故障轉移和封鎖代理程式
備註
本文提到「奴隸」一詞,這是Microsoft不再使用的詞彙。 從軟體中移除字詞時,我們會將其從本文中移除。
本教學課程使用 Azure CLI 在 Azure 中部署資源。
如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶。
先決條件
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱開始使用 Azure Cloud Shell。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 如果您正在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 若要完成驗證程式,請遵循終端機中顯示的步驟。 如需其他登入選項,請參閱 使用 Azure CLI 向 Azure 進行驗證。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能的詳細資訊,請參閱 使用和管理 Azure CLI 的擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
- 本文需要 2.0.30 版或更新版本的 Azure CLI。 如果使用 Azure Cloud Shell,則已安裝最新版本。
建立資源群組
如果您有一個以上的訂用帳戶, 請將 您要部署這些資源的訂用帳戶設定為 。
使用下列命令在區域中建立資源群組 <resourceGroupName> 。 以您選擇的名稱取代 <resourceGroupName> 。 本教學使用 East US 2。 如需詳細資訊,請參閱下列 快速入門。
az group create --name <resourceGroupName> --location eastus2
建立可用性設定組
下一個步驟是建立可用性設定組。 在 Azure Cloud Shell 中執行下列命令,然後將 <resourceGroupName> 替換為您的資源組名。 為 <availabilitySetName> 選擇一個名稱。
az vm availability-set create \
--resource-group <resourceGroupName> \
--name <availabilitySetName> \
--platform-fault-domain-count 2 \
--platform-update-domain-count 2
一旦命令完成,您應該會收到下列結果:
{
"id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/availabilitySets/<availabilitySetName>",
"location": "eastus2",
"name": "<availabilitySetName>",
"platformFaultDomainCount": 2,
"platformUpdateDomainCount": 2,
"proximityPlacementGroup": null,
"resourceGroup": "<resourceGroupName>",
"sku": {
"capacity": null,
"name": "Aligned",
"tier": null
},
"statuses": null,
"tags": {},
"type": "Microsoft.Compute/availabilitySets",
"virtualMachines": []
}
建立虛擬網路和子網
建立具有預先指派IP位址範圍的具名子網。 在下列命令中取代這些值:
<resourceGroupName><vNetName><subnetName>
az network vnet create \ --resource-group <resourceGroupName> \ --name <vNetName> \ --address-prefix 10.1.0.0/16 \ --subnet-name <subnetName> \ --subnet-prefix 10.1.1.0/24上一個命令會建立包含自定義IP範圍的 VNet 和子網。
在可用性設定組內建立Ubuntu VM
從 Canonical 取得在 Azure 中提供 Ubuntu 型 OS 的虛擬機器映像清單。
az vm image list --all --publisher "Canonical"本教學使用
Ubuntu 20.04。這很重要
計算機名稱長度必須少於 15 個字元,才能設定可用性群組。 用戶名稱不能包含大寫字元,密碼必須介於 12 到 72 個字元之間。
在可用性設定組中建立三個 VM。 在下列命令中取代這些值:
<resourceGroupName><VM-basename><availabilitySetName>-
<VM-Size>- 例如“Standard_D16s_v3” <username><adminPassword><vNetName><subnetName>
for i in `seq 1 3`; do az vm create \ --resource-group <resourceGroupName> \ --name <VM-basename>$i \ --availability-set <availabilitySetName> \ --size "<VM-Size>" \ --os-disk-size-gb 128 \ --image "Canonical:0001-com-ubuntu-server-jammy:20_04-lts-gen2:latest" \ --admin-username "<username>" \ --admin-password "<adminPassword>" \ --authentication-type all \ --generate-ssh-keys \ --vnet-name "<vNetName>" \ --subnet "<subnetName>" \ --public-ip-sku Standard \ --public-ip-address "" done
上述命令會使用先前定義的 VNet 建立 VM。 如需不同組態的詳細資訊,請參閱 az vm create 一文。
此命令也包含 --os-disk-size-gb 參數,可建立 128 GB 的自定義 OS 磁碟驅動器大小。 如果您稍後增加此大小,請展開適當的資料夾磁碟區以容納您的安裝,請設定邏輯磁碟區管理員 (LVM)。
一旦每個 VM 的命令完成,您應該會取得類似下列的結果:
{
"fqdns": "",
"id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/ubuntu1",
"location": "westus",
"macAddress": "<Some MAC address>",
"powerState": "VM running",
"privateIpAddress": "<IP1>",
"resourceGroup": "<resourceGroupName>",
"zones": ""
}
測試與已建立的虛擬機器之間的連線
在 Azure Cloud Shell 中使用下列命令連線到每個 VM。 如果您找不到 VM IP,請遵循 Azure Cloud Shell 上的本快速入門。
ssh <username>@<publicIPAddress>
如果連線成功,您應該會看到代表Linux終端機的下列輸出:
[<username>@ubuntu1 ~]$
輸入 exit 以離開 SSH 工作階段。
設定節點之間的無密碼 SSH 存取
無密碼 SSH 存取可讓您的 VM 使用 SSH 公鑰彼此通訊。 您必須在每個節點上設定 SSH 金鑰,並將這些金鑰複製到每個節點。
產生新的 SSH 金鑰
所需的 SSH 金鑰大小為 4,096 位。 在每個 VM 上,變更為 /root/.ssh 資料夾,然後執行下列命令:
ssh-keygen -t rsa -b 4096
在此步驟中,系統可能會提示您覆寫現有的 SSH 檔案。 您必須同意此提示。 您不需要輸入複雜密碼。
複製公用 SSH 金鑰
在每個 VM 上,您必須使用 ssh-copy-id 命令,從您剛才建立的節點複製公鑰。 如果您想要在目標 VM 上指定目標目錄,您可以使用 -i 參數。
在下列命令中, <username> 帳戶可以是您在建立 VM 時針對每個節點設定的相同帳戶。 您也可以使用 root 帳戶,但在生產環境中不建議使用此選項。
sudo ssh-copy-id <username>@ubuntu1
sudo ssh-copy-id <username>@ubuntu2
sudo ssh-copy-id <username>@ubuntu3
確認每個節點的無密碼存取
若要確認 SSH 公鑰已複製到每個節點,請使用每個節點的 ssh 命令。 如果您正確複製金鑰,則系統不會提示您輸入密碼,且連線將會成功。
在此範例中,我們會從第一個 VM 連線到第二個和第三個節點。ubuntu1。 同樣地, <username> 帳戶可以是您在建立 VM 時針對每個節點設定的相同帳戶。
ssh <username>@ubuntu2
ssh <username>@ubuntu3
從這三個節點重複此程式,讓每個節點可以與其他節點通訊,而不需要密碼。
設定名稱解析
您可以使用 DNS 或手動編輯每個節點上的 etc/hosts 檔案,來設定名稱解析。
如需 DNS 和 Active Directory 的詳細資訊,請參閱 將 Linux 主機上的 SQL Server 加入 Active Directory 網域。
這很重要
建議您在上一個範例中使用 私人IP 位址。 使用此組態中的公用IP位址會導致設定失敗,並將 VM 公開至外部網路。
此範例中使用的 VM 及其 IP 位址如下所示:
-
ubuntu1: 10.0.0.85 -
ubuntu2: 10.0.0.86 -
ubuntu3: 10.0.0.87
啟用高可用性
使用 ssh 連線到這 3 部 VM,一旦連線,請執行下列命令以啟用高可用性。
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server
安裝和設定 Pacemaker 叢集
若要開始設定 Pacemaker 叢集,您需要安裝必要的套件和資源代理程式。 在每部 VM 上執行下列命令:
sudo apt-get install -y pacemaker pacemaker-cli-utils crmsh resource-agents fence-agents csync2 python3-azure
現在繼續在主伺服器上建立驗證金鑰:
sudo corosync-keygen
驗證金鑰會在/etc/corosync/authkey位置產生。 將驗證金鑰複製到此位置的輔助伺服器: /etc/corosync/authkey
sudo scp /etc/corosync/authkey username@ubuntu2:~
sudo scp /etc/corosync/authkey username@ubuntu3:~
將 authkey 從主目錄移至 /etc/corosync。
sudo mv authkey /etc/corosync/authkey
使用下列命令繼續建立叢集:
cd /etc/corosync/
sudo vi corosync.conf
編輯 Corosync 檔案以描述內容,如下所示:
totem {
version: 2
secauth: off
cluster_name: demo
transport: udpu
}
nodelist {
node {
ring0_addr: 10.0.0.85
name: ubuntu1
nodeid: 1
}
node {
ring0_addr: 10.0.0.86
name: ubuntu2
nodeid: 2
}
node {
ring0_addr: 10.0.0.87
name: ubuntu3
nodeid: 3
}
}
quorum {
provider: corosync_votequorum
two_node: 0
}
qb {
ipc_type: native
}
logging {
fileline: on
to_stderr: on
to_logfile: yes
logfile: /var/log/corosync/corosync.log
to_syslog: no
debug: off
}
將 corosync.conf 檔案複製到其他節點至 /etc/corosync/corosync.conf:
sudo scp /etc/corosync/corosync.conf username@ubuntu2:~
sudo scp /etc/corosync/corosync.conf username@ubuntu3:~
sudo mv corosync.conf /etc/corosync/
重新啟動 Pacemaker 和 Corosync,並確認狀態:
sudo systemctl restart pacemaker corosync
sudo crm status
輸出的結果看起來會像以下範例:
Cluster Summary:
* Stack: corosync
* Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
* Last updated: Wed Nov 29 07:01:32 2023
* Last change: Sun Nov 26 17:00:26 2023 by hacluster via crmd on ubuntu1
* 3 nodes configured
* 0 resource instances configured
Node List:
* Online: [ ubuntu1 ubuntu2 ubuntu3 ]
Full List of Resources:
* No resources
設定隔離代理程式
在叢集上設定隔離。 隔離 是叢集中失敗節點的隔離。 它會重新啟動故障節點,使其停機、重置,然後重新啟動並重新加入叢集。
若要設定隔離,請執行下列動作:
- 在 Microsoft Entra ID 中註冊新的應用程式,並建立秘密
- 在 powershell/CLI 中從 json 檔案建立自定義角色
- 將角色和應用程式指派給叢集中的 VM
- 設定隔離代理屬性
在 Microsoft Entra ID 中註冊新的應用程式,並建立秘密
- 移至入口網站中的 Microsoft Entra 識別碼,並記下租用戶標識碼。
- 選取左側功能表上的 [ 應用程式註冊 ],然後選取 [ 新增註冊]。
- 輸入 名稱,然後選取 僅限此組織目錄中的帳戶。
- 針對 [應用程式類型],選取 [Web],輸入
http://localhost作為登入 URL,然後選取 [ 註冊]。 - 選取左側功能表上的 [ 憑證和秘密 ],然後選取 [ 新增客戶端密碼]。
- 輸入描述,然後選取到期期間。
- 請記下密碼的值,其會作為下列密碼和秘密標識碼使用,並做為下列用戶名稱。
- 選取 [概觀],並記下應用程式標識符。 它作為下列登入使用。
建立名為 fence-agent-role.json 的 JSON 檔案,並新增以下內容(填入您的訂閱 ID):
{
"Name": "Linux Fence Agent Role-ap-server-01-fence-agent",
"Id": null,
"IsCustom": true,
"Description": "Allows to power-off and start virtual machines",
"Actions": [
"Microsoft.Compute/*/read",
"Microsoft.Compute/virtualMachines/powerOff/action",
"Microsoft.Compute/virtualMachines/start/action"
],
"NotActions": [],
"AssignableScopes": [
"/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
]
}
在 PowerShell/CLI 中從 JSON 檔案建立自定義角色
az role definition create --role-definition fence-agent-role.json
將角色和應用程式指派給叢集中的 VM
- 針對叢集中的每個 VM,從側邊功能表中選取 [存取控制][IAM ]。
- 選取 [新增角色指派 ](使用傳統體驗)。
- 選取先前建立的角色。
- 在 [選取] 清單中,輸入稍早建立的應用程式名稱。
現在,我們可以使用先前的值和您的訂用帳戶標識碼來建立隔離代理程序資源:
sudo crm configure primitive fence-vm stonith:fence_azure_arm \
params \
action=reboot \
resourceGroup="resourcegroupname" \
resourceGroup="$resourceGroup" \
username="$secretId" \
login="$applicationId" \
passwd="$password" \
tenantId="$tenantId" \
subscriptionId="$subscriptionId" \
pcmk_reboot_timeout=900 \
power_timeout=60 \
op monitor \
interval=3600 \
timeout=120
設定隔離代理屬性
執行下列命令來設定隔離代理程式屬性:
sudo crm configure property cluster-recheck-interval=2min
sudo crm configure property start-failure-is-fatal=true
sudo crm configure property stonith-timeout=900
sudo crm configure property concurrent-fencing=true
sudo crm configure property stonith-enabled=true
並確認叢集狀態:
sudo crm status
輸出的結果看起來會像以下範例:
Cluster Summary:
* Stack: corosync
* Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
* Last updated: Wed Nov 29 07:01:32 2023
* Last change: Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
* 3 nodes configured
* 1 resource instances configured
Node List:
* Online: [ ubuntu1 ubuntu2 ubuntu3 ]
Full List of Resources:
* fence-vm (stonith:fence_azure_arm): Started ubuntu1
請安裝 SQL Server 和 mssql-tools
下列命令可用來安裝 SQL Server:
匯入公開存放庫 GPG 金鑰:
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc註冊 Ubuntu 存放庫:
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2022.list)"執行下列命令安裝 SQL Server:
sudo apt-get update sudo apt-get install -y mssql-server套件安裝完成之後,請執行
mssql-conf setup並遵循提示來設定 SA 密碼,然後選擇您的版本。 提醒您,下列版本是免費授權:Evaluation、Developer 和 Express。sudo /opt/mssql/bin/mssql-conf setup完成設定之後,請確認服務正在執行:
systemctl status mssql-server --no-pager安裝 SQL Server 命令列工具
若要建立資料庫,您必須與可在 SQL Server 上執行 Transact-SQL 陳述式的工具連線。 下列步驟會安裝 SQL Server 命令行工具: sqlcmd 和 bcp。
使用下列步驟在 Ubuntu 上安裝 mssql-tools18。
備註
- 從 SQL Server 2019 CU 3 開始,支援 Ubuntu 18.04。
- 從 SQL Server 2019 CU 10 開始,支援 Ubuntu 20.04。
- 從 SQL Server 2022 CU 10 開始,支援 Ubuntu 22.04。
輸入超級使用者模式。
sudo su匯入公開存放庫 GPG 金鑰。
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc註冊 Microsoft Ubuntu 存放庫。
對於 Ubuntu 22.04,請使用下列命令:
curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list > /etc/apt/sources.list.d/mssql-release.list對於 Ubuntu 20.04,請使用下列命令:
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list對於 Ubuntu 18.04,請使用下列命令:
curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list > /etc/apt/sources.list.d/mssql-release.list針對 Ubuntu 16.04,使用下列命令:
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
結束超級使用者模式。
exit更新來源清單,並使用 unixODBC 開發人員套件執行安裝命令。
sudo apt-get update sudo apt-get install mssql-tools18 unixodbc-dev備註
若要更新為最新版本的 mssql-tools,請執行下列命令:
sudo apt-get update sudo apt-get install mssql-tools18選用:在 Bash Shell 中將
/opt/mssql-tools18/bin/新增至您的PATH環境變數。若要在登入工作階段中從 Bash 殼層存取 sqlcmd 和 bcp,請使用下列命令修改
PATH檔案中的~/.bash_profile:echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile若要讓 sqlcmd 和 bcp 在互動和非登入會話中使用 Bash shell 存取,請使用下列命令修改
PATH檔案中的~/.bashrc:echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc source ~/.bashrc
安裝 SQL Server 高可用性代理程式
在所有節點上執行下列命令,以安裝 SQL Server 的高可用性代理程式套件:
sudo apt-get install mssql-server-ha
設定可用性群組
使用下列步驟來設定 VM 的 SQL Server Always On 可用性群組。 如需詳細資訊,請參閱 設定 SQL Server Always On 可用性群組以在 Linux 上取得高可用性。
啟用可用性群組並重新啟動 SQL Server
在每個裝載 SQL Server 實例的節點上啟用可用性群組。 然後重新啟動 mssql-server 服務。 在每個節點上執行下列命令:
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server
建立憑證
Microsoft不支援對 AG 端點進行 Active Directory 驗證。 因此,您必須使用憑證進行 AG 端點加密。
使用 SQL Server Management Studio (SSMS) 或 sqlcmd 連線到所有節點。 執行下列命令以啟用AlwaysOn_health工作階段並建立主要金鑰:
這很重要
如果您要從遠端連線到 SQL Server 實例,您必須在防火牆上開啟埠 1433。 您也必須在每個 VM 的網路安全性群組(NSG)中允許連接埠 1433 的輸入連線。 如需詳細資訊,請參閱 建立安全性規則 以建立輸入安全性規則。
- 將
<MasterKeyPassword>替換為您自己的密碼。
ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE = ON); GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<MasterKeyPassword>'; GO- 將
使用 SSMS 或 sqlcmd 連線到主要複本。 下列命令會在主要 SQL Server 複本上建立憑證
/var/opt/mssql/data/dbm_certificate.cer和私鑰var/opt/mssql/data/dbm_certificate.pvk。- 將
<PrivateKeyPassword>替換為您自己的密碼。
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm'; GO 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 = '<PrivateKeyPassword>' ); GO- 將
執行 命令以結束 exit 工作階段,並返回 SSH 工作階段。
將憑證複製到次要複本,並在伺服器上建立憑證
將建立的兩個檔案複製到將裝載可用性複本之所有伺服器上的相同位置。
在主伺服器上,執行下列
scp命令,將憑證複製到目標伺服器:- 將
<username>和sles2替換為您所使用的使用者名稱和目標 VM 名稱。 - 針對所有次要複本執行此命令。
備註
您不需要執行
sudo -i,這會提供您的根環境。 您可以改為在每個命令前面執行sudo命令。# The below command allows you to run commands in the root environment sudo -iscp /var/opt/mssql/data/dbm_certificate.* <username>@sles2:/home/<username>- 將
在目標伺服器上,執行下列命令:
- 將
<username>取代為您的使用者名稱。 - 命令會將
mv檔案或目錄從一個位置移至另一個位置。 - 命令
chown可用來變更檔案、目錄或鏈接的擁有者和群組。 - 針對所有次要複本執行這些命令。
sudo -i mv /home/<username>/dbm_certificate.* /var/opt/mssql/data/ cd /var/opt/mssql/data chown mssql:mssql dbm_certificate.*- 將
下列 Transact-SQL 腳本會從您在主要 SQL Server 複本上建立的備份建立憑證。 請以強式密碼更新指令碼。 解密密碼與您在上一個步驟中用來建立 .pvk 檔案的密碼相同。 若要建立憑證,請在所有輔助伺服器上使用 sqlcmd 或 SSMS 執行下列腳本:
CREATE CERTIFICATE dbm_certificate FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer' WITH PRIVATE KEY ( FILE = '/var/opt/mssql/data/dbm_certificate.pvk', DECRYPTION BY PASSWORD = '<PrivateKeyPassword>' ); GO
在所有複本上建立資料庫鏡像端點
使用 sqlcmd 或 SSMS 在所有 SQL Server 實例上執行下列腳本:
CREATE ENDPOINT [Hadr_endpoint]
AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING (
ROLE = ALL,
AUTHENTICATION = CERTIFICATE dbm_certificate,
ENCRYPTION = REQUIRED ALGORITHM AES
);
GO
ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
GO
建立可用性群組
請使用 sqlcmd 或 SSMS 連接至裝載主要副本的 SQL Server 實例。 執行下列命令以建立可用性群組:
- 將
ag1替換為您想要的 AG 名稱。 - 請用承載複本的 SQL Server 實例名稱替換
ubuntu1、ubuntu2和ubuntu3的值。
CREATE AVAILABILITY
GROUP [ag1]
WITH (
DB_FAILOVER = ON,
CLUSTER_TYPE = EXTERNAL
)
FOR REPLICA
ON N'ubuntu1'
WITH (
ENDPOINT_URL = N'tcp://ubuntu1:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'ubuntu2'
WITH (
ENDPOINT_URL = N'tcp://ubuntu2:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'ubuntu3'
WITH (
ENDPOINT_URL = N'tcp://ubuntu3:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
);
GO
ALTER AVAILABILITY GROUP [ag1]
GRANT CREATE ANY DATABASE;
GO
為 Pacemaker 建立 SQL Server 登入
在所有 SQL Server 實例上,建立 Pacemaker 的 SQL Server 登入。 以下的 Transact-SQL 會建立登入。
- 將
<password>取代為您自己的複雜密碼。
USE [master];
GO
CREATE LOGIN [pacemakerLogin]
WITH PASSWORD = N'<password>';
GO
ALTER SERVER ROLE [sysadmin]
ADD MEMBER [pacemakerLogin];
GO
在所有 SQL Server 實例上,儲存用於 SQL Server 登入的認證。
建立檔案:
sudo vi /var/opt/mssql/secrets/passwd將下列兩行新增至 檔案:
pacemakerLogin <password>若要結束 vi 編輯器,請先按 Esc 鍵,然後輸入 命令
:wq以寫入檔案並結束。讓檔案只有根目錄可讀取:
sudo chown root:root /var/opt/mssql/secrets/passwd sudo chmod 400 /var/opt/mssql/secrets/passwd
將次要副本加入可用性群組
在您的次要複本上,執行下列命令以將它們聯結至 AG:
ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL); GO ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE; GO在主要複本與每個次要複本上執行下列 Transact-SQL 文稿:
GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::ag1 TO pacemakerLogin; GO GRANT VIEW SERVER STATE TO pacemakerLogin; GO一旦次要複本加入,您可以透過展開Always On 高可用性節點,在 SSMS 物件總管中查看它們。
將資料庫新增至可用性群組
本節依循 將資料庫新增至可用性群組的指引。
此步驟中會使用下列 Transact-SQL 命令。 在主要複本上執行下列命令:
CREATE DATABASE [db1]; -- creates a database named db1
GO
ALTER DATABASE [db1] SET RECOVERY FULL; -- set the database in full recovery mode
GO
BACKUP DATABASE [db1] -- backs up the database to disk
TO DISK = N'/var/opt/mssql/data/db1.bak';
GO
ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1]; -- adds the database db1 to the AG
GO
確認已在次要伺服器上建立資料庫
在每個次要 SQL Server 複本上,執行下列查詢以查看 db1 資料庫是否已建立且處於 SYNCHRONIZED 狀態:
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;
GO
如果synchronization_state_desc顯示db1是SYNCHRONIZED,這表示複本已經同步。 次要複本會顯示 db1 在主要複本中。
在 Pacemaker 叢集中建立可用性群組資源
若要在 Pacemaker 中建立可用性群組資源,請執行下列命令:
sudo crm
configure
primitive ag1_cluster \
ocf:mssql:ag \
params ag_name="ag1" \
meta failure-timeout=60s \
op start timeout=60s \
op stop timeout=60s \
op promote timeout=60s \
op demote timeout=10s \
op monitor timeout=60s interval=10s \
op monitor timeout=60s on-fail=demote interval=11s role="Master" \
op monitor timeout=60s interval=12s role="Slave" \
op notify timeout=60s
ms ms-ag1 ag1_cluster \
meta master-max="1" master-node-max="1" clone-max="3" \
clone-node-max="1" notify="true"
commit
上述命令會建立ag1_cluster資源,也就是可用性群組資源。 然後它會建立 ms-ag1 資源(Pacemaker 中的主要/次要資源,然後將 AG 資源新增至其中。這可確保 AG 資源會在叢集中的所有三個節點上執行,但只有其中一個節點是主要節點。
若要檢視 AG 群組資源,以及檢查叢集的狀態:
sudo crm resource status ms-ag1
sudo crm status
輸出的結果看起來會像以下範例:
resource ms-ag1 is running on: ubuntu1 Master
resource ms-ag1 is running on: ubuntu3
resource ms-ag1 is running on: ubuntu2
輸出看起來類似下列範例。 若要新增共置和升級條件約束,請參閱 教學課程:在Linux虛擬機上設定可用性群組接聽程式。
Cluster Summary:
* Stack: corosync
* Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
* Last updated: Wed Nov 29 07:01:32 2023
* Last change: Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
* 3 nodes configured
* 4 resource instances configured
Node List:
* Online: [ ubuntu1 ubuntu2 ubuntu3 ]
Full List of Resources:
* Clone Set: ms-ag1 [ag1_cluster] (promotable):
* Masters: [ ubuntu1 ]
* Slaves : [ ubuntu2 ubuntu3 ]
* fence-vm (stonith:fence_azure_arm): Started ubuntu1
執行下列命令來建立群組資源,讓套用至接聽程式和負載平衡器的共置和升級條件約束不需要個別套用。
sudo crm configure group virtualip-group azure-load-balancer virtualip
的 crm status 輸出看起來會類似下列範例:
Cluster Summary:
* Stack: corosync
* Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
* Last updated: Wed Nov 29 07:01:32 2023
* Last change: Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
* 3 nodes configured
* 6 resource instances configured
Node List:
* Online: [ ubuntu1 ubuntu2 ubuntu3 ]
Full List of Resources:
* Clone Set: ms-ag1 [ag1_cluster] (promotable):
* Masters: [ ubuntu1 ]
* Slaves : [ ubuntu2 ubuntu3 ]
* Resource Group: virtual ip-group:
* azure-load-balancer (ocf :: heartbeat:azure-lb): Started ubuntu1
* virtualip (ocf :: heartbeat: IPaddr2): Started ubuntu1
* fence-vm (stonith:fence_azure_arm): Started ubuntu1