实验演示规划
(3台虚拟机。mysql版本8.0.25)
192.168.168.101 master1(简称1节点)
192.168.168.102 slave2 (简称2节点)
192.168.168.103 slave3 (简称3节点)
在 mgr 中,单主模式是只有一个主节点可以写,其余均为只读节点,且只读节点的 super read only 为打开状态,即使 root 用户依然无法写。多主模式则为全节点均可写。
单主切多主
mgr 单切多使用的命令为select group_replication_switch_to_multi_primary_mode();
首先我们观察当前集群的模式和各个节点的读写模式
select * from performance_schema.replication_group_members;
show variables like '%read_only%';
1节点
2节点
3节点
可以看到,各个节点的读写模式是符合单主模式的。接下来我们在任意节点执行切换语句,此处我们在节点 1 上执行。
select group_replication_switch_to_multi_primary_mode();
可以看到节点 1 因为一开始就是主节点,所以读写模式没有发生变化,但是节点 2 和节点 3 已经自动关闭了只读模式,所有节点都变成可写。
多主切单主
mrg 多主切单主有两条命令可以使用
不指定主节点进行切换
select group_replication_switch_to_single_primary_mode();
mgr 中多主切单主,如果不指定主,切换时遵循以下的规则,前提无延迟情况下,按照优先级先后顺序:
1、 先检查集群内是否存在低版本的 mysql,如果所有成员都是 8.0.17 版本以上的,则按照补丁先后顺序排列,如果有成员是 8.0.17 版本以下的,或者 5.7 的按发行版本的主要版本来排序,忽略补丁编号。
2、 如果集群有任意一个低版本的 mysql。且支持 group_replication_member_weight 这个参数的版本的mysql。则根据 group_replication_member_weight 这个权重参数来,group_replication_member_weight
默认都是 50,权重越高优先级越高。
3、 如果集群内有不支持 group_replication_member_weight 参数的 mysql,比如有 mysql5.7 的,并且其中一个以上的成员具有最高的成员权重(或忽略了成员权重),则考虑的第三个因素是生成的服务器 uuid 的词典顺序,由 server_uuid 系统变量指定。服务器 uuid 最低的成员被选为主服务器,这里实际上就是查询 performance_schema.replication_group_members 最靠前的且是活着的member_id。
在节点 1 上执行非指定单主的切换 sql
可以看到选取了 server_uuid 靠前的节点 1成为主节点。
接下来我们观察各个节点的读写情况
1节点
2节点
3节点
可以看到此时节点 1 作为主节点已经关闭了 read only,其他节点都已经打开了只读。
指定单主切换
因为随机切有很大的不确定性,这里还提供了指定主节点的切换命令
select group_replication_set_as_primary("member_id");
这里的 member_id 就是 server_uuid我们在节点 1 执行切换命令,选择2节点的member_id。
切换后,可以看到节点1打开了只读变成了从节点
节点2,关闭了只读,成为主节点
节点3,不变