从源码分析 MGR 的新主选举算法( 四 )


2. 最小版本号 5.7.18 小于 MySQL 5.7.20,所以 5.7.18, 5.7.18, 5.7.19, 5.7.20, 5.7.21 这几个节点会根据 server_uuid 进行排序 。注意,lowest_version_end 的节点不会参与排序 。
3. 选择 server_uuid 最小的节点作为 Primary 节点 。
案例 2:5.7.20, 5.7.21, 8.0.2, 8.0.21. 同案例 1 一样 , 会将 8.0.2 作为 lowest_version_end 。此时,候选节点只有 5.7.20 和 5.7.21 。
2. 最小版本号 5.7.20 等于 MySQL 5.7.20,所以,5.7.20, 5.7.21 这两个节点会根据节点的权重进行排序 。如果权重一致,则会基于 server_uuid 进行进一步的排序 。
3. 选择权重最高,server_uuid 最小的节点作为 Primary 节点 。
案例 3:8.0.17, 8.0.18, 8.0.191. 最小版本号是 MySQL 8.0.17 , 等于 MySQL 8.0.17,所以会判断其它节点的版本号是否与第一个节点相同 。不相同,则会将该节点的版本号赋值给 lowest_version_end 。所以,会将 8.0.18 作为 lowest_version_end 。此时,候选节点只有 8.0.17 。
2. 选择 8.0.17 这个节点作为 Primary 节点 。
案例 4:8.0.13, 8.0.17, 8.0.181. 最小版本号是 MySQL 8.0.13 , 小于 MySQL 8.0.17,而且各个节点的 major_version 一致,所以最后返回的 lowest_version_end 实际上是 all_members_info->end() 。此时,这三个节点都是候选节点 。
2. MySQL 8.0.13 大于 MySQL 5.7.20,所以这三个节点会根据权重进行排序 。如果权重一致,则会基于 server_uuid 进行进一步的排序 。
3. 选择权重最高,server_uuid 最小的节点作为 Primary 节点 。
手动选主从 MySQL 8.0.13 开始,我们可以通过以下两个函数手动选择新的主节点:

  • group_replication_set_as_primary(server_uuid) :切换单主模式下的 Primary 节点 。
  • group_replication_switch_to_single_primary_mode([server_uuid]) :将多主模式切换为单主模式 。可通过 server_uuid 指定单主模式下的 Primary 节点 。
在使用这两个参数时,注意,指定的 server_uuid 必须属于候选节点 。
另外 , 这两个函数是 MySQL 8.0.13 引入的 , 所以,如果集群中存在 MySQL 8.0.13 之前的节点,执行时会报错 。
mysql> select group_replication_set_as_primary('5470a304-3bfa-11ed-8bee-83f233272a5d');ERROR 3910 (HY000): The function 'group_replication_set_as_primary' failed. The group has a member with a version that does not support group coordinated operations.总结结合代码和上面四个案例的分析,最后我们总结下 MGR 的新主选举算法:
1. 如果集群中存在 MySQL 5.7 的节点,则会将 MySQL 5.7 的节点作为候选节点 。
2. 如果集群节点的版本都是 MySQL 8.0,这里需要区分两种情况:
  • 如果最小版本小于 MySQL 8.0.17,则所有的节点都可作为候选节点 。
  • 如果最小版本大于等于 MySQL 8.0.17,则只有最小版本的节点会作为候选节点 。
3. 在候选节点的基础上,会进一步根据候选节点的权重和 server_uuid 选择 Primary 节点 。具体来说 , 
  • 如果候选节点中存在 MySQL 5.7.20 之前版本的节点,则会选择 server_uuid 最小的节点作为 Primary 节点 。
  • 如果候选节点都大于等于 MySQL 5.7.20,则会选择权重最高,server_uuid 最小的节点作为 Primary 节点 。
【从源码分析 MGR 的新主选举算法】

推荐阅读