EC2 中 SQL Server 叢集的最佳實務和建議 - Amazon Elastic Compute Cloud

EC2 中 SQL Server 叢集的最佳實務和建議

SQL Always On 叢集提供高可用性,而不需共用儲存。除了 Always On 可用性群組的先決條件、限制和建議中所列的先決條件,此主題中的實務清單可協助您在 AWS 上操作 SQL Server Always On 叢集時取得最佳結果。此主題中所列的實務也提供日誌的蒐集方法。

注意

節點部署在不同可用區域或在相同區域中不同子網時,這些節點應會被視為多子網叢集。在您應用最佳實務和處理可能的失敗情況時請謹記這點。

指派 IP 地址

每個叢集節點應指派一個彈性網路介面,其中包含子網上的三個私有 IP 地址:主要 IP 地址、叢集 IP 地址和可用群組 IP 地址。作業系統 (OS) 應為 NIC 設定 DHCP。不應設定為靜態 IP 地址,因為基本上會在容錯移轉叢集管理員中處理叢集 IP 和可用群組的 IP 地址。可以設定靜態 IP 的 NIC,只要設定為只使用 eth0 的主要 IP。如果將其他 IP 指派到 NIC,則可能在容錯移轉事件期間導致執行個體的網路中止。

因不正確指派 IP 或是發生容錯移轉事件或網路失敗時而導致網路中止時,您通常會在失敗時看到以下事件日誌項目。

Isatap interface isatap.{9468661C-0AEB-41BD-BB8C-1F85981D5482} is no longer active.
Isatap interface isatap.{9468661C-0AEB-41BD-BB8C-1F85981D5482} with address fe80::5efe:169.254.1.105 has been brought up.

這些訊息看起來是在描述網路問題,因此很容易將中斷或失敗的原因誤認為網路錯誤。然而,這些錯誤描述的是失敗的徵狀,而不是原因。ISATAP 是透過 IPv4 使用 IPv6 的隧道技術。IPv4 連線失敗時,ISATAP 轉接器也會失敗。網路問題解決後,這些項目應不再出現在事件日誌中。或者,您可以放心使用以下命令來停用 ISATAP,即可避免網路錯誤的發生。

netsh int ipv6 isatap set state disabled

當您執行此命令時,系統就會將轉接器從裝置管理中移除。此命令應該在所有節點上執行。命令不會影響叢集運作的能力。相反地,當命令執行時,就不會再使用 ISATAP。不過,因為此命令可能會對利用 ISATAP 的其他應用程式造成不明的影響,您應該加以測試。

叢集屬性

若要查看完整的叢集組態,請執行以下 PowerShell 命令。

Get-Cluster | Format-List -Property *

在多站台叢集中叢集仲裁投票與 50/50 分割

若要了解如叢集仲裁的運作方式以及在失敗的情況下預期發生的事項,請參閱了解叢集和集區仲裁

DNS 註冊

在 Windows Server 2012 中,容錯移轉叢集依預設會嘗試在叢集名稱下註冊每個 DNS 節點。注意為多站台設定 SQL 目標對應用程式而言是可接受的。然而,當用戶端的設定方式不是如此,因為嘗試連接至每個個別節點且在非作用節點上失敗,則可能會造成逾時、延遲和應用程式錯誤。為了避免這些問題,叢集資源參數 RegisterAllProvidersIp 必須變更為 0。如需詳細資訊,請參閱 RegisterAllProvidersIP 設定多子網叢集的 SQL + RegisterAllProvidersIP + SharePoint 2013

可以使用以下 PowerShell 指令碼修改 RegisterAllProvidersIp

Import-Module FailoverClusters $cluster = (Get-ClusterResource | where {($_.ResourceType -eq "Network Name") -and ($_.OwnerGroup -ne "Cluster Group")}).Name Get-ClusterResource $cluster | Set-ClusterParameter RegisterAllProvidersIP 0 Get-ClusterResource $cluster |Set-ClusterParameter HostRecordTTL 300 Stop-ClusterResource $cluster Start-ClusterResource $cluster

除了將叢集資源參數設為 0,您必須確保叢集具有為叢集名稱修改 DNS 項目的許可。

  1. 登入該網域的網域控制器 (DC),或是託管網域轉送查閱區域的伺服器。

  2. 啟動 DNS 管理主控台並尋找叢集的 A 記錄。

  3. A 記錄上按一下滑鼠右鍵,並選擇 Properties (屬性)

  4. 選擇 Security (安全性)

  5. 選擇 Add (新增)

  6. 選擇 Object Types... (物件類型...),選取 Computers (電腦) 的方塊,然後選擇 OK (確定)

  7. 輸入叢集資源物件的名稱,並選擇 Check name (檢查名稱)OK if resolve (如果解決則確認)

  8. 選取 Full Control (完整控制) 的核取方塊。

  9. 選擇 OK (確定)。

彈性網路轉接器 (ENA)

AWS 已識別在 ENA 驅動程式版本 1.2.3 上一些執行中叢集工作負載的相關已知問題。我們建議升級至最新版本,並在作業系統中的 NIC 上調整設定。若是最新版本,請參閱 Amazon ENA 驅動程式版本。套用到所有系統的第一個設定會擴大接收緩衝區,您可透過以下範例 PowerShell 命令來完成。

Set-NetAdapterAdvancedProperty -Name (Get-NetAdapter | Where-Object {$_.InterfaceDescription -like '*Elastic*'}).Name -DisplayName "Receive Buffers" -DisplayValue 8192

對於具有超過 16 個 vCPU 的執行個體,我們建議避免讓 RSS 在 CPU 0 上執行。

執行下列命令。

Set-NetAdapterRss -name (Get-NetAdapter | Where-Object {$_.InterfaceDescription -like '*Elastic*'}).Name -Baseprocessorgroup 0 -BaseProcessorNumber 1

多站台叢集和 EC2 執行個體置放

每個叢集會被視為多站台叢集。EC2 服務基本上不會共用 IP 地址。每個節點必須位於唯一的子網。雖然不是必要,我們建議也將每個節點放在唯一的可用區域。

執行個體類型選擇

針對 Windows Server 容錯移轉叢集建議的執行個體類型會因工作負載而不同。對於生產工作負載,我們建議使用支援 EBS 最佳化增強型聯網的執行個體。

將彈性網路介面和 IP 指派給執行個體

EC2 叢集中的每個節點應具備至少一個連接的彈性網路介面。網路介面應至少有兩個指派的私有 IP 地址。然而,若是使用可用群組的工作負載,例如 SQL Always On,您必須包含每個可用群組的其他 IP 地址。主要 IP 地址會用來存取和管理伺服器,次要 IP 地址會用作為叢集 IP 地址,並視需要將每個其他 IP 地址指派至可用群組。

訊號網路

某些 Microsoft 文件建議使用專用的訊號網路。不過,這個建議不適用於 EC2。使用 EC2 時,因為當您可能指派次要彈性網路介面並將其用於訊號網路,所以 EC2 會使用相同的基礎設施並與主要網路介面共用頻寬。因此,無法為基礎設施中的流量排定優先順序且此流量無法獲得專用網路介面的協助。

在 OS 中設定網路轉接器

OS 中的 NIC 可以保持使用 DHCP,只要將從 DHCP 選項擷取的 DNS 伺服器設為允許每個節點彼此解析。您可以將 NIC 設為可靜態設定。完成時,您就接著手動設定僅彈性網路介面的主要 IP 地址。容錯移轉叢集會視需要管理和指派其他 IP 地址。

對於所有執行個體類型,您可以將網路轉接器上的最大傳輸單位 (MTU) 提高至 9001,來支援巨型訊框。此設定在巨型訊框的支援所在都可減少封包的分段問題。以下範例會顯示如何使用 PowerShell 來為彈性網路轉接器設定巨型訊框。

Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "MTU" -DisplayValue 9001

IPv6

Microsoft 不建議在 Windows 叢集中停用 IPv6。雖然容錯移轉叢集會在僅 IPv4 環境中運作,Microsoft 會測試啟用 IPv6 的叢集。請參閱在 Windows Server 2012 R2 中容錯移轉叢集和 IPv6 來了解詳細資訊。

SQL 可用群組接聽程式的主機記錄 TTL

將主機記錄 TTL 設為 300 秒,而不是預設的 20 分鐘 (1200 秒)。若與舊版用戶端相比,則將 SQL 可用群組接聽程式的 RegisterAllProvidersIP 設為 0。並非在所有環境都需如此設定。這些設定很重要,是因為有些舊版用戶端應用程式無法在連線字串中使用 MultiSubnetFailover。請參閱 HostRecordTTL 設定 來了解詳細資訊。在您變更這些設定時,就必須重新啟動叢集資源。當叢集資源重新啟動時,接聽程式的叢集群組會停止,因此必須啟動它。如果您不啟動叢集群組,可用性群組會在 RESOLVING 狀態保持離線。以下是變更 TTL 和 RegisterAllProvidersIP 設定的範例 PowerShell 指令碼。

Get-ClusterResource yourListenerName | Set-ClusterParameter RegisterAllProvidersIP 0
Get-ClusterResource yourListenerName|Set-ClusterParameter HostRecordTTL 300
Stop-ClusterResource yourListenerName
Start-ClusterResource yourListenerName
Start-ClusterGroup yourListenerGroupName

日誌

叢集日誌的預設日誌層級是 3。若要提供日誌資訊的詳細程度,請將記錄層級設為 5。請參閱 Set-ClusterLog 來了解 PowerShell cmdlet 的相關詳細資訊。

Set-ClusterLog –Level 5

NetBIOS over TCP

在 Windows Server 2012 R2 上,您可以透過停用 NetBIOS over TCP 來提高容錯移轉程序的速度。Windows Server 2016 中已移除此功能。如果您環境中使用的是舊版作業系統,您應測試此程序。如需詳細資訊,請參閱加快容錯移轉速度的小祕訣。以下是停用 NetBIOS over TCP 的範例 PowerShell 命令。

Get-ClusterResource “Cluster IP Address” | Set-ClusterParameter EnableNetBIOS 0

NetFT 虛擬轉接器

若是早於 2016 的 Windows Server 版本且非 Hyper-V 的工作負載,Microsoft 建議您在 OS 中轉接器上啟用 NetFT 虛擬轉接器效能篩選。當您啟用 NetFT 虛擬轉接器時,會將內部叢集流量直接路由至 NetFT 虛擬轉接器。如需詳細資訊,請參閱 NetFT 虛擬轉接器效能篩選。您可以透過選取 NIC 屬性中的核取方塊,或是使用以下 PowerShell 命令來啟用 NetFT 虛擬轉接器。

Get-NetAdapter | Set-NetAdapterBinding –ComponentID ms_netftflt –Enable $true

設定可能的擁有者

可以設定容錯移轉叢集管理員,讓叢集核心資源和可用性群組資源上指定的每個 IP 地址僅在 IP 所屬的節點上上線。如果未對容錯移轉叢集管理員進行此設定,而且發生失敗,則容錯移轉過程會有一些延遲,因為叢集會嘗試在無法辨識此地址的節點上帶出 IP。如需詳細資訊,請參閱 SQL Server 會管理 AlwaysOn 可用性群組/角色的偏好和可能擁有者屬性

叢集中的每個資源都有可能擁有者的設定。此設定會告訴叢集哪些節點獲允許將資源「上線」。每個節點會在 VPC 中唯一子網上執行。因為 EC2 無法在執行個體之間共用 IP,只有特定的節點可以將叢集中的 IP 資源上線。依預設,新增至叢集作為資源的每個 IP 地址都有列為可能擁有者的每個節點。這個情況不會造成失敗。然而,在預期和非預期失敗期間,您可能會在日誌上看到相互衝突的 IP 與無法將 IP 設為上線的相關錯誤。這些錯誤可予以忽略。如果您設定可能擁有者屬性,您可以在將該服務移動到另一個節點的情況下,完全避免這些錯誤的發生以及避免停機時間。

調整容錯移轉閾值

在 Server 2012 R2 中,容錯移轉訊號網路的網路閾值預設為較高的值。請參閱調整容錯移轉叢集網路閾值來了解詳細資訊。在 Server 2016 中已透過提高訊號的數量來處理這個組態潛在不可靠的問題 (適用於與這些閾值有些距離的叢集)。因為非常短暫的臨時性網路問題,則在叢集容錯移轉時會發現這個問題。訊號網路會透過 UDP 3343 維持,這個連接埠的可靠度通常較 TCP 低很多,而且更容易未能完成對話。雖然 AWS 可用區域之間有低延遲的連線,在「跳轉」區隔資源數量之間仍有地理區隔。在可用區域中,叢集之間可能會有一些距離,除非客戶使用的是置放群組或專用執行個體。因此,UDP 訊號失敗的可能性會較 TCP 型訊號失敗的可能性更高。

叢集應容錯移轉的唯一時機是在合法中斷,像是遭遇硬式容錯移轉的服務或節點,而不是在傳輸過程中遺失的幾個 UDP 封包。為了確保合法中斷,我們建議您調整閾值來符合或甚至超過調整容錯移轉叢集網路閾值中所列的 Server 2016 設定。您可以使用以下 PowerShell 命令來變更設定。

(get-cluster).SameSubnetThreshold = 10
(get-cluster).CrossSubnetThreshold = 20

當您設定這些值時,非預期的容錯移轉應會大幅降低。您可以透過提高訊號之間的延遲來微調這些設定。然而,我們建議您使用更高的閾值來更頻繁地傳送閾值。將這些閾值設得更高可確保容錯移轉僅在硬式容錯移轉的情況下發生,其容錯移轉前的延遲會更長。您必須決定多長的停機時間對您的應用程式是可接受的。

在提高 SameSubnetThresholdCrossSubnetThreshold 後,我們建議您將 RouteHistoryLength 提高至這兩個值的兩倍以上。這可確保充分記錄供故障診斷的資訊。您可以使用以下 PowerShell 命令設定 RouteHistoryLength

(Get-Cluster).RouteHistoryLength = 20

見證重要性與動態仲裁基礎架構

磁碟見證和檔案共用見證之間存在差異。磁碟見證會保留叢集資料庫的備份,而檔案共用見證不會。兩者都會將 投票新增至叢集。如果使用 iSCSI 式儲存體,則可以使用磁碟見證。如需見證選項的更多資訊,請參閱 本機叢集的檔案共用見證與磁碟見證比較

故障診斷

如果您遭遇非預期的容錯移轉,請先確保您不是遇到聯網、服務和基礎設施問題。

  1. 檢查您的節點未發生與網路相關的問題。

  2. 檢查驅動程式更新。如果您在執行個體上使用的是過時的驅動程式,您應進行更新。更新驅動程式可能會解決在您目前安裝版本上存在的錯誤和穩定性問題。

  3. 檢查是否有任何可能的資源瓶頸 (例如 CPU 和磁碟 I/O),這些瓶頸可能會使執行處理沒有回應。如果節點無法為請求提供服務,則節點可能會顯示為因叢集服務而關閉。