
作为数据库负责人,你在管理 SQL Server 的时候,希望使用 SQL Server AlwaysOn Availability Groups 方案来部署数据库的高可用。可是,公司原本并没有 Active Directory 域环境,甚至无DNS服务器,领导和你也不希望增AD域来提高系统的复杂度。那么是否可以部署无域环境的集群呢?
SQL Server AlwaysOn AG 是基于集群配置的,过去 Windows 集群是必须依赖于 AD域的。自Windows Server 2016 开始,你可以创建一个没有任何 AD 域的 Windows 故障转移集群,极大方便了SQL Server AlwaysOn AG 的部署。接下来我们就配置无DC无DNS的高可用。
我们假设在以下限制条件下的场景:
无 AD 域
无 DNS 服务器
云服务器
跨子网部署
首先购买2台不同可用区的云服务器(Windows Server 2016 Datacenter),配置成不同的子网,我们将使用这2台服务器配置一个跨子网集群。基于以上条件的部署,我们在 AlwaysOn AG 中是不设置侦听器(即VIP)连接的,只能直连到主节点,毕竟是没有DNS服务器。当然,你可以使用第三方工具,或者自己在脚本中判断来更改IP访问。
出于安全性考虑,我们不开放所有端口,以下端口是我们需要的。
| Application | Protocol | Ports |
| Cluster Service | UDP,TCP | 3343 |
| RPC | TCP | 135 |
| Cluster Administrator | UDP | 137 |
| MSSQL | TCP | 1433 |
| MSSQL Endpoint | TCP | 5021 |
| ping | ICMP | ICMP4 |
| SMB | TCP | 445 |
| iSCSI | TCP | 860、3260 |
| Randomly allocated | TCP | 49152-65535 |
Windows 配置(2 台服务器进行相同操作)
安装功能:“故障转移群集” 和 “多路径I/O”,其中 “多路径I/O” 用于iSCSI。
创建 Windows 账户 sqladmin,2个节点要求密码一致,将作为 SQL Server 的服务账号。
禁用 UAC 远程限制
Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name "LocalAccountTokenFilterPolicy"New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name LocalAccountTokenFilterPolicy -Value 1云服务器的IP在Windows中显示的是动态分配的,我们需要手动固定到IPv4中。通过命令行执行 ipconfig all 查看。
在 IPv4 属性的 DNS 选项中,不需要在 DNS 中注册此连接地址(因为没有自己的DNS服务器,DNS后缀是可自定义的,这里我使用 jeeson.com)

在 C:\Windows\System32\drivers\etc\hosts 绑定完整自定义的域名,2台服务器设置一样。
172.16.10.9 SQL01.jeeson.com172.16.11.17 SQL02.jeeson.com#也可以多补充几个方便访问:172.16.10.9 SQL01172.16.11.17 SQL02172.16.10.9 172.16.10.9.jeeson.com172.16.11.17 172.16.11.17.jeeson.com节点添加 DNS 后缀(如 jeeson.com),标准化更改主机名,操作完成后重启服务器。

故障转移集群配置
在其中的一个节点上,创建故障转移集群。既然是跨子网,那么就需要分配2个新的子网IP作为集群IP。

群集创建完成后,只有主节点的群集IP是联机状态,另一子网IP处于脱机状态,这是正常的。下图我们可以看到,集群“名称解析尚不可用”,也就是通过集群名称是不可以访问到指定集群IP的。如果有正常的 DC 和 DNS 服务器,集群会自动注册到 DNS 中。如果你有 DNS 服务器,也可以手动添加 DNS 记录。如果都没有,为了避免集群一直尝试注册 DNS 出现报错,上面我们已经在 IPv4 设置不注册此地址了,所以才出现“名称解析尚不可用”。

由于基于集群名称无法连接并设置相关集群权限,集群就不使用文件仲裁的方式了。为了防止集群脑裂,我们需要保证集群有奇数节点的投票权。这里使用磁盘仲裁的方式,使用 Windows iSCSI 来配置共享磁盘,iSCSI 的部署与配置比较简单,在这就不再赘述。当然,你也可以使用其他存储方案来实现。
SQL Server AlwaysOn AG 配置
配置完成 Windows 故障转移集群,接下来可以在每个集群节点独立安装 SQL Server,注意 SQL Server 的服务账号使用同一个同名账号(如刚才创建的 sqladmin)。
安装 SQL Server 完成后,启用 AlwaysOn 可用性组。由于是非 AD 域的环境,就不能使用域认证来配置 AlwaysOn AG。我们使用证书认证的方式来配置。在主备2个节点实例中,都创建主密钥、证书、端点端口,并将证书备份且还原到另一个实例中。
如下其中一个节点的示例脚本:
USE master;GO--创建主密钥CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'kk_testag2016';GO--创建证书CREATE CERTIFICATE Cert_1WITH SUBJECT = 'Cert_1',START_DATE = '2022-01-01',EXPIRY_DATE = '2099-12-30';GO--备份证书BACKUP CERTIFICATE Cert_1 TO FILE = 'C:\software\Cert_1.cer';GO--创建端点CREATE ENDPOINT AgEndPointAUTHORIZATION SASTATE=STARTEDAS TCP (LISTENER_PORT = 5021, LISTENER_IP = ALL)FOR DATA_MIRRORING(ROLE = ALL,AUTHENTICATION = CERTIFICATE Cert_1, ENCRYPTION = REQUIRED ALGORITHM AES)GO--还原另一个节点的证书CREATE CERTIFICATE Cert_2 FROM FILE ='C:\software\Cert_2.cer';GO
接下来,你就可以在 SSMS 中根据操作向导,一步步配置 AlwaysOn 可用性组了。

至此,无 AD 域无 DNS 的跨子网集群配置完成。多数情况下,一个公司都有自己的 DNS 服务器。如果有 DNS 服务器,则可以使用集群名称访问集群、可以使用侦听器访问 SQL Server,就能够提供高可用特性HA。没有 DNS 服务器,当前的部署相当于只提供一种 DR 方案,当然,这种 DR 方案的 RPO=0。
这个场景的需求是,基于上面的限制条件,也基于架构和访问方式,将存在的一些单节点数据库,为了防止数据丢失而实施的实时同步方案。我们重点考虑的是DR方案,切换IP访问的场景我们也是比较方便操作的。我们曾在线上环境部署了几十套这样的集群,运行良好。





