教學課程:在 Azure 中為 Ubuntu 虛擬機器上的 SQL Server 設定可用性群組
在本教學課程中,您將了解如何:
- 建立虛擬機器,將它們放在可用性設定組中
- 啟用高可用性 (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 中的 Bash 快速入門。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入。
出現提示時,請在第一次使用時安裝 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
取得在 Azure 中提供 Ubuntu 型 OS 的虛擬機器映像清單。
az vm image list --all --offer "sql2022-ubuntupro2004"
搜尋 BYOS 映像時,您應該會看見以下結果:
[ { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "enterprise_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.221108", "version": "16.0.221108" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "enterprise_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.230207", "version": "16.0.230207" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "enterprise_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.230808", "version": "16.0.230808" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "sqldev_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.221108", "version": "16.0.221108" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "sqldev_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.230207", "version": "16.0.230207" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "sqldev_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.230808", "version": "16.0.230808" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "standard_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.221108", "version": "16.0.221108" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "standard_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.230207", "version": "16.0.230207" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "standard_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.230808", "version": "16.0.230808" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "web_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.221108", "version": "16.0.221108" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "web_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.230207", "version": "16.0.230207" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "web_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.230808", "version": "16.0.230808" } ]
本教學課程使用
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": ""
}
測試與已建立的 VM 之間的連線
在 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.85ubuntu2
:10.0.0.86ubuntu3
: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
authkey 是在 /etc/corosync/authkey
位置中產生的。 將 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 ID,並記錄租用戶 ID。
- 在左側功能表中,選取 [應用程式註冊],然後選取 [新註冊]。
- 輸入名稱,然後選取 [僅限此組織目錄中的帳戶]。
- 針對 [應用程式類型],選取 [Web],輸入
http://localhost
作為登入網址,然後選取 [註冊]。 - 從左側功能表中選取 [憑證和祕密],然後選取 [新增用戶端密碼]。
- 輸入描述,然後選取到期期間。
- 請記下秘密的值,將它用作下列密碼和秘密 ID,並用作下列使用者名稱。
- 選取 [概觀],並記下應用程式 ID。 它用作下列登入。
建立稱為 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)]。
- 選取 [新增角色指派] (使用傳統體驗)。
- 選取之前建立的 [角色]。
- 在 [選取] 清單中,輸入先前建立的應用程式名稱。
現在,我們可以使用先前的值和您的訂用帳戶 ID 來建立隔離代理程式資源:
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 殼層中將
/opt/mssql-tools18/bin/
新增至您的PATH
環境變數。若要讓登入工作階段的 Bash 殼層可存取 sqlcmd 和 bcp,請使用下列命令修改您在
PATH
檔案中的~/.bash_profile
:echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile
若要讓互動式/非登入工作階段的 Bash 殼層可存取 sqlcmd 和 bcp,請使用下列命令修改
~/.bashrc
檔案中的PATH
: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 可用性群組。 如需詳細資訊,請參閱<在 Linux 上設定 SQL Server Always On 可用性群組,以達高可用性>(部分機器翻譯)。
啟用可用性群組並重新啟動 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
命令以結束 sqlcmd 工作階段,然後回到您的 SSH 工作階段。
將憑證複製到次要複本並在伺服器上建立憑證
將先前建立的兩個檔案複製到將裝載可用性複本的所有伺服器上的相同位置。
在主要伺服器上執行下列
scp
命令,將憑證複製到目標伺服器:- 將
<username>
和sles2
更改為您所使用的使用者名稱和目標 VM 名稱。 - 對所有次要複本執行此命令。
注意
您不需要執行為您提供根環境的
sudo -i
。 您可以改為在每個命令前面執行sudo
命令。# The below command allows you to run commands in the root environment sudo -i
scp /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 名稱。 - 將
ubuntu1
、ubuntu2
和ubuntu3
值取代為裝載複本的 SQL Server 執行個體的名稱。
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
以寫入檔案並結束。使該檔案只能由 root 讀取:
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
聯結次要複本後,您可以在 SSMS 物件總管中加以檢視,方法是展開 Always On 高可用性節點:
將資料庫新增至可用性群組
本節主要遵循將資料庫新增至可用性群組一文。
此步驟使用下列 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
若 db1
的 synchronization_state_desc
列示 [已同步],表示複本已同步。 次要複本會在主要複本中顯示 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