AlwaysOn可用性组搭建

前言

关于AlwaysOn高可用性组的官方介绍

关于SQL Server高可用性的相关概念

​ AlwaysOn利用了Windows 故障转移群集(FCI)的健康监测和自动故障转移的特性,所以AlwaysOn需要建立在Windows故障转移群集之上。关于故障转移群集的搭建在之前的文章有介绍(故障转移群集搭建)。但是和故障转移群集不同的地方是,可用性组不需要存放在共享存储上。另外,可用性组是数据库层面的,故障转移群集是实例层面的。

有五个副本的可用性组

分布式 AG

特点:

  • AlwaysOn支持故障转移群集
  • 多个用户数据库可以一同进行故障转移
  • 每个辅助服务器上都有一份数据的拷贝,可以使服务器上的数据拷贝和主服务器上的数据完全同步
  • 辅助服务器可用于只读的访问请求
  • ……

大致步骤如下

  • 安装4台Windows Server2019服务器。
  • 配置主机、网卡
  • 安装AD域、DNS,添加域
  • 安装故障转移群集
  • 安装SQL Server
  • 配置AlwaysOn可用性组
  • 配置读写分离路由

服务器配置

演示配置为Windows Server 2019 DataCenter2核4G硬盘100G,双网卡,Administrator密码需要配置一致。

节点 主机名 public ip private ip 群集ip 侦听器 DNS
ws11 ws11 192.168.1.11 10.10.10.11 192.168.1.15 192.168.1.16 192.168.1.20
ws12 ws12 192.168.1.12 10.10.10.12 192.168.1.15 192.168.1.16 192.168.1.20
ws13 ws13 192.168.1.13 10.10.10.13 192.168.1.15 192.168.1.16 192.168.1.20
ws20 ws20 192.168.1.20 10.10.10.20 - - 192.168.1.20

注意:后续操作没有特殊说明3节点均需配置

配置域控

ws20作为域控服务器。

IP和DNS配置

配置网卡属性:

配置IP地址:192.168.1.20,并将DNS设置为本机IP

image-20211210160647337

无域控DNS配置:https://www.cnblogs.com/DragonStart/p/8275182.html

AD & DNS安装

打开服务器管理器,添加角色和功能向导,选择添加 Active Directory域服务DNS 服务器

image-20211201202841391

安装完成后,选择将此服务器升级为域控制器

image-20211201203328080

配置域控

点击添加新林,自定义一个根域名

image-20211201203602401

下一步,设置DNS密码

image-20211201210755796

后续步骤默认,点击安装

image-20211201211327973

安装完成后会自动重启,并使用域账户登录

查看电脑属性,可以看到ws20节点已经加入域

image-20211210162246204

节点加入域

更改DNS,设置为域控服务器IP,ws11ws12ws13节点均操作

image-20211210163048875

打开计算机属性,更改主机名并加入

image-20211210163229691

输入域控服务器用户名和密码

image-20211210163317769

故障转移群集配置

网卡配置

ws11ws12ws13节点均操作

重命名网卡:

image-20211202101040029

public网卡:

跃点设置为:5

image-20211202101150519

pirvate网卡:

设置跃点为:75

image-20211210171252768

取消DNS注册

image-20211202101436509

禁用NetBIOS

image-20211202101526718

查看:

1
get-netipinterface

image-20211202101716057

安装故障转移群集

安装

3个节点安装故障转移群集

新建角色和功能向导,选择故障转移群集

image-20211202102733214
配置

服务器管理器面板 -> 工具,打开故障转移群集管理器

image-20211202103144127

选择创建群集

image-20211211102905894

把3个节点都加入群集

image-20211202103337978

可以选择是否要运行测试

image-20211202104126258

配置集群地址

image-20211202104427813

查看群集状态

image-20211211105749127

DNS中已经添加了群集的解析:

image-20211211152156209

仲裁配置

可以看到,群集的见证是没有的:

image-20211211151112296

添加一个共享文件夹做仲裁文件夹:ws20节点

关于仲裁:https://www.cnblogs.com/ljhdo/p/5652643.html

image-20211211151229090

配置仲裁

右键群集,选择更多操作,点击配置群集仲裁设置

image-20211211151321318

选择仲裁见证

image-20211211151409823

选择使用共享文件见证

image-20211211151444295

选择在ws20节点配置的共享文件夹

默认下一步,安装

安装完成后可以看到文件共享见证

image-20211211151616739

数据库安装

添加域用户

AD中添加一个域用户

image-20211211151936934 image-20211211151914110

其他三个节点均添加此域用户

image-20211211152039971

安装

3节点均需安装

选择全新安装

image-20211211162839680

选择安装功能

根据实际需求选择安装功能,数据库引擎服务是必须的

image-20211211163624854

实例配置

三节点均使用默认实例配置

image-20211211171142018

服务器配置

使用域用户登录

image-20211211173957657

数据库引擎配置

服务器配置:选择混合模式登录,管理员添加本机管理员以及域用户

image-20211211174318402

数据目录:

可以自定义数据文件存储位置

image-20211211174423423

TempDB:

将TempDB的初始大小可以按实际需求设置初始大小

image-20211211174540873

安装

image-20211211174914993 image-20211212144604044

Always On 配置

启用AlwaysOn

打开配置管理器

image-20211212150735055

image-20211212150811047

注意:开启后重启SQL Server服务,三个节点都需要打开。

创建数据库

连接到3个节点的数据库

image-20211212152510363

创建2个测试数据库:ws21节点

image-20211212152847643

创建测试数据:

1
2
3
4
5
6
7
8
9
10
11
use jontydb
create table Employee (id int primary key identity,name varchar(20))
go

insert into Employee values('jonty1')
insert into Employee values('jonty2')
insert into Employee values('jonty3')
insert into Employee values('jonty4')
go

select * from Employee

备份数据库

对新建的2个数据库进行全备

image-20211212153406168

备份类型选择完整

介质选项备份选项按需求配置

image-20211212153551144

可以配置备份文件存放位置,方便管理

image-20211212153700280

新建可用性组

右键AlwaysOn高可用性,选择向导

image-20211212154002973

可用性组名称,勾选数据库级别运行状况检测

image-20211212154121519

选择要添加到可用性组的数据库

image-20211212154200085

指定副本

点击添加副本,将ws12ws13节点添加为副本,并设置自动故障转移可读辅助副本

image-20211212154308677

端点

使用私有网卡

image-20211212154626198

备份首选项

选择任意副本

image-20211212154745535

侦听器只读路由稍后配置。

数据同步

选择完整的数据库和日志备份,这里在域服务器创建了一个共享目录,可使用备份服务器同步

image-20211212155405079

验证

image-20211212155537431

运行下一步,完成配置

image-20211212155658350

查看是否配置成功:

辅助节点的数据库已经同步

image-20211212155829069

创建侦听器

image-20211212160001906

DNS中可以看到侦听器已经添加进去了

image-20211212160106551

面板查看

image-20211212160409506

连接可用性组

使用创建的侦听器地址连接

测试可用性组

ws11节点插入数据

1
2
3
4
5
select * from Employee

select @@SERVERNAME -- ws11

insert into Employee values('always on')

image-20211212161052133

其他副本查看是否同步

image-20211212161020941

故障转移测试

使用host机器连接到可用性组

1
select @@SERVERNAME  -- 查看当前主机

当前主节点为:ws11

image-20211212165938337

ws11节点关闭

image-20211212170052511

测试查询:

可以看到主节点已经转移到ws12Always on已经自动故障转移切换

image-20211212170210354

我们在ws12节点添加几条数据

1
2
3
insert into Employee values('restart always on')
insert into Employee values('restart always on2')
insert into Employee values('restart always on3')

重新启动ws11节点,查看副本数据是否同步

节点已经恢复

image-20211212170749810

image-20211212170836596

查看故障节点ws11的数据,可以看到已经恢复同步

image-20211212171600016

手动故障转移

我们把ws11节点关闭后,Always on自动故障转移,现在主节点:ws12

image-20211212171840132

我们可以手动切换回ws11节点,右键可用性组,选择故障转移

image-20211212171923827

选择ws11为新的主副本

image-20211212172025348

完成

image-20211212172103932

刷新可用性组,可以看到已经切换到ws11节点

image-20211212172120377

读写分离 & 负载均衡

配置可读辅助副本

image-20211212173349400

查看路由配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select * from master.sys.availability_replicas  -- 查看可用性副本

-- 查看路由
SELECT ar.replica_server_name ,
rl.routing_priority ,
( SELECT ar2.replica_server_name
FROM sys.availability_read_only_routing_lists rl2
JOIN sys.availability_replicas AS ar2 ON rl2.read_only_replica_id
= ar2.replica_id
WHERE rl.replica_id = rl2.replica_id
AND rl.routing_priority = rl2.routing_priority
AND rl.read_only_replica_id = rl2.read_only_replica_id
) AS 'read_only_replica_server_name'
FROM sys.availability_read_only_routing_lists rl
JOIN sys.availability_replicas AS ar ON rl.replica_id = ar.replica_id

配置可用性组时没有配置路由:

image-20211212163928361

配置路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-- 建立读指针,为当前主节点上每个副本创建副本对应的TCP连接
ALTER AVAILABILITY GROUP [jontyag1]
MODIFY REPLICA ON
N'ws11' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://ws11.jonty.com:1433'))

ALTER AVAILABILITY GROUP [jontyag1]
MODIFY REPLICA ON
N'ws12' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://ws12.jonty.com:1433'))

ALTER AVAILABILITY GROUP [jontyag1]
MODIFY REPLICA ON
N'ws13' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://ws13.jonty.com:1433'))


-- 配置只读路由副本
ALTER AVAILABILITY GROUP [jontyag1]
MODIFY REPLICA ON
N'ws11' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('ws12','ws13'),'ws11')));

ALTER AVAILABILITY GROUP [jontyag1]
MODIFY REPLICA ON
N'ws12' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('ws11','ws13'),'ws12')));

ALTER AVAILABILITY GROUP [jontyag1]
MODIFY REPLICA ON
N'ws13' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('ws11','ws12'),'ws13')));

image-20211212164241842

查看可用性组属性:

可以看到路由已经配置完成,可以按照需求更改

image-20211212164327405

测试:

可以看到查询的主机是在两个副本直接切换的,实现读均衡

1
sqlcmd -S agvip1 -K ReadOnly -d jontydb -Q "select @@servername"
image-20211212165124505

测试写入操作

手动连接到ws12只读节点,执行

1
2
use employeedb
insert into Employee values('read only')

可以看到,只读节点是不允许插入数据的

image-20211212172911057

写在最后

  • 本文是使用1个域控服务+3节点配置AlwaysOn高可用性组,基于Win Server2019环境。

如果域控服务器挂了那不是就挂了?

这个时候又可以考虑再添加一个域控,用双域,域弄一个备份域。

域控服务器挂了 只是用户认证有问题,不影响 集群

  • 3节点情况下配置了读写分离实现负载均衡,2节点则不必要,保证故障转移即可。

  • 在写这篇教程之前配置了无域控双节点AlwaysOn,大概讲一下思路

    双节点安装DNS,添加解析(相互配置包括本机),参考博客:https://www.cnblogs.com/DragonStart/p/8275182.html

​ 后续安装故障转移群集和AlwaysOn配置操作都差不多。

  • 添加新的节点,把之前节点做的操作执行一遍,包括配置DNS、加入域、加入群集,安装数据库、打开AlwaysOn,然后就是可用性组添加副本。
  • 删除副本、可用性组,直接右键删除就好。
  • 添加新的数据库到可用性组,记得全备。

AlwaysOn 到此结束