MySQL:orch+proxy测试

159 阅读4分钟

自建数据库高可用架构升级前测试,本文主要测试可用性,说明:高可用升级说明

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.主从同时不可读写故障

直接不可用