在三台服务器上分别配置计算机的 DNS 后缀,注意在同个工作组、计算机名区分。
重启计算机使得计算机名改动生效。
网上有些是配置host解析,我这里直接配置去中心化的DNS服务器.。这里三个节点都要分别配置,下面仅列举DB1的配置,其他两台照搬,只是配置的主机名和IP不一样。
新建DNS的正向查找区域,名称跟dns后缀一样
新建DNS反向查找区域,IP是内网IP段前三节反过来
在正向查找区域的sqltest.com中新建主机,把除了自己节点的其他IP都配置上。如DB2,DB3,Cluster。并勾选创建相关的指针记录,此时反向查找节点中应该会自动创建相关的PTR指针记录。
在反向查找区域的99.168.192种新建指针(应该只用新建本机这一个就可以)。如果其他机器没有,也一并加上
反向查找区域最终配置如下:
到这里DB1节点的DNS相关配置完成,接着配置好DB2和DB3的DNS相关配置。三台节点能根据机器名互相ping通。验证步骤如下:
我们先以DB1节点作为主节点,DB2和DB3作为从节点。在DB1机器上打开故障转移群集管理器,验证三个节点,并创建群集,配置群集名称为cluster,配置群集IP为192.168.99.172。
添加三台节点服务器进行验证
配置集群名称和IP完后,在本机IP中能看到配置的虚拟IP地址
在sqlserver管理器重开启alwayson,并重启sqlserver。
开启后通过ssms连接数据库,在数据库属性中能看到启用HADR状态为True。可以查看节点投票情况和cluster
既然节点没有加入AD,那么久不能用域认证,只能用证书认证,因此需要创建证书和端点。在配置可用性组前各节点进行证书认证信任。
修改 SQL 服务登陆账号为本机管理员账号
创建证书,3个节点都要创建证书,注意修改证书名称,密码可以自定义,但三个节点保持一致。在C盘创建cert文件夹后执行下面语句创建证书:
--节点1:创建主密钥/证书,备份证书。
USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Hcyy,123456';
GO
CREATE CERTIFICATE Cert_db1
WITH SUBJECT = 'Cert_db1',
START_DATE = '2019-07-01',EXPIRY_DATE = '2099-12-30';
GO
BACKUP CERTIFICATE Cert_db1
TO FILE = 'C:\cert\Cert_db1.cer';
GO
三个节点分别创建完证书后,将本机证书拷贝到其他两个节点中,保证三个节点机器上分别都有DB1、DB2、DB3的三个证书。在每个节点机器上运行两次下面的语句加入其他节点的两个证书,注意修改证书名称。
--节点1:创建其他节点证书
USE master;
GO
CREATE CERTIFICATE Cert_db2
FROM FILE = 'C:\cert\Cert_db2.cer';
GO
创建好的证书如下:
在每个节点上重新创建端点,授权账号设置为本机管理员账号,验证方式使用上面创建的证书,注意改变相关节点名称
--节点:创建端点
CREATE ENDPOINT Endpoint_Mirroring
AUTHORIZATION [db1\Administrator]
STATE=STARTED
AS TCP (LISTENER_PORT = 5023, LISTENER_IP = ALL)
FOR DATA_MIRRORING
(ROLE = ALL,AUTHENTICATION = CERTIFICATE Cert_db1, ENCRYPTION = REQUIRED ALGORITHM AES)
GO
如果存在已有的端点,则需要将已有端点删除
先做好相应数据库的完整备份
在主节点DB1服务器操作新建可用性组。
在之前的 AlwaysOn 2012 和 2014 中,如果实例健康出现问题,将触发故障转移。如果有一个数据库有问题,只要实例OK,可用性组就不会故障转移。
在 AlwaysOn 2016 中,勾选之后,不论是一个实例有问题,还是一个或多个数据库有问题,都会发生故障转移。
选择完整备份好的数据库
添加好其他两个从节点的sqlserver副本,勾选自动故障转移,选择可读性副本。
将端点 URL 设置为 IP 方式,这里端点会显示为我们上面创建的端点,登陆账号为我们上面设置的账号
“备份首选项”和“侦听器”不需要设置,保持默认就行,可用性侦听器我们后面再添加,可以直接点击“下一步”
数据同步这里建议使用完整的数据库和日志备份的方式更方便,需要有一个共享文件夹,并且节点服务器要有相同的数据库文件目录结构
等待可用性组创建成功,之后等待数据库主从显示为已同步状态,若未同步成功,可以尝试去从节点的高可用里手动连接主节点请求同步。
一个侦听器包括虚拟IP地址、虚拟网络名称、端口号三个元素,一旦创建成功,虚拟网络名称会注册到DNS中,同时为可用性组资源添加IP地址资源和网络名称资源。用户就可以使用此名称来连接到可用性组中。
添加侦听器
选择使用静态IP
创建成功后,在故障转移集群管理器里的角色节点,可以看到客户端访问名称和IP地址
连接数据库时使用侦听器的地址
SQL Server 2016 支持多个只读副本负载分担只读操作。右键一个可用性副本可以查看副本的只读性设置:
允许所有连接(ALL):主数据库同时允许读写连接和只读连接。这是主角色的默认行为。
仅允许读/写连接(READ_WRITE):允许 ApplicationIntent=ReadWrite 或未设置连接条件的连接。不允许 ApplicationIntent=ReadOnly 的连接。仅允许读写连接可帮助防止客户错误地将读意向工作负荷连接到主副本。
修改脚本:
USE [master]
GO
ALTER AVAILABILITY GROUP [sqlTestAg]
MODIFY REPLICA ON N'DB1' WITH (PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE))
GO
辅助角色支持的连接访问类型:
无连接(NO):不允许任何用户连接。辅助数据库不可用于读访问。这是辅助角色中的默认行为。
仅读意向连接(READ_ONLY):辅助数据库仅接受连接参数 ApplicationIntent=ReadOnly 的连接,其它的连接方式无法连接。
允许任何只读连接(ALL):辅助数据库全部可用于读访问连接。此选项允许较低版本的客户端进行连接。
DB2、DB3修改脚本:
USE [master]
GO
ALTER AVAILABILITY GROUP [sqlTestAg]
MODIFY REPLICA ON N'DB2' WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = READ_ONLY))
GO
Sql Server 配置管理工具找到数据库实例的网络配置,若是动态端口,则改成固定端口1433
执行下面 sql 获取可用性组名称:
select name,* from sys.availability_groups
执行下面 sql 获取要配置的可用性副本名称(服务器实例):
select replica_server_name,* from sys.availability_replicas
为可用性副本(服务器实例)配置只读路由 URL,路由地址可以填 IP 或者计算机名,端口填数据库实例绑定的 TCP/IP 端口。
保存路由URL信息后,再添加只读路由列表
使用SSMS或者EF等需要在连接字符串设置参数ApplicationIntent=ReadOnly
为每个数据库节点配置登陆账号,然后通过监听器使用该账号登陆数据库。
主副本创建登陆账号 satest,添加一个用户映射
查看主库上该账号的 sid 为库名
SELECT * FROM [sqltest]..sysusers
在副本数据库上创建对应账号,其中 sid对应的值是主库上所查到的sid的值
CREATE LOGIN [satest] WITH PASSWORD=N'Hcyy,123456',
SID = 0x417093C3C5DB1449967D89158C552F5F, DEFAULT_DATABASE=[sqltest],
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
设置好角色权限
配合这个项目我写了一个基础的SpringBoot + Druid +Mybatis + SqlServer的读写分离Demo。
Git地址:https://gitee.com/wxdfun/sql-wr.git
效果图如下: