故障检测(Failure Detection)是 Group Replication 的一个核心功能模块 , 通过它可以及时识别集群中的故障节点 , 并将故障节点从集群中剔除掉 。如果不将故障节点及时剔除的话 , 一方面会影响集群的性能 , 另一方面还会阻止集群拓扑的变更 。
下面结合一个具体的案例 , 分析 Group Replication 的故障检测流程 。
除此之外 , 本文还会分析以下问题 。
- 当出现网络分区时 , 对于少数派节点 , 会有什么影响?
- 什么是 XCom Cache?如何预估 XCom Cache 的大小?
- 在线上 , 为什么 group_replication_member_expel_timeout 不宜设置过大?
主机名IP角色node1192.168.244.10PRIMARYnode2192.168.244.20PRIMARYnode3192.168.244.30PRIMARY本次测试主要包括两步:
- 模拟网络分区 , 看它对集群各节点的影响 。
- 恢复网络连接 , 看看各节点又是如何反应的 。
# 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 的 。
经验总结扩展阅读
- 云原生之旅 - 9)云原生时代网关的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress
- 华为云 MRS 基于 Apache Hudi 极致查询优化的探索实践
- 基于 .NET 7 的 QUIC 实现 Echo 服务
- Mysql InnoDB Redo log
- 基于docker和cri-dockerd部署kubernetes v1.25.3
- 基于 Docker 构建轻量级 CI 系统:Gitea 与 Woodpecker CI 集成
- 使用LabVIEW实现基于pytorch的DeepLabv3图像语义分割
- 之七 2流高手速成记:基于Dubbo&Nacos的微服务简要实现
- MySQL的下载、安装、配置
- 我的Vue之旅 09 数据数据库表的存储与获取实现 Mysql + Golang