本文內容
適用於: Azure VM 上的 SQL Server
本教學課程將逐步說明如何為 Azure 中 Linux 虛擬機器 (VM) 上的 SQL Server 建立可用性群組 (AG) 接聽程式,適用於 Red Hat Enterprise Linux (RHEL)、SUSE Linux Enterprise Server (SLES) 和 Ubuntu。
您將了解如何:
在 Azure 入口網站中建立負載平衡器
設定負載平衡器的後端 IP 集區
建立負載平衡器的探查
設定負載平衡規則
在叢集中建立負載平衡器資源
建立 AG 接聽程式
測試接聽程式連線
測試容錯移轉
注意
無偏差通訊
本發行項包含字詞「奴隸」的參考;Microsoft 將此內容中使用該字詞視為有冒犯性。 因為該字詞目前出現在軟體中,所以也會出現在本發行項中。 當軟體移除該字詞時,我們也會將其從發行項中移除。
必要條件
在 Azure 入口網站中建立負載平衡器
下列指示會帶您了解建立與設定負載平衡器和可用性群組接聽程式 (Azure VM 上的 SQL Server) 文章的在 Azure 入口網站中建立和設定負載平衡器 一節中的步驟 1 到 4。
建立負載平衡器
在 Azure 入口網站中,開啟包含 SQL Server 虛擬機器的資源群組。
在資源群組中,選取 [新增]。
搜尋負載平衡器 ,然後在搜尋結果中,選取由 Microsoft 發佈的 [負載平衡器]。
在 [負載平衡器] 窗格上,選取 [建立] 。
在 [建立負載平衡器] 對話方塊中,依下列方式設定負載平衡器︰
設定
值
名稱
代表負載平衡器的文字名稱。 例如: sqlLB
。
類型
內部
虛擬網路
建立的預設虛擬網路應命名為 VM1VNET
。
子網路
選取 SQL Server 執行個體所在的子網路。 預設值應為 VM1Subnet
。
IP 位址指派
靜態
私人 IP 位址
使用在叢集中建立的 virtualip
IP 位址。
訂用帳戶
使用您的資源群組所使用的訂用帳戶。
資源群組
選取 SQL Server 執行個體所在的資源群組。
位置
選取 SQL Server 執行個體所在的 Azure 位置。
Azure 會呼叫後端位址集區 backend pool 。 在此情況下,後端集區是您的 AG 中三部 SQL Server 執行個體的位址。
在資源群組中,選取您建立的負載平衡器。
在 [設定] 中選取 [後端集區] 。
在 [後端集區] 上,按一下 [新增] 以建立後端位址集區。
在 [新增後端集區] 的 [名稱] 之下,輸入後端集區的名稱。
在 [關聯性] 下,選取 [虛擬機器]。
選取環境中的每部虛擬機器,並將適當的 IP 位址與每個選項產生關聯。
選取 [新增]。
建立探查
探查會定義 Azure 如何確認哪一個 SQL Server 執行個體目前擁有 AG 接聽程式。 Azure 會根據在建立探查時定義的連接埠上的 IP 位址來探查服務。
在負載平衡器的 [設定] 窗格上,選取 [健全狀態探查] 。
在 [健全狀態探查] 窗格中,選取 [新增] 。
在 [新增探查] 窗格上設定探查。 使用下列值來設定探查:
設定
值
名稱
代表探查的文字名稱。 例如: SQLAlwaysOnEndPointProbe
。
通訊協定
TCP
通訊埠
您可以使用任何可用的連接埠。 例如: 59999
。
間隔
5
狀況不良臨界值
2
選取 [確定]。
登入您所有的虛擬機器,然後使用下列命令來開啟探查連接埠:
sudo firewall-cmd --zone=public --add-port=59999/tcp --permanent
sudo firewall-cmd --reload
Azure 會建立探查,然後使用它來測試那一個 SQL Server 執行個體具有 AG 的接聽程式。
設定負載平衡規則
負載平衡規則會設定負載平衡器如何將流量路由到 SQL Server 執行個體。 對此負載平衡器,您會啟用伺服器直接回傳,因為三個 SQL Server 執行個體中一次只有一個會擁有 AG 接聽程式資源。
在負載平衡器的 [設定] 窗格中,選取 [負載平衡規則] 。
在 [負載平衡規則] 窗格中,選取 [新增] 。
在 [新增負載平衡規則] 窗格中,設定負載平衡規則。 使用下列設定:
設定
值
名稱
代表負載平衡規則的文字名稱。 例如: SQLAlwaysOnEndPointListener
。
通訊協定
TCP
通訊埠
1433
後端連接埠
1433
. 系統會忽略此值,因為此規則使用 [浮動 IP (伺服器直接回傳)] 。
探查
使用您為此負載平衡器建立之探查的名稱。
工作階段持續性
None
閒置逾時 (分鐘)
4
浮動 IP (伺服器直接回傳)
已啟用
選取 [確定]。
Azure 會設定負載平衡規則。 負載平衡器現已設定成將流量路由傳送到裝載 AG 接聽程式的 SQL Server 執行個體。
此時,資源群組有一個與所有 SQL Server 電腦連線的負載平衡器。 負載平衡器也包含 SQL Server AlwaysOn AG 接聽程式的 IP 位址,以便電腦回應對 AG 的要求。
建立可用性群組接聽程式資源
在 Pacemaker 中建立負載平衡器資源之前,請先建立接聽程式資源:
sudo crm configure primitive virtualip \
ocf:heartbeat:IPaddr2 \
params ip=x.y.z.a
在上一個範例中, x.y.z.a
是指負載平衡器前端 IP位址。
在叢集中建立負載平衡器資源
依照設定散發的指示進行。
登入主要虛擬機器。 我們需要建立資源來啟用 Azure 負載平衡器探查連接埠 (在我們的範例中使用 59999)。 執行以下命令:
sudo pcs resource create azure_load_balancer azure-lb port=59999
建立包含 virtualip
和 azure_load_balancer
資源的群組:
sudo pcs resource group add virtualip_group azure_load_balancer virtualip
新增限制式
為了確保 Azure 負載平衡器 IP 位址和 AG 資源在相同的節點上執行,必須設定共置限制式。 執行以下命令:
sudo pcs constraint colocation add azure_load_balancer ag_cluster-master INFINITY with-rsc-role=Master
建立排序限制式,以確保 AG 資源會在 Azure 負載平衡器 IP 位址之前啟動並執行。 雖然共置限制式隱含排序限制式,但此步驟會強制執行它。
sudo pcs constraint order promote ag_cluster-master then start azure_load_balancer
若要驗證限制式,請執行下列命令:
sudo pcs constraint list --full
您應該會看見下列輸出:
Location Constraints:
Ordering Constraints:
promote ag_cluster-master then start virtualip (kind:Mandatory) (id:order-ag_cluster-master-virtualip-mandatory)
promote ag_cluster-master then start azure_load_balancer (kind:Mandatory) (id:order-ag_cluster-master-azure_load_balancer-mandatory)
Colocation Constraints:
virtualip with ag_cluster-master (score:INFINITY) (with-rsc-role:Master) (id:colocation-virtualip-ag_cluster-master-INFINITY)
azure_load_balancer with ag_cluster-master (score:INFINITY) (with-rsc-role:Master) (id:colocation-azure_load_balancer-ag_cluster-master-INFINITY)
Ticket Constraints:
本教學課程使用 SLES 15 進行下列範例:
登入主要虛擬機器。 我們需要建立資源來啟用 Azure 負載平衡器探查連接埠 (在我們的範例中使用 59999
)。 執行以下命令:
sudo crm configure
primitive azure_load_balancer azure-lb port=59999 op monitor timeout=20s interval=10
commit
quit
建立包含 admin-ip
和 azure_load_balancer
資源的群組:
sudo crm configure group admin-ip-group admin-ip azure_load_balancer
一旦建立群組,您會看到共置和順序限制式已修改並更新,以反映群組 而非 admin-ip
資源,如下列範例所示:
INFO: modified colocation:vip_on_master from admin-ip to admin-ip-group
INFO: modified order:ag_first from admin-ip to admin-ip-group
當您查看狀態時,應該會看到群組如下所示:
sudo crm status
Cluster Summary:
* Stack: corosync
* Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum
* Last updated: Fri Mar 10 15:50:53 2023
* Last change: Fri Mar 10 15:50:48 2023 by root via cibadmin on sles1
* 3 nodes configured
* 6 resource instances configured
Node List:
* Online: [ sles1 sles2 sles3 ]
Full List of Resources:
* rsc_st_azure (stonith:fence_azure_arm): Started sles2
* Clone Set: ms-ag_cluster [ag_cluster] (promotable):
* Masters: [ sles1 ]
* Slaves: [ sles2 sles3 ]
* Resource Group: admin-ip-group:
* admin-ip (ocf::heartbeat:IPaddr2): Started sles1
* azure_load_balancer (ocf::heartbeat:azure-lb): Started sles1
您可以使用命令 sudo crm configure show
來檢視修改的限制式:
node 1: sles1
node 2: sles2
node 3: sles3
primitive admin-ip IPaddr2 \
params ip=10.0.0.93 \
op monitor interval=10 timeout=20
primitive ag_cluster ocf:mssql:ag \
params ag_name=ag1 \
meta failure-timeout=60s \
op start timeout=60s interval=0 \
op stop timeout=60s interval=0 \
op promote timeout=60s interval=0 \
op demote timeout=10s interval=0 \
op monitor timeout=60s interval=10s \
op monitor timeout=60s interval=11s role=Master \
op monitor timeout=60s interval=12s role=Slave \
op notify timeout=60s interval=0
primitive azure_load_balancer azure-lb \
params port=59999 \
op monitor timeout=20s interval=10
primitive rsc_st_azure stonith:fence_azure_arm \
params subscriptionId=61868ab8-16d4-44ec-a9ff-f35d05922847 resourceGroup=amvindomain tenantId=72f988bf-86f1-41af-91ab-2d7cd011db47 login=b6940c8c-e3eb-4561-b45e-a9a51b791728 passwd="******" pcmk_monitor_retries=4 pcmk_action_limit=3 power_timeout=240 pcmk_reboot_timeout=900 pcmk_host_map="sles1:sles1;sles2:sles2;sles3:sles3" \
op monitor interval=3600 timeout=120
group admin-ip-group admin-ip azure_load_balancer
ms ms-ag_cluster ag_cluster \
meta master-max=1 master-node-max=1 clone-max=3 clone-node-max=1 notify=true
order ag_first Mandatory: ms-ag_cluster:promote admin-ip-group:start
colocation vip_on_master inf: admin-ip-group ms-ag_cluster:Master
property cib-bootstrap-options: \
have-watchdog=false \
dc-version="2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712" \
cluster-infrastructure=corosync \
cluster-name=sqlcluster \
stonith-enabled=true \
concurrent-fencing=true \
stonith-timeout=900
rsc_defaults rsc-options: \
resource-stickiness=1 \
migration-threshold=3
op_defaults op-options: \
timeout=600 \
record-pending=true
執行下列命令,在 Pacemaker 中建立負載平衡器資源:
sudo crm configure primitive azure-load-balancer azure-lb params port=59999
若要確保接聽程式和 AG 資源一律在叢集中的相同伺服器上執行,您必須建立共置條件限制式:
sudo crm configure colocation ag-with-listener INFINITY: virtualip-group ms-ag1:Master
建立升階/排序限制式。 此限制式會指示 Pacemaker 在容錯移轉期間讓可用性群組在新的主要伺服器上上線,然後在該伺服器上啟動接聽程式。
sudo crm configure order ag-before-listener Mandatory: ms-ag1:promote virtualip-group:start
檢視共置限制式:
sudo crm configure show ag-with-listener
輸出類似於下列範例:
Colocation ag-with-listener inf: virtual ip-group ms-ag1:Master
檢視順序限制式:
sudo crm configure show ag-before-listener
輸出類似於下列範例:
order ag-before-listener Mandatory: ms-ag1:promot virtual ip-group:start
建立可用性群組接聽程式
在主要節點上以 sqlcmd 或 SSMS 執行下列命令。 以 virtualip
IP 位址取代下列使用的 IP 位址。
SQL Server 2022 及更新版本:
ALTER AVAILABILITY GROUP [ag1]
ADD LISTENER 'ag1-listener' (
WITH IP((
'10.0.0.7',
'0.0.0.0'
)),
PORT = 1433
);
GO
* SQL Server 2017 SQL Server 2019:
ALTER AVAILABILITY GROUP [ag1]
ADD LISTENER 'ag1-listener' (
WITH IP((
'10.0.0.7',
'255.255.255.255'
)),
PORT = 1433
);
GO
登入每個 VM 節點。 使用下列命令開啟主機檔案,並為每部機器的 ag1-listener
設定主機名稱解析。
sudo vi /etc/hosts
在 vi 編輯器中,輸入 i
以插入文字,並在空白行上新增 ag1-listener
的 IP。 然後,在 IP 旁的空格後面新增 ag1-listener
。
<IP of ag1-listener> ag1-listener
若要結束 vi 編輯器,請先按 Esc 鍵,然後輸入命令 :wq
以寫入檔案並結束。 請在每個節點上執行此動作。
測試接聽程式和容錯移轉
本節涵蓋登入 SQL Server AG 接聽程式,以及測試容錯移轉。
使用可用性群組接聽程式,測試登入 SQL Server
使用 sqlcmd ,登入使用 AG 接聽程式名稱的 SQL Server 主要節點:
使用先前建立的登入,並將 <YourPassword>
取代為正確的密碼。 以下範例會使用以 SQL Server 建立的 sa
登入。
sqlcmd -S ag1-listener -U sa -P <YourPassword>
檢查您要連線的伺服器名稱。 在 sqlcmd 中執行下列命令:
SELECT @@SERVERNAME;
您的輸出應該會顯示目前的主要節點。 如果您從未測試過容錯移轉,應該會顯示 VM1
。
鍵入 exit
命令,以結束 SQL Server 工作階段。
測試容錯移轉
執行下列命令,手動將主要複本容錯移轉至 <VM2>
或另一個複本。 將 <VM2>
取代為您伺服器名稱的值。
sudo pcs resource move ag_cluster-master <VM2> --master
如果您檢查限制式,會看到因為手動容錯移轉而新增了另一個限制式:
sudo pcs constraint list --full
已新增識別碼為 cli-prefer-ag_cluster-master
的限制式。
使用下列命令,移除識別碼為 cli-prefer-ag_cluster-master
的限制式:
sudo pcs constraint remove cli-prefer-ag_cluster-master
使用命令 sudo pcs resource
檢查您的叢集資源,您應該會看到此時的主要執行個體為 <VM2>
。
注意
本文包含「從屬」一詞的參考,Microsoft 已不再使用該字詞。 從軟體中移除該字詞時,我們也會將其從本文中移除。
[<username>@<VM1> ~]$ sudo pcs resource
Master/Slave Set: ag_cluster-master [ag_cluster]
Masters: [ <VM2> ]
Slaves: [ <VM1> <VM3> ]
Resource Group: virtualip_group
azure_load_balancer (ocf::heartbeat:azure-lb): Started <VM2>
virtualip (ocf::heartbeat:IPaddr2): Started <VM2>
使用 sqlcmd 登入使用接聽程式名稱的主要複本:
使用先前建立的登入,並將 <YourPassword>
取代為正確的密碼。 以下範例會使用以 SQL Server 建立的 sa
登入。
sqlcmd -S ag1-listener -U sa -P <YourPassword>
檢查您已連線的伺服器。 在 sqlcmd 中執行下列命令:
SELECT @@SERVERNAME;
您應該會看到現在已連線到您已進行容錯移轉的 VM。
使用可用性群組接聽程式,測試登入 SQL Server
使用 sqlcmd ,登入使用 AG 接聽程式名稱的 SQL Server 主要節點:
使用先前建立的登入,並將 <YourPassword>
取代為正確的密碼。 以下範例會使用以 SQL Server 建立的 sa
登入。
sqlcmd -S ag1-listener -U sa -P <YourPassword>
檢查您要連線的伺服器名稱。 在 sqlcmd 中執行下列命令:
SELECT @@SERVERNAME;
您的輸出應該會顯示目前的主要節點。 如果您從未測試過容錯移轉,應該會顯示 VM1
。
鍵入 exit
命令,以結束 SQL Server 工作階段。
測試容錯移轉
執行下列命令,手動將主要複本容錯移轉至 <VM2>
或另一個複本。 將 <VM2>
取代為您伺服器名稱的值。
sudo crm resource move ms-ag_cluster sles2
如果您檢查限制式,會看到因為手動容錯移轉而新增了另一個限制式:
sudo crm configure show
您會看到已新增識別碼為 cli-prefer-ms-ag_cluster
的限制式。
使用下列命令,移除識別碼為 cli-prefer-ms-ag_cluster
的限制式:
sudo crm configure delete cli-prefer-ms-ag_cluster
使用命令 sudo crm status
檢查您的叢集資源,您應該會看到此時的主要執行個體為 SLES2
。
Cluster Summary:
* Stack: corosync
* Current DC: sles1 (version 2.0.5+20201202.ba59be712-150300.4.30.3-2.0.5+20201202.ba59be712) - partition with quorum
* Last updated: Fri Mar 10 15:55:50 2023
* Last change: Fri Mar 10 15:55:28 2023 by root via crm_resource on sles1
* 3 nodes configured
* 6 resource instances configured
Node List:
* Online: [ sles1 sles2 sles3 ]
Full List of Resources:
* rsc_st_azure (stonith:fence_azure_arm): Started sles2
* Clone Set: ms-ag_cluster [ag_cluster] (promotable):
* ag_cluster (ocf::mssql:ag): Slave sles1 (Monitoring)
* ag_cluster (ocf::mssql:ag): Master sles2 (Monitoring)
* Slaves: [ sles3 ]
Resource Group: admin-ip-group:
* admin-ip (ocf::heartbeat:IPaddr2): Started sles2
* azure_load_balancer (ocf::heartbeat:azure-lb): Started sles2
使用 sqlcmd 登入使用接聽程式名稱的主要複本:
使用先前建立的登入,並將 <YourPassword>
取代為正確的密碼。 以下範例會使用以 SQL Server 建立的 sa
登入。
sqlcmd -S ag1-listener -U sa -P <YourPassword>
檢查您已連線的伺服器。 在 sqlcmd 中執行下列命令:
SELECT @@SERVERNAME;
您應該會看到現在已連線到您已進行容錯移轉的 VM。
使用可用性群組接聽程式,測試登入 SQL Server
使用 sqlcmd ,登入使用 AG 接聽程式名稱的 SQL Server 主要節點:
使用先前建立的登入,並將 <YourPassword>
取代為正確的密碼。 以下範例會使用以 SQL Server 建立的 sa
登入。
sqlcmd -S <listenerIP> -U sa -P <YourPassword>
檢查您要連線的伺服器名稱。 在 sqlcmd 中執行下列命令:
SELECT @@SERVERNAME;
您的輸出應該會顯示目前的主要節點。 如果您從未測試過容錯移轉,應該會顯示 Ubuntu1
。
鍵入 exit
命令,以結束 SQL Server 工作階段。
測試容錯移轉
若要測試容錯移轉,請使用下列命令,將主要複本移至不同的節點:
sudo crm configure delete cli-prefer-ms-ag1
sudo crm resource move ms-ag1 ubuntu2
執行下列命令來確認狀態:
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
* 6 resource instances configured
Node List:
* Online: [ ubuntu1 ubuntu2 ubuntu3 ]
Full List of Resources:
* Clone Set: ms-ag1 [ag1_cluster] (promotable):
* Masters: [ ubuntu2 ]
* Slaves : [ ubuntu1 ubuntu3 ]
* Resource Group: virtual ip-group:
* azure-load-balancer (ocf :: heartbeat:azure-lb): Started ubuntu2
* virtualip (ocf :: heartbeat: IPaddr2): Started ubuntu2
* fence-vm (stonith:fence_azure_arm): Started ubuntu1
現在,除了隔離以外的資源已移至 ubuntu2
節點,也就是新的主要節點。
後續步驟
若要對您的 SQL Server 執行個體使用可用性群組接聽程式,必須建立及設定負載平衡器。