MySQL-MGR


1. 介紹

    MGR(MySQL Group Replication)是MySQL官方在MySQL 5.7.17版本中以插件形式推出的主從復制高可用技術,它基於原生的主從復制,將各節點歸入到一個組中,通過組內節點的通信協商(組通信協議基於Paxos算法),實現數據的強一致性、故障探測、沖突檢測、節點加組、節點離組等等功能。

image

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個節點才能達到大多數的要求。所以,允許出現故障的節點數量如下圖:

5-1966257287


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;

clipboard


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';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM