實驗演示規劃
(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,不變





