日志的输出包括两部分 , 以空格为分界线 。
1. 当网络连接恢复后 , node3 与 node1、node2 重新建立起了连接 , 发现自己已经被集群驱逐 , 于是节点进入到 ERROR 状态 。
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 |+--------------------------------------+----------------+-------------+--------------+-------------+| 4cbfdc79-0192-11ed-8b01-02001701bd0a | 192.168.244.30 | 3306 | ERROR | |+--------------------------------------+----------------+-------------+--------------+-------------+1 row in set (0.00 sec)
节点进入到 ERROR 状态 , 会自动设置为只读 , 即日志中看到的 super_read_only=ON 。注意 , ERROR 状态的节点设置为只读是默认行为 , 与后面提到的 group_replication_exit_state_action 参数无关 。
2. 如果group_replication_autorejoin_tries不为 0 , 对于 ERROR 状态的节点 , 会自动重试 , 重新加入集群(auto-rejoin) 。重试的次数由 group_replication_autorejoin_tries 决定 , 从 MySQL 8.0.21 开始 , 默认为 3 。重试的时间间隔是 5min 。重试成功后 , 会进入到分布式恢复阶段 。
接下来看看 node1 的日志 。
2022-07-31T13:07:39.555613-00:00 0 [System] [MY-011503] [Repl] Plugin group_replication reported: 'Group membership changed to 192.168.244.10:3306, 192.168.244.20:3306, 192.168.244.30:3306 on view 16592724636525403:4.'2022-07-31T13:07:40.732568-00:00 0 [System] [MY-011492] [Repl] Plugin group_replication reported: 'The member with address 192.168.244.30:3306 was declared online within the replication group.'
node3 又重新加入到集群中 。
故障检测流程结合上面的案例 , 我们来看看 Group Repliction 的故障检测流程 。
- 集群中每个节点都会定期(每秒 1 次)向其它节点发送心跳信息 。如果在 5s 内(固定值 , 无参数调整)没有收到其它节点的心跳信息 , 则会将该节点标记为可疑节点 , 同时会将该节点的状态设置为 UNREACHABLE。如果集群中有等于或超过 1/2 的节点显示为 UNREACHABLE , 则该集群不能对外提供写服务 。
- 如果在group_replication_member_expel_timeout(从 MySQL 8.0.21 开始 , 该参数的默认值为 5 , 单位 s , 最大可设置值为3600 , 即 1 小时)时间内 , 可疑节点恢复正常 , 则会直接应用 XCom Cache 中的消息 。XCom Cache 的大小由group_replication_message_cache_size 决定 , 默认是 1G 。
- 如果在group_replication_member_expel_timeout时间内 , 可疑节点没有恢复正常 , 则会被驱逐出集群 。
- 而少数派节点呢 , 不会自动离开集群 , 它会一直维持当前的状态 , 直到:
- 云原生之旅 - 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