自建数据库高可用架构升级前测试,本文主要测试可用性,说明:高可用升级说明
mysql为一主两从,这里仅模拟mysql侧故障;代码为go使用原生的sql连接工具
先说结论:
1.确保程序有重连机制
2.注意故障库重新接入集群的时机和设置
3.确保proxy延迟故障避开时机
| 故障场景 | 严重程度 | 测试总结 |
|---|---|---|
| 主库不可读写 | p1,可事后响应 | orch做主从切换,业务连接proxysql不受影响,但会告警错误连接被重置;故障库修复前需要将proxysql中权重设为0,待修复重建后在置为1 |
| 主库不可写 | p1,需立即响应 | 读操作不受影响,如果有写操作则会报错导致程序与服务断连 |
| 从库之一不可读 | p2,可事后响应 | 读写不受影响,但会告警错误连接被重置;故障从库启动前必须设为设置只读 |
| 全部从库不可读 | p2,可事后响应 | 读写不受影响,但会告警错误连接被重置;故障从库启动前必须设为设置只读 |
| 从库复制链路延迟 | p2,可事后响应 | 查询均已避开延迟从库 |
| 从库复制链路损坏 | p2,可事后响应 | 设置延迟59s避开从库,即可避开故障从库;如果没设置则会连接上故障从库 |
| 主从同时不可读写 | p1,需立即响应 | 直接不可用 |
1.主库不可读写
1.1故障前后
当前主从关系:
主:172.30.0.44:3310
从:172.30.0.44:3311,172.30.0.44:3312
主库shutdown后
orch的主从拓扑发生变化
proxysql正常访问到数据库可以读写,还会报出连接重置告警
closing bad idle connection: connection reset by peer
1.2修复故障前
此时proxysql中还配置有主库的信息,如果直接启动主库,proxysql立刻分配路由到故障的主库上,导致读取到旧数据,需要在proxysql的将故障库的权重设置为0
update mysql_servers set weight=0 where port=3310;
load mysql servers to runtime;
SAVE MYSQL servers TO DISK;
select * from runtime_mysql_servers;
1.3修复故障后
将故障库修复好之后(启动,重新搭建主从完成),再将proxysql的旧主的权重设为1
update mysql_servers set weight=1 where port=3310;
load mysql servers to runtime;
SAVE MYSQL servers TO DISK;
select * from runtime_mysql_servers;
2.主库不可写
当前主从关系:
主:172.30.0.44:3312
从:172.30.0.44:3311,172.30.0.44:3310
主库设置为只读的话则报错,其中的hostgroup 1 是writer组
Max connect timeout reached while reaching hostgroup 1 after 10000ms
修复的话需要将主库的read_only=0即可
建议在proxysql侧对做监控runtime_mysql_servers表,如果hostgroup_id的字段全部都是2则报警
3.从库之一不可读
前主从关系:
主:172.30.0.44:3312
从:172.30.0.44:3311,172.30.0.44:3310
从库之一172.30.0.44:3310不可读
程序最开始是连接到172.30.0.44:3310,之后172.30.0.44:3310故障了则会将连接重新连接到172.30.0.44:3311
读写不受影响,但会收到告警
4.全部从库不可读
前主从关系:
主:172.30.0.44:3312
从:172.30.0.44:3311,172.30.0.44:3310
程序最开始是连接到172.30.0.44:3310,之后172.30.0.44:3310和故障了则会将连接重新连接到172.30.0.44:3312
读写不受影响,但会收到告警
5.从库复制链路延迟
前主从关系:
主:172.30.0.44:3312
从:172.30.0.44:3311,172.30.0.44:3310
设置172.30.0.44:3311延迟120s
stop slave ;change master to master_delay=12000;start slave ;
多次测试均已避开延迟从库
6.从库复制链路损坏
前主从关系:
主:172.30.0.44:3312
从:172.30.0.44:3311,172.30.0.44:3310
proxysql的mysql_servers的max_replication_lag设置为59s,
将172.30.0.44:3311主从复制停止(stop slave)或者往从库写入数据,后查询均比连接到172.30.0.44:3311上,proxysql的mysql_server_replication_lag_log字段repl_lag上始终延迟为60说明是故障
select * from monitor.mysql_server_replication_lag_log order by time_start_us desc limit 3;
+-------------+------+------------------+-----------------+----------+-------+
| hostname | port | time_start_us | success_time_us | repl_lag | error |
+-------------+------+------------------+-----------------+----------+-------+
| 172.30.0.44 | 3310 | 1732100744540055 | 299 | 0 | NULL |
| 172.30.0.44 | 3311 | 1732100744540048 | 244 | 60 | NULL |
| 172.30.0.44 | 3312 | 1732100744539961 | 298 | NULL | NULL |
+-------------+------+------------------+-----------------+----------+-------+
7.主从同时不可读写故障
直接不可用