SQL server2019无域安装always on高用集群
环境:
Windows server 2022
SQL server 2019 标准版
#说明:
SQL server标准版本官方网站提示不能创建always on可用性组,但是可以支持故障转移群集。
经过询问大师,以及一番测试,标准版也是可以支持always on可用性组的,只不过副本节点不支持可读,且一个可用性组只能支持一个库。
| 角色 | hostname | IP | 备注 |
|---|---|---|---|
| sqldb1 | sqldb1.test.com | 192.168.56.101 | primary |
| sqldb2 | sqldb2.test.com | 192.168.56.102 | standby |
| iscsiserver | iscsidisk.test.com | 192.168.56.103 | 提供仲裁盘 |
| null | cluster | 192.168.56.105 | 群集IP |
| null | listener | 192.168.56.107 | 可用性组监听 |
端口均为1433
架构

配置主机名以及hosts(所有节点)
192.168.56.101 sqldb1.test.com
192.168.56.102 sqldb2.test.com
192.168.56.103 iscsidisk.test.com
192.168.56.105 cluster
192.168.56.107 mkdb

配置iSCSI仲裁盘(iSCSIserver)
添加iSCSI目标服务器

添加仲裁盘

所有db节点发起iSCSI连接并格式化磁盘
首先在sqldb1节点操作


GPT格式化

其他db节点只需要发起iSCSI连接并联机磁盘即可

所有数据库节点安装故障转移群集

创建群集(在sqldb1操作即可)




下面2个角色是创建可用性组之后才会有的。

安装SQL server数据库(所有db节点)
安装过程省略。

启用可用性组

HADR为true说明启用成功。

查看群集信息


新建可用性组
更改服务登录名为administrator

创建证书
在db节点的c盘创建目录cert,并设置共享和读写权限,需要添加system账号读写权限,否则创建证书失败。


主库创建证书,并把证书拷贝到从库
USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Smtgbk123';
CREATE CERTIFICATE Cert_server101 WITH SUBJECT = 'Cert_server101', START_DATE = '2025-11-28', EXPIRY_DATE = '2999-12-30';
BACKUP CERTIFICATE Cert_server101 TO FILE = 'C:\newcert\Cert_server101.cer'; --执行完成后把证书文件拷贝到从库
CREATE ENDPOINT [group0_endpoint] AUTHORIZATION [sa] STATE=STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = CERTIFICATE Cert_server101, ENCRYPTION = REQUIRED ALGORITHM AES)
GO
从库创建证书,并把证书拷贝到主库
USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Smtgbk123';
CREATE CERTIFICATE Cert_server102 WITH SUBJECT = 'Cert_server102', START_DATE = '2025-11-28', EXPIRY_DATE = '2999-12-30';
BACKUP CERTIFICATE Cert_server102 TO FILE = 'C:\newcert\Cert_server102.cer'; --执行完成后把证书文件拷贝到主库
CREATE ENDPOINT [group0_endpoint] AUTHORIZATION [sa] STATE=STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = CERTIFICATE Cert_server102, ENCRYPTION = REQUIRED ALGORITHM AES)
GO
主从库互为导入证书
--导入从库的证书到主库(主库执行)
CREATE CERTIFICATE Cert_server102 FROM FILE = 'C:\newcert\Cert_server102.cer';
--导入主库的证书到从库(从库执行)
CREATE CERTIFICATE Cert_server101 FROM FILE = 'C:\newcert\Cert_server101.cer';
主库新建数据库并做一次全量备份




从节点此时是还没有newdb的


监听器可以在此时创建,也可以在后面创建

自动种子模式,数据库会自动的在从库恢复,不需要在从库提前创建数据库。





刷新数据库状态可以看到已同步

此时在从库刷星可以看到数据库已经同步过来。

但是由于从库不可读,所以访问不了

客户端访问
客户端访问可以通过监听器IP地址进行访问。当主节点宕机的时候,监听IP会自动转移到从节点。





由于当前sqldb2是主节点,所以IP地址都在sqldb2服务器上。

现在我们尝试把sqldb2直接关机,看看数据库服务会不会转移到节点1.

我们可以看到监听IP已经转移到sqldb1

客户端测试连接成功

可以看到刚才插入的数据和新建的表都已同步到从库。

写在最后
由于服务器没有加入域,在刚搭建完时候通过监听IP地址是可以正常登录的。后面经过几轮故障自动切换之后再用监听IP地址登录失败了。提示如下错误。

解决方法:改用sql身份验证,输入sa账号密码


另外一种现象是:
来回自动故障转移之后,从故障群集管理器看到主节点是在sqldb1,但是此时数据库的主副本是在sqldb2的。不确定这种现象是不是正常的。