1. 介紹
MGR(MySQL Group Replication)是MySQL官方在MySQL 5.7.17版本中以插件形式推出的主從復制高可用技術,它基於原生的主從復制,將各節點歸入到一個組中,通過組內節點的通信協商(組通信協議基於Paxos算法),實現數據的強一致性、故障探測、沖突檢測、節點加組、節點離組等等功能。
1.1 工作模式
組復制以單主模式或多主模式運行。通過group_replication_single_primary_mode=[ON|OFF] 變量指定工作模式。 組內所有成員都必須運行相同得工作模式。 ON表示單主模式,這是默認模式,OFF表示多主模式。
單主模式:從復制組中眾多個MySQL節點中自動選舉一個master節點,只有master節點可以寫,其他節點自動設置為read only。當master節點故障時,會自動選舉一個新的master節點,選舉成功后,它將設置為可寫,其他slave將指向這個新的master。
多主模式:復制組中的任何一個節點都可以寫,因此沒有master和slave的概念,只要突然故障的節點數量不太多,這個多主模型就能繼續可用。
1.2 單主模式主要選主算法
1)第一個考慮因素通過成員運行的MySQL Server軟件版本(補丁版本)進行排序
2)第二個因素依據每個成員的權重group_replication_member_weigth參數控制,【5.7.20引入變量】默認為50
3)第三個因素UUID的詞典順序(變量server_uuid控制),UUID最低的成員被選為新主
1.3 容錯
MySQL組復制使用Paxos分布式算法來提供節點間的分布式協調。正因如此,它要求組中大多數節點在線才能達到法定票數,從而對一個決策做出一致的決定。
大多數指的是N/2+1(N是組中目前節點總數),例如目前組中有5個節點,則需要3個節點才能達到大多數的要求。所以,允許出現故障的節點數量如下圖:
2. 實驗環境搭建
2.1 單主模式
1)配置復制賬號
# 全新環境 -- set password=password('root'); create user 'sync'@'192.168.10.%' identified by 'sync'; grant replication slave on *.* to 'sync'@'192.168.10.%'; flush privileges; # 線上環境新增賬號 SET SQL_LOG_BIN=0; CREATE USER sync@'192.168.10.%' IDENTIFIED BY 'sync'; GRANT REPLICATION SLAVE ON *.* TO sync@'192.168.10.%'; FLUSH PRIVILEGES; SET SQL_LOG_BIN=1; select user,host,authentication_string from mysql.user;
2)參數文件配置
# GTID gtid_mode=on enforce-gtid-consistency=on binlog_gtid_simple_recovery=1 binlog_checksum=NONE log-slave-updates=on master_info_repository=TABLE relay_log_info_repository=TABLE # MGR 復制 transaction_write_set_extraction = XXHASH64 loose-group_replication_group_name = '32078389-702d-11ea-95da-000c2960a1c6' loose-group_replication_ip_whitelist = '127.0.0.1/24,192.168.10.0/24' loose-group_replication_start_on_boot = OFF loose-group_replication_local_address = '192.168.10.181:33061' # 替換本地服務器IP及通訊端口 loose-group_replication_group_seeds = '192.168.10.181:33061,192.168.10.181:33062,192.168.10.181:33063' loose-group_replication_bootstrap_group = OFF loose-group_replication_single_primary_mode = true loose-group_replication_enforce_update_everywhere_checks = false loose-group_replication_member_weight=50 # mysql 5.7.20才開始支持該選項 權重:新主選舉時的優先級參照,越大,優先級越高 group_replication_flow_control_mode='DISABLED' # 建議關閉流控
3)安裝插件
# 動態安裝插件 INSTALL PLUGIN group_replication SONAME 'group_replication.so'; show plugins; # 配置文件加載插件 group_replication=group_replication.so plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so;group_replication=group_replication.so"
4)配置組成員
# mysql 3308 -- 首個實例 #1 查看當前的group replication相關參數是否配置有誤 show global variables like 'group%'; #2 配置MGR -- 開啟分布式復制 CHANGE MASTER TO MASTER_USER='sync', MASTER_PASSWORD='sync' FOR CHANNEL 'group_replication_recovery'; #3 # 設置group_replication_bootstrap_group為ON是為了標示以后加入集群的服務器以這台服務器為基准,以后加入的就不需要設置 SET GLOBAL group_replication_bootstrap_group=ON; #4 啟動MGR start group_replication; #5 關閉 group_replication_bootstrap_group SET GLOBAL group_replication_bootstrap_group=OFF; #6 #檢測組是否創建並已加入新成員 select * from performance_schema.replication_group_members; # 其它實例配置 #1 查看當前的group replication相關參數是否配置有誤 show global variables like 'group%'; #2 配置MGR -- 開啟分布式復制 CHANGE MASTER TO MASTER_USER='sync', MASTER_PASSWORD='sync' FOR CHANNEL 'group_replication_recovery'; #3 啟動MGR 注意:# 這里不再需要開啟group_replication_bootstrap_group,由於復制組已經被創建了,只需要將第二個節點添加進去即可 start group_replication; #4 #檢測組是否創建並已加入新成員 select * from performance_schema.replication_group_members;
5)監控
# 相關狀態查看
# 1、當前組成員列表
select * from performance_schema.replication_group_members;
# 2、當前節點詳細日志應用信息
select * from performance_schema.replication_group_member_stats;
# 3、當前復制渠道連接信息
select * from performance_schema.replication_connection_status;
# 4、當前復制渠道應用信息
select * from performance_schema.replication_applier_status;
# 5、當前主master (單主模式)
select a.variable_value,b.member_host,b.member_port,member_state
from performance_schema.global_status a ,performance_schema.replication_group_members b
where a.variable_value=b.member_id and variable_name= 'group_replication_primary_member';
SHOW STATUS LIKE 'group_replication_primary_member';
select b.member_host the_master,a.variable_value master_uuid
from performance_schema.global_status a
join performance_schema.replication_group_members b
on a.variable_value = b.member_id
where variable_name='group_replication_primary_member';
# 可用性監控
selecct member_state from replication_group_members where member_id=@@server_uuid;
# 延遲
select (SELECT Received_transaction_set FROM performance_schema.replication_connection_status WHERE Channel_name = 'group_replication_applier') - (select @@global.gtid_executed);
-- 遠程節點GTID
SELECT Received_transaction_set FROM performance_schema.replication_connection_status WHERE Channel_name = 'group_replication_applier';
-- 本地節點 GTID
select @@global.gtid_executed;
# 當前節點是否可以寫
select * from performance_schema.global_variables where variable_name in ('read_only', 'super_read_only');
2.2 多主模式
# 多主模式和單主模式配置方式一樣,只需將修改或增加以下參數后配置組成員 loose-group_replication_single_primary_mode=FALSE loose-group_replication_enforce_update_everywhere_checks = TRUE
3. 工作模式切換
3.1 單主切換成多主模式
# MGR切換模式需要重新啟動組復制,因此需要在所有節點上先關閉組復制, #設置 group_replication_single_primary_mode=OFF 等參數,再啟動組復制。 1) 停止組復制(在所有MGR節點上執行): stop group_replication; set global group_replication_single_primary_mode=OFF; set global group_replication_enforce_update_everywhere_checks=ON; 2) 隨便選擇某個MGR節點執行 (比如這里選擇在3308端口實例): SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; 3) 然后在其他的MGR節點執行 (這里指3309和3310端口實例上執行): START GROUP_REPLICATION; 4) 查看MGR組信息 (在任意一個MGR節點上都可以查看) SELECT * FROM performance_schema.replication_group_members;
3.2 多主切換單主模式
# 多主切回單主模式 1) 停止組復制(在所有MGR節點上執行): stop group_replication; set global group_replication_enforce_update_everywhere_checks=OFF; set global group_replication_single_primary_mode=ON; 2) 選擇一個節點作為主節點, 在主節點上執行 (這里選擇3308端口作為主) SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; 3) 在其他剩余的節點, 也就是從庫節點上執行 (這里從庫節點指的就是3309和3310): START GROUP_REPLICATION; 4) 查看MGR組信息 (在任意一個MGR節點上都可以查看) SELECT * FROM performance_schema.replication_group_members;
4. 參數調優
slave_parallel_type -> LOGICAL_CLOCK # 增強sql_thread 並行數量 slave_parallel_workers -> 2~8 # 流控(flow control) 在MGR中如果節點落后集群中其它成員太多,就會發起讓其它節點等他完成在做的控制,這個叫流控。 當啟用: group_replication_flow_control_mode=QUOTA 是表示啟用流控。 流控默認通過兩個參數控制: group_replication_flow_control_applier_threshold (默認: 25000) group_replication_flow_control_certifier_threshold (默認: 25000) 默認延遲在25000個GTID時,會對整個集群Block住寫操作 # 建議關閉流控 set global group_replication_flow_control_mode='DISABLED';