Windows Server2022下使用SQL Server2019开发版搭建高可用集群
Windows Server2022下使用SQL Server2019开发版搭建高可用集群
一、准备工作
- 非域控环境下搭建高可用集群。
- 准备三台Windws Server 2022的服务器,并在服务器上安装SQL SERVER 2019 Developer版本,并且三台服务器都的账号和密码都使用一样的。也可以使用VMWare安装三台虚拟机(本教程使用的方法)。
- 三台服务器的IP如下:
- 主节点:192.168.3.28,机器名:WIN-QOTTULEM2MD
- 副节点:192.168.3.29,机器名:WIN-A9I9Q6PR4DL
- 副节点:192.168.3.30,机器名:WIN-9VFMKPKSUQ5
- 备注:上面的机器名,这里写出来,是因为后面在创建可用集群节点的时候,会用到。
二、操作步骤
2.0 防火墙端口放开
- 关闭防火墙,或者在防火墙里面增加一个入站规则,把以下端口都放开:1433, 5022, 135, 3343, 445
2.1 开启Aways On功能
- 在三台服务器上,开启Aways On功能,使用powsershell,以管理员的方式执行以下命令:
Enable-SqlAlwaysOn -ServerInstance "localhost" -Force
2.2 创建证书用于端点认证(非域环境必须使用证书)
- 创建证书,尽量将证书的过期日期设置长一点,防止证书到期,导致可用性组中断。
- 在主节点(192.168.3.28)上执行以下SQL语句:
-- 创建主密钥
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'fuckus123456';-- 创建证书
CREATE CERTIFICATE AG_Certificate_28
WITH SUBJECT = 'AG Certificate for 192.168.3.28',
START_DATE = '2025-07-19', -- 开始日期
EXPIRY_DATE = '9999-12-31'; -- 到期日期-- 备份证书
BACKUP CERTIFICATE AG_Certificate_28
TO FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\AG_Certificate_28.cer';
- 在第二个节点(192.168.3.29)上执行:
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'fuckus123456';CREATE CERTIFICATE AG_Certificate_29
WITH SUBJECT = 'AG Certificate for 192.168.3.29',
START_DATE = '2025-07-19', -- 开始日期
EXPIRY_DATE = '9999-12-31'; -- 到期日期BACKUP CERTIFICATE AG_Certificate_29
TO FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\AG_Certificate_29.cer';
- 在第三个节点(192.168.3.30)上执行:
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'fuckus123456';CREATE CERTIFICATE AG_Certificate_30
WITH SUBJECT = 'AG Certificate for 192.168.3.30',
START_DATE = '2025-07-19', -- 开始日期
EXPIRY_DATE = '9999-12-31'; -- 到期日期BACKUP CERTIFICATE AG_Certificate_30
TO FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\AG_Certificate_30.cer';
- 备注:注意上面证书的路径都是在SQL Server默认安装目录的备份目录,如果你需要使用其他目录,请先配置好文件夹的权限,否则会出现以下错误:
无法写入文件 'C:\cert\AG_Certificate_28.cer'。请确保您有写权限、文件路径有效以及该文件尚不存在。
2.3 创建端点
- 在三台服务器上的分别执行以下SQL语句:
--在192.168.3.28上执行
CREATE ENDPOINT [Hadr_endpoint]
STATE = STARTED
AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE AG_Certificate_28, -- 使用当前节点的证书名ENCRYPTION = REQUIRED ALGORITHM AES,ROLE = ALL
);--在192.168.3.29上执行
CREATE ENDPOINT [Hadr_endpoint]
STATE = STARTED
AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE AG_Certificate_29, -- 使用当前节点的证书名ENCRYPTION = REQUIRED ALGORITHM AES,ROLE = ALL
);--在192.168.3.30上执行
CREATE ENDPOINT [Hadr_endpoint]
STATE = STARTED
AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE AG_Certificate_30, -- 使用当前节点的证书名ENCRYPTION = REQUIRED ALGORITHM AES,ROLE = ALL
);
2.4 在所有节点之间共享证书
-
将每个节点的证书复制到其他两个节点上(例如使用共享文件夹或手动复制),例如我们需要把192.168.3.29和192.168.3.30两个服务器上的证书,都复制到192.168.3.28上的C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\目录里面。
-
三个服务器上的证书都准备好了后,分别执行以下SQL脚本:
-
在192.168.3.28上执行:
CREATE LOGIN AG_Login_29 WITH PASSWORD = 'fuckus123456';
CREATE LOGIN AG_Login_30 WITH PASSWORD = 'fuckus123456';CREATE CERTIFICATE AG_Certificate_29 FROM FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\AG_Certificate_29.cer';
CREATE CERTIFICATE AG_Certificate_30 FROM FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\AG_Certificate_30.cer';CREATE USER AG_User_29 FOR LOGIN AG_Login_29;
CREATE USER AG_User_30 FOR LOGIN AG_Login_30;GRANT CONNECT ON ENDPOINT::Hadr_endpoint TO AG_Login_29;
GRANT CONNECT ON ENDPOINT::Hadr_endpoint TO AG_Login_30;
- 在192.168.3.29上执行:
CREATE LOGIN AG_Login_28 WITH PASSWORD = 'fuckus123456';
CREATE LOGIN AG_Login_30 WITH PASSWORD = 'fuckus123456';CREATE CERTIFICATE AG_Certificate_28 FROM FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\AG_Certificate_28.cer';
CREATE CERTIFICATE AG_Certificate_30 FROM FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\AG_Certificate_30.cer';CREATE USER AG_User_28 FOR LOGIN AG_Login_28;
CREATE USER AG_User_30 FOR LOGIN AG_Login_30;GRANT CONNECT ON ENDPOINT::Hadr_endpoint TO AG_Login_28;
GRANT CONNECT ON ENDPOINT::Hadr_endpoint TO AG_Login_30;
- 在192.168.3.30上执行:
CREATE LOGIN AG_Login_28 WITH PASSWORD = 'fuckus123456';
CREATE LOGIN AG_Login_29 WITH PASSWORD = 'fuckus123456';CREATE CERTIFICATE AG_Certificate_28 FROM FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\AG_Certificate_28.cer';
CREATE CERTIFICATE AG_Certificate_29 FROM FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\AG_Certificate_29.cer';CREATE USER AG_User_28 FOR LOGIN AG_Login_28;
CREATE USER AG_User_29 FOR LOGIN AG_Login_29;GRANT CONNECT ON ENDPOINT::Hadr_endpoint TO AG_Login_28;
GRANT CONNECT ON ENDPOINT::Hadr_endpoint TO AG_Login_29;
2.5 在主节点上创建可用性组
- 在192.168.3.28上执行以下SQL语句:
CREATE AVAILABILITY GROUP [AG_Group]
WITH (CLUSTER_TYPE = NONE)
FOR REPLICA ON
N'WIN-QOTTULEM2MD' WITH (ENDPOINT_URL = N'TCP://192.168.3.28:5022',AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,FAILOVER_MODE = MANUAL,SEEDING_MODE = AUTOMATIC,PRIMARY_ROLE(ALLOW_CONNECTIONS = ALL)
),
N'WIN-A9I9Q6PR4DL' WITH (ENDPOINT_URL = N'TCP://192.168.3.29:5022',AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,FAILOVER_MODE = MANUAL,SEEDING_MODE = AUTOMATIC,SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL)
),
N'WIN-9VFMKPKSUQ5' WITH (ENDPOINT_URL = N'TCP://192.168.3.30:5022',AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,FAILOVER_MODE = MANUAL,SEEDING_MODE = AUTOMATIC,SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL)
);
- 备注:这里面使用到的文章最开始提到的机器名,如果你安装SQL Server的时候,都是使用的默认选项,则这里需要改成机器名,否则会出现以下错误:
消息 35237,级别 16,状态 1,第 35 行
可用性组 AG_Group 没有任何指定副本映射到你连接到的 SQL Server 实例。请重新输入该命令,并且指定此服务器实例托管其中一个副本。此副本将是初始主副本。
- 如何查看自己SQL Server服务器上的ServerName,请执行以下SQL语句:
SELECT @@SERVERNAME AS 'ServerName';
- 执行后,三台服务器分别输出:
WIN-QOTTULEM2MD
WIN-A9I9Q6PR4DL
WIN-9VFMKPKSUQ5
2.6 其他节点上加入可用性组
- 在另外两台服务器192.168.3.29和192.168.3.30上分别执行以下SQL语句:
ALTER AVAILABILITY GROUP [AG_Group] JOIN;
ALTER AVAILABILITY GROUP [AG_Group] GRANT CREATE ANY DATABASE;
2.7 创建侦听器
- 在192.168.3.28主节点上执行以下SQL语句:
ALTER AVAILABILITY GROUP [AG_Group]
ADD LISTENER 'AG_Listener' (WITH IP ((N'192.168.3.31', N'255.255.255.0')),PORT = 1433
);
- 到此为止,我们的高可用集群就搭建完成了,接下来我将会为大家讲解,如何将192.168.3.28上的数据库JuCheap5加入到集群中。
三、将数据库加入集群
- 按照下图,使用SQL Server Management Studio就可以将已有的数据库,加入到高可用组里面(添加之前记得先使用完整模式备份数据库),如下图:
四、表结构和数据的同步
- 接下来,我们查看下数据表结构和数据的同步,录一个简单的操作视频,如下: