在同一 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、服务或终结点名称。 如果用户在域中部署第二个群集,则生成的 SPN 具有相同的 FQDN,因为在群集之间 Pod 名称和 DNS 域名相同。 请设想一种场景,其中 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 部分有两个新的可选参数: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 安全配置示例
如果想要替代子域和 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 名称使用任何值,前提是这些值是唯一的并且是完全限定的:
"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"