10. 选主算法、多版本兼容性及滚动升级 | 深入浅出MGR

本文介绍MGR的选主算法,以及当MGR集群中有多个不同版本混搭时,如何才能正常运行,有什么注意事项。

1. 选主算法

MGR运行在单主模式时,当发生主节点切换,就需要进行选主工作。多主模式下,所有节点都是主节点,就不需要选主了。

MGR的选主工作是自动的,每个节点都会参与。选主时会检查当前最新的组视图,对潜在的新主节点(各个备选节点)进行排序,最后选出最合适的那个作为新的主节点。

不同的MySQL版本选主算法略有不同,各节点选主时会根据当前的MySQL版本选主算法而决定,因此当MGR集群中有多个版本并存时,则此时MGR会做出调整,以便各个不同版本的节点都能就选主达成算法一致。

通常而言,选主算法的各个因素优先级顺序如下:

  1. 根据MySQL版本号排序,低版本的优先级更高(因为要向下兼容)。如果是MySQL 8.0.17及以上版本,则优先根据补丁版本号排序(例如17、18、20)。如果是8.0.16及以下版本,则优先根据主版本号排序(例如5.7、8.0)。
  2. 版本号相同的各节点则根据各节点的权重值排序,权重越高优先级也越高。节点的权重值可通过设置 group_replication_member_weight 选项来调整。这个选项是MySQL 8.0版本引入的,如果是5.7版本则不支持。
  3. 当版本号和节点权重值都一样时,再根据 server_uuid(或者说是 MEMBER_ID)排序(注意,不是 server_id),排在前面的优先级越高。MySQL Server在启动时,会生成一个随机的UUID值,其值记录在文件 datadir/auto.cnf 文件中,实际上可以在实例启动前,通过修改这个UUID值来改变 server_uuid 的值,只要符合UUID数据格式即可。因此,相当于是可以认为调整 server_uuid 以调整选主时节点的排序优先级。

从上面可知,当有MySQL 8.0和5.7的节点混搭运行MGR集群时,运行5.7版本的节点会优先被选中,其次再根据 group_replication_member_weight 选择权重高的节点,最后再根据 server_uuid 排序。

因此,运行MGR集群时最好各节点版本号相同,选主规则就简单多了。

在MySQL 8.0中,通过查询 performance_schema.replication_group_members 表的MEMBER_ROLE 即可知道哪个是主节点:

mysql> select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | group_replication_applier | 4ebd3504-11d9-11ec-8f92-70b5e873a570 | 172.16.16.10 | 3306 | ONLINE | PRIMARY | 8.0.25 |