在相同的 Active Directory 網域內部署多個 SQL Server 巨量資料叢集

適用於:SQL Server 2019 (15.x)

本文說明 SQL Server 2019 累積更新 5 (CU5) 的更新內容,可供組態多個 SQL Server 2019 巨量資料叢集。 現在可以部署各種巨量資料叢集,並將其與同一個 Active Directory 網域整合。

重要

Microsoft SQL Server 2019 巨量資料叢集附加元件將會淘汰。 SQL Server 2019 巨量資料叢集的支援將於 2025 年 2 月 28 日結束。 平台上將完全支援含軟體保證 SQL Server 2019 的所有現有使用者,而且軟體將會持續透過 SQL Server 累積更新來維護,直到該時間為止。 如需詳細資訊,請參閱公告部落格文章Microsoft SQL Server 平台上的巨量資料選項

在 SQL Server 2019 CU5 之前,有兩個問題會阻礙在 AD 網域中部署多個巨量資料叢集。

  • 服務主體名稱與 DNS 網域的命名衝突
  • 網域帳戶主體名稱

什麼是物件名稱衝突?

服務主體名稱 (SPN) 與 DNS 網域發生命名衝突

以部署階段提供的網域名稱作為 Active Directory (AD) DNS 網域使用。 這表示 Pod 可以使用此 DNS 網域,在內部網路中彼此連線。 使用者也可使用此 DNS 網域連線到巨量資料叢集端點。 如此一來,針對巨量資料叢集內服務所建立的「服務主體名稱 (SPN)」,將會具有符合此 AD DNS 網域規定的 Kubernetes Pod、服務或端點名稱。 若使用者在網域中部署第二個叢集,因為這些叢集之間的 Pod 名稱與 DNS 網域名稱沒有差異,所以產生的 SPN 會有相同的 FQDN。 假設 AD DNS 網域是 contoso.local。 Pod master-0 中主要集區 SQL Server 所產生的其中一個 SPN 為 MSSQLSvc/master-0.contoso.local:1433。 在使用者嘗試部署的第二個叢集中,master-0 的 Pod 名稱相同。 使用者提供相同的 AD DNS 網域 (contoso.local) 導致產生相同的 SPN 字串。 Active Directory 禁止在第二個叢集中建立導致部署失敗的衝突 SPN。

網域帳戶主體名稱

在部署網域為 Active Directory 的巨量資料叢集期間,在巨量資料叢集內執行的服務會產生多個帳戶主體。 這些基本上都是 AD 使用者帳戶。 在 SQL Server 2019 CU5 之前,這些帳戶的名稱在叢集之間都不是唯一的。 此資訊清單會嘗試在兩個不同的叢集中,為巨量資料叢集的特定服務建立相同使用者帳戶名稱。 所要部署的第二個叢集在 AD 中發生衝突,無法建立帳戶。

如何解決名稱衝突

解決 SPN 和 DNS 網域問題的步驟 - SQL Server 2019 CU5

SPN 在叢集中必須是唯一的。 在部署階段傳入的 DNS 網域名稱也必須不同。 您可以使用部署組態檔中新引入的組態來指定不同 DNS 名稱:subdomain。 若兩個叢集之間的子網域不同,而且內部通訊可能會透過這個子網域進行,則 SPN 將會包含達到所需唯一性的子網域。

注意

透過子網域設定所傳遞的值不是新的 AD 網域,而是內部使用的 DNS 網域。

讓我們回到主要集區 SQL Server SPN 的情況。 如果子網域為 bdc,則討論的 SPN 變更為 MSSQLSvc/master-0.bdc.contoso.local:1433

巨量資料叢集名稱或命名空間名稱用於計算子網域設定的值。 您可以選擇性地在 Active Directory 組態規格中自訂新引入之子網域參數的值。當使用者想要覆寫子網域名稱時,可以使用 Active Directory 組態規格中的新子網域參數來執行此動作。

如何確保帳戶名稱唯一性

若要更新帳戶名稱並保證唯一性,請使用帳戶前置詞。 帳戶前置詞是帳戶名稱的一個區段,在任兩個叢集之間都是唯一的。 帳戶名稱的其餘區段可以是常數。 新的帳戶名稱格式如下所示:<prefix>-<name>-<podId>

注意

Active Directory 要求帳戶名稱不得超過 20 個字元。 巨量資料叢集必須使用 8 個字元來區隔 Pod 與 StatefulSet。 所以只有 12 個字元可供帳戶前置詞使用。

您可以選擇自訂帳戶名稱。 使用 Active Directory 組態規格中的 accountPrefix 參數。SQL Server 2019 CU5 在組態規格中引入了 accountPrefix。根據預設,子網域名稱可作為帳戶首碼使用。 若子網域名稱超過 12 個字元,則會使用子網域名稱的前 12 個字元子字串作為帳戶前置詞。

子網域只適用於 DNS。 因此,新的 LDAP 使用者帳戶名稱是 bdc-ldap@contoso.local。 帳戶名稱不是 bdc-ldap@bdc.contoso.local

語意

下列是 SQL Server 2019 CU5 中新增的參數,用於在網域中設定多個叢集:

subdomain

  • 選擇性欄位
  • 資料類型:字串
  • 定義:要用於此巨量資料叢集的唯一 DNS 子網域。 部署在 Active Directory 網域中的每個叢集,此值都應該不同。
  • 預設值:若未提供,將會使用叢集名稱作為預設值
  • 最大長度:每個標籤為 63 個字元 (標籤中的每個字串以點分隔)。
  • 備註:端點 DNS 名稱應該使用 FQDN 中的子網域。

accountPrefix

  • 選擇性欄位
  • 資料類型:字串
  • 定義:巨量資料叢集將產生 AD 帳戶的唯一前置詞。 部署在 Active Directory 網域中的每個叢集,此值都應該不同。
  • 預設值:若未提供,將會使用子網域名稱作為預設值。 若未提供子網域,將會使用叢集名稱作為子網域名稱,因此叢集名稱也會繼承為 accountPrefix。 若有提供子網域,而且是多部分名稱 (包含一或多個點),則使用者必須提供 accountPrefix。
  • 最大長度:12 個字元

AD 網域與 DNS 伺服器調整

AD 網域或網域控制站無須進行任何變更,即可在相同的 Active Directory 網域中部署多個巨量資料叢集。 在註冊外部端點 DNS 名稱時,系統會自動在 DNS 伺服器中建立 DNS 子網域。

部署組態檔的變更

控制平面組態 control.json 中的 activeDirectory 區段,有兩個新的選擇性參數:subdomainaccountPrefix。 叢集名稱會用於其中每個參數。 若您想要覆寫預設行為,請提供這些設定的新值。 叢集名稱與命名空間名稱相同。

您可以選擇使用任何端點 DNS 名稱,只要其符合規定即可。 該名稱也不能與部署在相同網域的任何其他巨量資料叢集衝突。 您也可以使用子網域參數的值,確保 DNS 名稱在不同叢集間都是不同的。 請考慮使用閘道端點。 您可以將名稱 gateway 用於端點,並在 DNS 伺服器中自動註冊。 若要在巨量資料叢集部署中執行此作業,請使用 gateway.bdc1.contoso.local 作為 DNS 名稱。 若 bdc1 是子網域,且 contoso.local 是 AD DNS 網域名稱, 則其他可接受的值為:gateway-bdc1.contoso.local,或僅為 gateway.contoso.local

一些 Active Directory 安全性組態範例

若您想要覆寫子網域與 accountPrefix,下列是 Active Directory 安全性組態的範例。

    "security": { 
        "activeDirectory": { 
            "ouDistinguishedName":"OU=contosoou,DC=contoso,DC=local", 
            "dnsIpAddresses": [ "10.10.10.10" ], 
            "domainControllerFullyQualifiedDns": [ "contoso-win2016-dc.contoso.local" ], 
            "domainDnsName":"contoso.local", 
            "subdomain": "bdc", 
            "accountPrefix": "myprefix", 
            "clusterAdmins": [ "contosoadmins" ], 
            "clusterUsers": [ "contosousers1", "contosousers2" ] 
        } 
    } 
  

下列是控制平面端點的端點規格範例。 只要 DNS 名稱是唯一且完整的名稱,您就可以使用任何 DNS 名稱的值:

        "endpoints": [ 
            { 
                "serviceType": "NodePort", 
                "port": 30080, 
                "name": "Controller", 
                "dnsName": "control-bdc1.contoso.local" 
            }, 
            { 
                "serviceType": "NodePort", 
                "port": 30777, 
                "name": "ServiceProxy", 
                "dnsName": "monitor-bdc1.contoso.local" 
            } 
        ] 
  

問題

您需要為不同叢集建立個別的組織單位嗎?

這並非必要,但是建議使用。 為個別叢集提供個別的 OU,可協助您管理所產生的使用者帳戶。

如何在 SQL Server 2019 中還原回 CU5 之前的行為?

在某些情況下,您可能無法容納新引入的 subdomain 參數。 例如,您必須部署一個 CU5 之前的版本,且您已經升級了 Azure Data CLI (azdata)。 雖然這不太可能,但是若必須還原到 CU5 之前的行為,可在 control.json 的 Active Directory 區段中,將 useSubdomain 參數設為 false

針對這種情況,下列範例將 useSubdomain 設定為 false

azdata bdc config replace -c custom-prod-kubeadm/control.json -j "$.security.activeDirectory.useSubdomain=false" 

後續步驟

針對 SQL Server 巨量資料叢集 Active Directory 整合進行疑難排解