作者:俊达
如上图架构,当后端MySQL主库出现问题,发生主备切换后,如何自动将ProxySQL的读写切换到新的主库上?
可以通过mysql_replication_hostgroups表配置实现:
insert into mysql_replication_hostgroups
(writer_hostgroup, reader_hostgroup, check_type, comment)
values(100, 101, 'read_only', 'mysql mm cluster');
load mysql servers to runtime;
save mysql servers to disk;
将主库和备库的hostgroup配置到mysql_replication_hostgroups表中后,proxysql会检测主备库的read_only状态。
- 当检测到read_only从OFF变成ON时,会将writer_hostgroup中的主机添加的reader_hostgrup中。
- 当检测到read_only从ON变成OFF时,会将主机从reader_hostgroup中移到writer_hostgroup中。
当一个后端mysql实例的read_only状态从ON变成OFF时,会将该实例加入到writer_hostgroup中,同时该实例依然位于read_hostgroup中:
mysql> select hostgroup_id, hostname, port , status from runtime_mysql_servers where hostgroup_id in (100,101);
+--------------+----------------+------+--------+
| hostgroup_id | hostname | port | status |
+--------------+----------------+------+--------+
| 100 | 172.16.121.237 | 3380 | ONLINE |
| 101 | 172.16.121.236 | 3380 | ONLINE |
| 101 | 172.16.121.237 | 3380 | ONLINE |
+--------------+----------------+------+--------+
可以看到,节点172.16.121.237:3380 同时位于两个hostgroup。
如果需要将该实例从read hostgroup中移除,需要将参数mysql-monitor_writer_is_also_reader设置为false:
set mysql-monitor_writer_is_also_reader='false';
load mysql variables to runtime;
然后再重新加载mysql server,就可以将设置了read_only状态的后端实例从read hostgroup中移除。
mysql> load mysql servers to runtime;
Query OK, 0 rows affected (0.00 sec)
mysql> select hostgroup_id, hostname, port , status from runtime_mysql_servers where hostgroup_id in (100,101);
+--------------+----------------+------+--------+
| hostgroup_id | hostname | port | status |
+--------------+----------------+------+--------+
| 100 | 172.16.121.237 | 3380 | ONLINE |
| 101 | 172.16.121.236 | 3380 | ONLINE |
+--------------+----------------+------+--------+
2 rows in set (0.00 sec)
proxysql只根据后端mysql的read_only状态来判断将实例放到write hostgroup或read hostgroup。所以需要正确地设置read_only状态。
如果主备实例都设置了read_only=OFF,则会发生双写,容易引起数据不一致。
如果在备库复制有延迟或备库复制中断的情况下,将备库的read only设置为OFF,同样也可能会引起数据不一致。
后端MySQL实例的高可用,需要借助其它方式来实现,如MHA。或者使用MySQL Group Replication。
更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。