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

  • 网络恢复正常 。
  • 达到 group_replication_unreachable_majority_timeout 的限制 。注意 , 该参数的起始计算时间是连接断开 5s 之后 , 不是可疑节点被驱逐出集群的时间 。该参数默认为 0 。
  • 无论哪种情况 , 都会触发:
    • 节点状态从 ONLINE 切换到 ERROR。
    • 回滚当前被阻塞的写操作 。
      mysql> delete from slowtech.t1 where id=1;ERROR 3100 (HY000): Error on observer while running replication hook 'before_commit'.
  • ERROR 状态的节点会自动设置为只读 。
  • 如果group_replication_autorejoin_tries不为 0 , 对于 ERROR 状态的节点 , 会自动重试 , 重新加入集群(auto-rejoin) 。
  • 如果group_replication_autorejoin_tries为 0 或重试失败 , 则会执行 group_replication_exit_state_action 指定的操作 。可选的操作有:
    • READ_ONLY:只读模式 。在这种模式下 , 会将 super_read_only 设置为 ON 。默认值 。
    • OFFLINE_MODE:离线模式 。在这种模式下 , 会将 offline_mode 和 super_read_only 设置为 ON , 此时 , 只有CONNECTION_ADMIN(SUPER)权限的用户才能登陆 , 普通用户不能登录 。
      # mysql -h 192.168.244.3. -P 3306 -ut1 -p123456ERROR 3032 (HY000): The server is currently in offline mode
    • ABORT_SERVER:关闭实例 。
    XCom CacheXCom Cache 是 XCom 使用的消息缓存 , 用来缓存集群节点之间交换的消息 。缓存的消息是共识协议的一部分 。如果网络不稳定 , 可能会出现节点失联的情况 。
    如果节点在一定时间(由 group_replication_member_expel_timeout 决定)内恢复正常 , 它会首先应用 XCom Cache 中的消息 。如果 XCom Cache 没有它需要的所有消息 , 这个节点会被驱逐出集群 。驱逐出集群后 , 如果 group_replication_autorejoin_tries 不为 0 , 它会重新加入集群(auto-rejoin) 。
    重新加入集群会使用 Distributed Recovery 补齐差异数据 。相比较直接使用 XCom Cache 中的消息 , 通过 Distributed Recovery 加入集群需要的时间相对较长 , 过程也较复杂 , 并且集群的性能也会受到影响 。
    所以 , 我们在设置 XCom Cache 的大小时 , 需预估 group_replication_member_expel_timeout + 5s 这段时间内的内存使用量 。如何预估 , 后面会介绍相关的系统表 。
    下面我们模拟下 XCom Cache 不足的场景 。
    1. 将group_replication_message_cache_size调整为最小值(128 MB) , 重启组复制使其生效 。
    mysql> set global group_replication_message_cache_size=134217728;Query OK, 0 rows affected (0.00 sec)mysql> stop group_replication;Query OK, 0 rows affected (4.15 sec)mysql> start group_replication;Query OK, 0 rows affected (3.71 sec)2. 将group_replication_member_expel_timeout调整为 3600 。这样 , 我们才有充足的时间进行测试 。
    mysql> set global group_replication_member_expel_timeout=3600;Query OK, 0 rows affected (0.01 sec)3. 断开 node3 与node1、node2 之间的网络连接 。
    # 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

    经验总结扩展阅读