暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL Server AlwaysOn AG 无AD域无DNS的跨子网集群实战

SQLServer 2022-08-01
1662


作为数据库负责人,你在管理 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访问。

出于安全性考虑,我们不开放所有端口,以下端口是我们需要的。

ApplicationProtocolPorts
Cluster ServiceUDP,TCP3343
RPCTCP135
Cluster AdministratorUDP137
MSSQLTCP1433
MSSQL EndpointTCP5021
pingICMPICMP4
SMBTCP445
iSCSITCP860、3260
Randomly allocatedTCP49152-65535


Windows 配置(2 台服务器进行相同操作)

  1. 安装功能:“故障转移群集” 和 “多路径I/O”,其中 “多路径I/O” 用于iSCSI。

  2. 创建 Windows 账户 sqladmin,2个节点要求密码一致,将作为 SQL Server 的服务账号。

  3. 禁用 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.com
        172.16.11.17 SQL02.jeeson.com


        #也可以多补充几个方便访问:
        172.16.10.9 SQL01
        172.16.11.17 SQL02
        172.16.10.9 172.16.10.9.jeeson.com
        172.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_1
        WITH 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 AgEndPoint
        AUTHORIZATION SA
        STATE=STARTED
        AS 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访问的场景我们也是比较方便操作的。我们曾在线上环境部署了几十套这样的集群,运行良好





        文章转载自SQLServer,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论