適用於:SQL Server 2019 (15.x)
本文說明 SQL Server 2019 累積更新 5 (CU5)的更新,可設定多個 SQL Server 2019 巨量數據叢集。 現在可以部署各種巨量數據叢集,並與相同的 Active Directory 網域整合。
Important
MICROSOFT SQL Server 2019 巨量數據叢集已淘汰。 SQL Server 2019 巨量數據叢集的支援已於 2025 年 2 月 28 日結束。 如需詳細資訊,請參閱 Microsoft SQL Server 平臺上的公告部落格文章和巨量數據選項。
在 SQL Server 2019 CU5 之前,有兩個問題導致無法在 AD 網域中部署多個巨量數據叢集。
- 服務主體名稱和 DNS 網域的命名衝突
- 網域帳戶主體名稱
什麼是物件名稱衝突?
服務主體名稱 (SPN) 和 DNS 網域命名衝突
部署時提供的網域名稱會用作您的 Active Directory(AD) DNS 網域。 這表示 Pods 可以在內部網路中使用此 DNS 網域彼此連線。 使用者也會使用此 DNS 網域連線到巨量數據叢集端點。 因此,為巨量數據叢中的服務創建的任何 服務主體名稱(SPN) 都會包含 Kubernetes Pod、服務或端點名稱,並且這些名稱會被該 AD DNS 網域所限定。 如果使用者在網域中部署第二個叢集,則產生的SPN具有相同的FQDN,因為Pod名稱和 DNS 功能變數名稱在叢集之間沒有差異。 請考慮AD DNS網域為 contoso.local的情況。 針對 Pod master-0 中主要集區 SQL Server 產生的其中一個 SPN 為 MSSQLSvc/master-0.contoso.local:1433。 在第二個叢集中,用戶嘗試部署的 Pod 名稱 master-0 相同。 使用者提供相同的 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 會包含達到所需唯一性的子域。
Note
透過子域設定傳遞的值不是新的 AD 網域,而是內部使用的 DNS 網域。
讓我們回到主要集區 SQL Server SPN 的情況。 如果子域是 bdc,則討論的 SPN 會變更為 MSSQLSvc/master-0.bdc.contoso.local:1433。
巨量數據叢集名稱或命名空間名稱可用來計算子域設定的值。 您可以選擇性地在 Active Directory 組態規格中自定義新引進的子域參數值。當使用者想要覆寫子域名稱時,他們可以使用 Active Directory 組態規格中的新子域參數來執行此動作。
如何確保帳戶名稱唯一性
若要更新帳戶名稱,並保證唯一性使用帳戶前置詞。 帳戶前綴是帳戶名稱的一部分,在任兩個叢集之間都是獨特的。 帳戶名稱的其餘區段可以是常數。 新的帳戶名稱格式如下所示: <prefix>-<name>-<podId>。
Note
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。
Semantics
以下是在 SQL Server 2019 CU5 中新增的參數,用於在網域中設定多個叢集:
subdomain
- Optional field
- 數據類型:字串
- 定義:用於此巨量數據叢集的唯一 DNS 子域。 對於部署在 Active Directory 網域中的每個叢集,此值應該不同。
- 預設值:未提供時,叢集名稱會當做預設值使用
- 最大長度:每個標籤 63 個字元(標籤是每個以點分隔的字串)。
- 備註:端點 DNS 名稱應該使用其 FQDN 中的子域。
accountPrefix
- Optional field
- 數據類型:字串
- 定義:大數據叢集將生成的 AD 帳戶專用唯一字首。 對於部署在 Active Directory 網域中的每個叢集,此值應該不同。
- 預設值:未提供時,子域名稱會當做預設值使用。 未提供子域時,叢集名稱會當做子域名稱使用,因此叢集名稱也會繼承為 accountPrefix。 如果提供子域,而且是多段式名稱(包含一或多個點),使用者必須提供 accountPrefix。
- 最大長度:12 個字元
AD 網域和 DNS 伺服器調整
AD 網域或域控制器中不需要變更,以配合針對相同 Active Directory 網域部署多個巨量數據叢集。 當 DNS 子域註冊外部端點 DNS 名稱時,會自動在 DNS 伺服器中建立。
部署組態檔的變更
控制平面組態中的 activeDirectory 區段 control.json 有兩個新的選擇性參數: subdomain 和 accountPrefix。 叢集名稱會用於每個參數。 如果您想改變預設行為,請為這些設定提供新的值。 叢集名稱與命名空間名稱相同。
您可以選擇使用任何端點 DNS 名稱,只要其完整。 它也無法與部署在相同網域中的其他任何巨量數據叢集發生衝突。 您可以使用子域參數的值來確保 DNS 名稱在叢集之間不同。 請考慮網關端點。 您可以使用端點的名稱 gateway ,並在 DNS 伺服器中自動註冊。 若要在巨量數據叢集部署中執行這項作,請使用 gateway.bdc1.contoso.local 作為 DNS 名稱。 如果 bdc1 是子域,而且 contoso.local 是 AD DNS 網域名稱。 其他可接受的值為: gateway-bdc1.contoso.local 或只是 gateway.contoso.local。
一些 Active Directory 安全性設定範例
以下是 Active Directory 安全性設定的範例,以備您想要覆蓋子域和 accountPrefix(帳號前綴)。
"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 名稱使用任何值:
"endpoints": [
{
"serviceType": "NodePort",
"port": 30080,
"name": "Controller",
"dnsName": "control-bdc1.contoso.local"
},
{
"serviceType": "NodePort",
"port": 30777,
"name": "ServiceProxy",
"dnsName": "monitor-bdc1.contoso.local"
}
]
Questions
您需要為不同的叢集建立個別的組織單位嗎?
這不是必需的,但建議這樣做。 為個別叢集提供個別 OU 可協助您管理產生的用戶帳戶。
如何在 SQL Server 2019 中還原回 CU5 前的行為?
在某些情況下,您無法容納新引進 subdomain 的參數。 例如,您必須部署 CU5 發行前版本,且您已升級 Azure Data CLI (azdata)。 這不太可能,但如果您需要還原為 CU5 前行為,您可以在的 useSubdomainActive Directory 區段中將 參數設定false為 control.json 。
下列範例會在此案例中將 useSubdomain 設定為 false。
azdata bdc config replace -c custom-prod-kubeadm/control.json -j "$.security.activeDirectory.useSubdomain=false"