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

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

  1. 当出现网络分区时,对于少数派节点 , 会有什么影响?
  2. 什么是 XCom Cache?如何预估 XCom Cache 的大?。?/li>
  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> 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 的 。
2022-07-31T13:03:07.690416-00:00 0 [Warning] [MY-011493] [Repl] Plugin group_replication reported: 'Member with address 192.168.244.10:3306 has become unreachable.'2022-07-31T13:03:07.690492-00:00 0 [Warning] [MY-011493] [Repl] Plugin group_replication reported: 'Member with address 192.168.244.20:3306 has become unreachable.'2022-07-31T13:03:07.690504-00:00 0 [ERROR] [MY-011495] [Repl] Plugin group_replication reported: 'This server is not able to reach a majority of members in the group. This server will now block all updates. The server will remain blocked until contact with the majority is restored. It is possible to use group_replication_force_members to force a new group membership.'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 | UNREACHABLE  | PRIMARY     || 2cee229d-0192-11ed-8eff-02001700f110 | 192.168.244.20 |        3306 | UNREACHABLE  | PRIMARY     || 4cbfdc79-0192-11ed-8b01-02001701bd0a | 192.168.244.30 |        3306 | ONLINE       | PRIMARY     |+--------------------------------------+----------------+-------------+--------------+-------------+3 rows in set (0.00 sec)

推荐阅读