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

生产环境 alwayson 部署记录及日常管理操作

Ty3306 2023-08-24
1965

1. 介绍

1.1 高可用概述

  • 高可用性HA(High Availability)

实时保证数据库在运行,不间断的对外提供服务。在突发情况下,用户无感知或非常快的继续对外提供服务。

-- 强调数据业务连续性;


  • 灾难恢复DR(Disaster Recovery)

当设备、数据库自身出现问题时或者不可预知的灾难,使数据库无法继续运行,要尽快的恢复全部数据或尽快能少的丢失数据,继续对外提供服务。

-- 强调数据的安全性


1.2 与其他 HA 架构对比







2. AlwaysOn 使用场景

- 希望数据库有多个节点,保证数据库安全性;
- 希望数据库实现高可用性,能自动、手动实现主备切换;
- 希望提高数据库的负载,实现读写分离;
- 希望实现远程灾备,并在异地做读查询;
- 希望发生故障转移时,相关联的一组数据库一起故障转移;
- 希望发生故障转移时,前后端不需要人为参与,保证业务的连续性;


优点

  1. 不用共享存储

  2. 辅助节点可以提供读

  3. 可同步、异步


3. 环境准备

DB NameOSIPComment
TYDB006Windows Server 2019 Data CenterPublic : 192.168.10.18 Private :10.10.10.20主节点(同步)
TYDB007Windows Server 2019 Data CenterPublic :192.168.10.19 Private :10.10.10.21辅助接点(同步)
TYDB008Windows Server 2019 Data CenterPublic :192.168.10.20 Private :10.10.10.16辅助接点(异步)
alwayson_clusterN/APublic :192.168.10.41集群 VIP
AD01Windows Server 2019 Data CenterPublic :192.168.10.10域控
tydbN/APublic :192.168.10.88侦听器 VIP
域名:ty.com
可用性组名称:AG01
SQL Server 版本:2019
SSMS 版本:18.9.2



4. 操作系统环境设置

  1. 加域控

  2. 网卡配置

  3. 数据存放路径创建

  4. 程序安装放 D 盘(还没测试)

以上设置这里就不演示了。


5. 创建 Windows 故障转移群集

每个节点上最好保持数据库文件的存放路径一致,否则以后添加数据文件时会出现辅助节点挂起的情况。如果出现这种情况,则只能先删除辅助数据库,然后重新备份数据库到辅助节点还原,再重新添加辅助接点。

5.1 安装系统服务

每个节点用本地管理员安装故障转移集群服务

在 Server Manager 中添加系统服务 Failover Clustering 、 Telnet Client







5.2 检查服务是否安装成功

安装完成后打开 Failover Cluster Manager



5.3 创建集群

该步只需在其中一个节点完成

域账号下完成





这里是实验环境就不验证了,上面选no,生产环境的话还是要验证下



由于我们当前还没有任何存储,所以这里 Add all eligible storage to cluster 不要勾选



5.4 添加仲裁见证





如果是2节点+共享文件夹,则选 Configure a file share witness

如果是3节点,则选 Do not configure a quorum witness


5.5 检查集群





在其他节点上打开 Failover Cluster Manager 也可以连接到创建的集群




至此,恭喜 Windows 故障转移群集搭建成功!


6. 安装 SQL Server

这里安装的是 SQL Server 2019,就不演示了,安装成功即可。

功能尽量全部安装,安装好后把暂时不用的服务禁用即可。


7. 安装 SSMS

这里安装的是 SQL Server 2019,所以要单独 SSMS ,双击安装文件,一直下一步就行了,就不演示了,安装成功即可


8. 搭建 AlwaysOn

用域账号登陆每个节点(域账号要有管理员权限)


8.1 sqlserver 服务改用域账号启动

每个节点都需要改,改完后需重启服务



8.2 启用 AlwaysON 功能

每个节点都需要启用,改完后需重启服务


8.3 测试各节点相互连通性



8.4 验证 AlwaysOn 是否可用


如果点击 Always On High Availability 这个不报错,则说明 OK

如果不成功则可能出现如下报错:



8.5 创建测试数据

create database test1
create database test2
create table test1.dbo.t1(id int)
create table test1.dbo.t2(id int)
create table test2.dbo.t3(id int)
create table test2.dbo.t4(id int)
insert into test1.dbo.t1 values(1)
insert into test1.dbo.t1 values(2)
insert into test1.dbo.t2 values(3)
insert into test1.dbo.t2 values(4)
insert into test2.dbo.t3 values(5)
insert into test2.dbo.t3 values(6)
insert into test2.dbo.t4 values(7)
insert into test2.dbo.t4 values(8)


8.6 创建可用性组





这里提示先要进行一次全备份

backup database test1 to disk='C:\software\test1_full.bak'
backup database test2 to disk='C:\software\test2_full.bak'

点刷新,再次验证


选择需要加入可用性组的数据库


如果选自动故障转移,则必须是同步的



Listener、Read-Only Routing 暂不修改


这里有两种方法进行同步:

- Full database and log backup:该方法适用于小数据库,不用提前备份数据,只需要新建一个共享文件,用于数据同步即可。
- Join only:该方法适合大数据库,可提前对数据库进行备份,先还原到辅助节点,然后直接配置 AlwaysOn 即可,可减少作业时间。

根据情况,选择合适的选项





8.7 检查状态


同样的,其他节点上也可以查看该可用性组的状态


8.8 添加侦听器



端口号根据自己情况修改


验证是否可以通过 Listener 连接 DB



9. AlwaysOn 管理

9.1 添加新数据库到可用性组

这里以把 test3 加入到可用性组中为例












9.2 从组中删除某个数据库




9.3 手动故障转移



有勾的是同步的,表示无数据丢失,有警告的是异步的,可能有数据丢失(但也可以选)




这个时候可以看到主节点在 TYDB007 上了



9.4 自动故障转移

验证方法就是把主节点关机或关闭主节点上的 SQL Server 服务


9.5 删除辅助节点







9.6 添加辅助节点















9.7 配置只读路由

先决条件


9.7.1 两节点配置脚本

配置脚本

ALTER AVAILABILITY GROUP [testAG]  
MODIFY REPLICA ON N'TYDB006' WITH   (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));  

ALTER AVAILABILITY GROUP [testAG]   MODIFY REPLICA ON  N'TYDB006' WITH   
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://TYDB006.ty.com:1433'));  
  
ALTER AVAILABILITY GROUP [testAG] 
MODIFY REPLICA ON  N'TYDB007' WITH   (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));  

ALTER AVAILABILITY GROUP [testAG]  MODIFY REPLICA ON  N'TYDB007' WITH   
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://TYDB007.ty.com:1433'));  
  
ALTER AVAILABILITY GROUP [testAG]   
MODIFY REPLICA ON  N'TYDB006' WITH   (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('TYDB007','TYDB006')));  
  
ALTER AVAILABILITY GROUP [testAG]   
MODIFY REPLICA ON  N'TYDB007' WITH   (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('TYDB006','TYDB007')));  
GO  


9.7.2 三节点配置脚本

# 查询可用性副本信息
SELECT * FROM master.sys.availability_replicas

# 建立read指针 - 在当前的primary上为每个副本建立副本对于的tcp连接
ALTER AVAILABILITY GROUP [Alwayson22]
MODIFY REPLICA ON N'db01' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://db01.ag.com:1433'))

ALTER AVAILABILITY GROUP [Alwayson22]
MODIFY REPLICA ON N'db02' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://db02.ag.com:1433'))

ALTER AVAILABILITY GROUP [Alwayson22]
MODIFY REPLICA ON N'db03' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://db03.ag.com:1433'))

# 为每个可能的primary role配置对应的只读路由副本
# list列表有优先级关系,排在前面的具有更高的优先级,当db02正常时只读路由只能到db02,如果db02故障了只读路由才能路由到DB03
ALTER AVAILABILITY GROUP [Alwayson22]
MODIFY REPLICA ON N'db01' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('db02','db03')));

ALTER AVAILABILITY GROUP [Alwayson22]
MODIFY REPLICA ON N'db02' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('db01','db03')));

# 查询优先级关系
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


9.7.3 只读副间的负载均衡

ALTER AVAILABILITY GROUP [Alwayson21]
MODIFY REPLICA ON N'HD21DB01' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('HD21DB02','HD21DB03','HD21DB04'),'HD21DB01')));

ALTER AVAILABILITY GROUP [Alwayson21]
MODIFY REPLICA ON N'HD21DB02' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('HD21DB01','HD21DB03','HD21DB04'),'HD21DB02')));

# 当HD21DB01作为主节点时,HD21DB02,HD21DB03,HD21DB04平均分摊读的压力,当HD21DB02,HD21DB03,HD21DB04都无法访问时读连接访问HD21DB01;


查看路由信息

SELECT * FROM sys.availability_read_only_routing_lists 
SELECT read_only_routing_url,* FROM sys.availability_replicas


9.7.4 总结

从上面我们可以看到只读路由的读写分离是通过连接属性ApplicationIntent=ReadOnly\ReadWrite使得连接是连向主副本还是辅助副本,这意味着需要在应用端配置多个连接串手动的配置代码是走写还是只读。这也就是为什么一开始我说这是半读写分离的原因。还有一个缺陷就是虽然配置了两个只读副本,但是每次只有优先级高的那个只读副本能提供只读连接,只有当优先级高的那个只读副本故障了才能路由到下一个只读副本。这也就意味着当前只有2个副本在提供读写操作,多个只读副本之间不能做到同时提供读操作的负载均衡。



9.8 更改副本的可用性模式

先决条件

必须连接到承载主副本的服务器实例。



权限

对可用性组要求: 

  • ALTER AVAILABILITY GROUP 权限 
  • CONTROL AVAILABILITY GROUP 权限 
  • ALTER ANY AVAILABILITY GROUP 权限 或 CONTROL SERVER 权限。


9.8.1 使用 SSMS 更改





9.8.2 使用 T-SQL 更改

ALTER AVAILABILITY GROUP [<availability_group_name>] MODIFY REPLICA ON '*server_name*'  
WITH ( AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT)

ALTER AVAILABILITY GROUP [<availability_group_name>] MODIFY REPLICA ON '*server_name*'  
WITH ( FAILOVER_MODE = MANUAL );

# 其中,“group_name”为可用性组的名称,“server_name”为承载要修改的副本的服务器实例的名称。
# 指定 AVAILABILITY_MODE = SYNCHRONOUS_COMMIT 时 FAILOVER_MODE = AUTOMATIC 才受支持。

在 AccountsAG 可用性组的主副本上输入的以下示例,针对 INSTANCE09 服务器实例承载的副本,将可用性模式和故障转移模式分别更改为同步提交和自动故障转移。
ALTER AVAILABILITY GROUP AccountsAG MODIFY REPLICA ON 'INSTANCE09'  
   WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);  
ALTER AVAILABILITY GROUP AccountsAG MODIFY REPLICA ON 'INSTANCE09'  
   WITH (FAILOVER_MODE = AUTOMATIC);


9.9 配置副本备份

这里最好还是在主副本上执行备份

先决条件

必须连接到在 SSMS 中承载主副本的服务器实例。 次要副本必须正常,这包括连接到当前主要副本并处于辅助角色。



9.10 配置只读访问副本



  • 对于辅助角色,从 “可读取辅助角色” 下拉列表中选择一个新值,如下所示:

    否: 不允许与此副本的辅助数据库的用户连接。 它们不可用于读访问。 这是默认设置。

    仅限读意向: 仅允许与此副本的辅助数据库的只读连接。 辅助数据库全都可用于读访问。

    是:允许与此副本的辅助数据库的所有连接,但仅限读访问。 辅助数据库全都可用于读访问。


  • 对于主角色,从 “主角色中的连接” 下拉列表中选择一个新值,如下所示:

    允许所有连接: 主副本中的数据库允许所有连接。 这是默认设置。

    允许读/写连接:在 Application Intent 属性设置为 ReadWrite 或者未设置 Application Intent 连接属性时,将允许连接。 不允许 Application Intent 连接属性设置为 ReadOnly 的连接。 这可帮助阻止客户错误地将读意向工作负荷连接到主副本。


9.11 更改会话超时期限


会话超时期限是一个副本属性,用来控制可用性副本等待已连接副本的 ping 响应的时间(秒数),超过该期限则认为连接已失败。 默认情况下,副本等待 ping 响应的时长为 10 秒钟。 此副本属性仅适用于可用性组的给定辅助副本与主副本之间的连接

先决条件

- 您必须连接到承载主副本的服务器实例。



建议

我们建议您将超时期限保持为 10 秒或更长。 如果将值设置为低于 10 秒,则可能使高负荷系统丢失 PING 并声明错误故障。



权限

对可用性组要求 ALTER AVAILABILITY GROUP 权限、CONTROL AVAILABILITY GROUP 权限、ALTER ANY AVAILABILITY GROUP 权限或 CONTROL SERVER 权限。


T-SQL:ALTER AVAILABILITY GROUP AccountsAG MODIFY REPLICA ON 'INSTANCE09' WITH (SESSION_TIMEOUT = 15);  


9.12 sqlserver 升级


https://learn.microsoft.com/zh-cn/sql/database-engine/availability-groups/windows/upgrading-always-on-availability-group-replica-instances?view=sql-server-ver15

这里说的是可用性组各节点需要升级 sqlserver 版本的情况



10.监控

10.1 仪表盘

条件
您必须连接到承载可用性组的主副本或辅助副本的 SQL Server 实例(服务器实例)。

权限
需要 CONNECT、VIEW SERVER STATE 和 VIEW ANY DEFINITION 权限。


启动仪表盘



更改仪表盘选项

工具 --> 选项 --> SQLServer Always On --> 面板



10. 注意

10.1 不修改端口号

安装完 SQL Server 的时候不要修改端口号(或者新增其他端口),如果修改了,以后在向可用性组中添加副本时无法连接其他节点(在连接时不能修改连接名),

如图:


因为这里不能改,如果以前修改过端口号,则这里连不上
如果要改端口号,则在创建侦听器的时候改




「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论