MySQL Group Replication down 机后

2018-02-28 12:20:09 +08:00
 holinhot

目前用 Group Replication 做热备份用,遇到个问题。

3 台服务器组成的集群: mysql1 mysql2 mysql3

其中 mysql1 为 master 提供写入服务,其他节点是从,只读。

当 mysql1 重启服务器,集群内部 master 会自动漂移,会从集群中移除 mysql1。 此时 mysql1 重启后没有自动再次加入集群,加入集群前是可以直接提供写入。

那么问题就来了,此时数据全部写入到了 mysql1 两个问题: 问题 1. mysql1 数据和集群不一致了。 问题 2. 因为 mysql1 数据和集群的不一至导致无法再次加入集群。会提示: 2018-02-28T04:10:02.576953Z 0 [Note] Plugin group_replication reported: 'To force this member into the group you can use the group_replication_allow_local_disjoint_gtids_join option'

当然你可以强制加入集群,但这很容易数据错乱吧。

如果使用 haproxy 做一个 vip 然全部应用使用这个 vip 连 mysql。

但 Grroup Replication 的主切换是在 mysql 内部完成的,haproxy 根本无法知道哪台服务器是主。 稍微看了下那个 ProxySQL 原理好像是代理转发的定时检查哪个是主,然后把 sql 查询转发到主。不知道生产稳定性怎么样

另外我测试了多主模式,数据一致性更难保证。

另外 ProxySQL 这种定时检测切换的好像也有问题:

如定时检测为 30 秒,服务器 1,网络中断 10 秒自动脱离集群。但 ProxySQL 检测间隔问题, 正好没有检测出服务器已经脱离集群,而将 sql 语句发至服务器 1,此时服务器 1 已经恢复,但未加入到集群。于是乎问题来了,1 号服务器数据和集群不一致了。数据乱了

3190 次点击
所在节点    MySQL
3 条回复
runntuu
2018-02-28 15:20:17 +08:00
1.Group Replication 主切换是在 MySQL 内部完成的,但不意味着你不能对节点状态做检查,你可以写脚本。
2.不管是 HAProxy 还是 Keepalived,都可以调用脚本,你可以基于上一步的结果来决定将 VIP 漂移至哪个节点。
所以实现都能实现,只是你对负载均衡工具还不够了解,具体怎么实现去 Google 吧。
holinhot
2018-02-28 18:10:10 +08:00
@runntuu 除了对每条 sql 转发前做点状态做检查,不然还是会出现上面的问题:
如定时检测为 30 秒,服务器 1,网络中断 10 秒自动脱离集群。但 检测间隔问题, 正好没有检测出服务器已经脱离集群,而将 sql 语句发至服务器 1,此时服务器 1 已经恢复,但未加入到集群。于是乎问题来了,1 号服务器数据和集群不一致了。数据乱了
runntuu
2018-03-01 02:10:23 +08:00
@holinhot 不管是 HAProxy 还是 Keepalived 都有自己的机制来做健康检查,但这个机制并不是你说的定时检测。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/433440

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX