基于案例分析 MySQL Group Replication 的故障检测流程

故障检测(Failure Detection)是 Group Replication 的一个核心功能模块 , 通过它可以及时识别集群中的故障节点 , 并将故障节点从集群中剔除掉 。如果不将故障节点及时剔除的话 , 一方面会影响集群的性能 , 另一方面还会阻止集群拓扑的变更 。
下面结合一个具体的案例 , 分析 Group Replication 的故障检测流程 。
除此之外 , 本文还会分析以下问题 。

  1. 当出现网络分区时 , 对于少数派节点 , 会有什么影响?
  2. 什么是 XCom Cache?如何预估 XCom Cache 的大小?
  3. 在线上 , 为什么 group_replication_member_expel_timeout 不宜设置过大?
案例以下是测试集群的拓扑 , 多主模式 。
主机名IP角色node1192.168.244.10PRIMARYnode2192.168.244.20PRIMARYnode3192.168.244.30PRIMARY本次测试主要包括两步:
  1. 模拟网络分区 , 看它对集群各节点的影响 。
  2. 恢复网络连接 , 看看各节点又是如何反应的 。
模拟网络分区首先模拟网络分区故障 , 在 node3 上执行 。
# iptables -A INPUT  -p tcp -s 192.168.244.10 -j DROP# iptables -A OUTPUT -p tcp -d 192.168.244.10 -j DROP# iptables -A INPUT  -p tcp -s 192.168.244.20 -j DROP# iptables -A OUTPUT -p tcp -d 192.168.244.20 -j DROP# date "+%Y-%m-%d %H:%M:%S"2022-07-31 13:03:01其中 , iptables 命令会断开 node3 与 node1、node2 之间的网络连接 。date 记录了命令执行的时间 。
命令执行完 5s(这个时间是固定的 , 在源码中通过 DETECTOR_LIVE_TIMEOUT 指定) , 各个节点开始响应(从各节点的日志中可以观察到这一点)
首先看看 node1 的日志及集群状态 。
2022-07-31T13:03:07.582519-00:00 0 [Warning] [MY-011493] [Repl] Plugin group_replication reported: 'Member with address 192.168.244.30:3306 has become unreachable.'【基于案例分析 MySQL Group Replication 的故障检测流程】mysql> select member_id,member_host,member_port,member_state,member_role from performance_schema.replication_group_members;+--------------------------------------+----------------+-------------+--------------+-------------+| member_id                            | member_host    | member_port | member_state | member_role |+--------------------------------------+----------------+-------------+--------------+-------------+| 207db264-0192-11ed-92c9-02001700754e | 192.168.244.10 |        3306 | ONLINE       | PRIMARY     || 2cee229d-0192-11ed-8eff-02001700f110 | 192.168.244.20 |        3306 | ONLINE       | PRIMARY     || 4cbfdc79-0192-11ed-8b01-02001701bd0a | 192.168.244.30 |        3306 | UNREACHABLE  | PRIMARY     |+--------------------------------------+----------------+-------------+--------------+-------------+3 rows in set (0.00 sec)从 node1 , node2 的角度来看 , 此时 node3 处于 UNREACHABLE 状态 。
接下来看看 node3 的 。

经验总结扩展阅读