您好,登錄后才能下訂單哦!
MySQL Group Replication(下簡稱:MGR)是MySQL官方推出的一種基于Paxos協議的狀態機復制。在MGR出現之前,用戶常見的MySQL高可用方式,無論怎么變化架構,本質就是Master-Slave架構。MySQL 5.7版本開始支持無損半同步復制(lossless semi-sync replication),從而進一步提示數據復制的強一致性
?
master事務的提交不需要經過slave的確認,slave是否接收到master的binlog,master并不care。slave接收到master binlog后先寫relay log,最后異步地去執行relay log中的sql應用到自身。由于master的提交不需要確保slave relay log是否被正確接受,當slave接受master binlog失敗或者relay log應用失敗,master無法感知
?
?
基于傳統異步存在的缺陷,mysql在5.5版本推出半同步復制。可以說半同步復制是傳統異步復制的改進,在master事務的commit之前,必須確保一個slave收到relay log并且響應給master以后,才能進行事務的commit。但是slave對于relay log的應用仍然是異步進行的,原理如下圖所示:
?
?
基于傳統異步復制和半同步復制的缺陷——數據的一致性問題無法保證,MySQL官方在5.7.17版本正式推出組復制(MySQL Group Replication,簡稱MGR)。
?
由若干個節點共同組成一個復制組,一個事務的提交,必須經過組內大多數節點(N / 2 + 1)決議并通過,才能得以提交。如上圖所示,由3個節點組成一個復制組,Consensus層為一致性協議層,在事務提交過程中,發生組間通訊,由2個節點決議(certify)通過這個事務,事務才能夠最終得以提交并響應。
?
引入組復制,主要是為了解決傳統異步復制和半同步復制可能產生數據不一致的問題。組復制依靠分布式一致性協議(Paxos協議的變體),實現了分布式下數據的最終一致性,提供了真正的數據高可用方案(是否真正高可用還有待商榷)。其提供的多寫方案,給我們實現多活方案帶來了希望。
?
?
特性優點:
1、高一致性,基于原生復制及paxos協議的組復制技術,并以插件的方式提供,提供一致數據安全保證;
2、高容錯性,只要不是大多數節點壞掉就可以繼續工作,有自動檢測機制,當不同節點產生資源爭用沖突時,不會出現錯誤,按照先到者優先原則進行處理,并且內置了自動化腦裂防護機制;
3、高擴展性,節點的新增和移除都是自動的,新節點加入后,會自動從其他節點上同步狀態,直到新節點和其他節點保持一致,如果某節點被移除了,其他節點自動更新組信息,自動維護新的組信息;
4、高靈活性,有單主模式和多主模式,單主模式下,會自動選主,所有更新操作都在主上進行;多主模式下,所有server都可以同時處理更新操作。
限制:(具體可參考官方文檔說明:https://dev.mysql.com/doc/refman/5.7/en/group-replication-requirements-and-limitations.html)
1、僅支持InnoDB表,并且每張表一定要有一個主鍵,用于做write set的沖突檢測;
2、必須打開GTID特性,二進制日志格式必須設置為ROW,用于選主與write set
3、COMMIT可能會導致失敗,類似于快照事務隔離級別的失敗場景
4、目前一個MGR集群最多支持9個節點
5、不支持外鍵于save point特性,無法做全局間的約束檢測與部分事務回滾
6、二進制日志不支持binlog event checksum
?
?
搭建參照的官方文檔:
官方文檔:https://dev.mysql.com/doc/refman/5.7/en/group-replication.html
單主節點搭建地址:https://dev.mysql.com/doc/refman/5.7/en/group-replication-deploying-in-single-primary-mode.html
多主節點搭建基本和單主步驟一樣,只需要配置文件my.cnf額外添加,本文以下示例為單主節點搭建,多主節點搭建亦相差無幾
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks= TRUE
?
?
主機ip | 安裝服務 | 權重 |
---|---|---|
192.168.142.48 | mysql server 5.7.18 | 50 |
192.168.142.49 | mysql server 5.7.18 | 40 |
192.168.142.50 | mysql server 5.7.18 | 30 |
權重:新主選舉時的優先級參照,越大,優先級越高
?
?
在三臺數據庫服務器上都設置:
192.168.142.48 dbtest1
192.168.142.49 dbtest2
192.168.142.50 dbtest3
?
?
配置文件介紹參照官方文檔:https://dev.mysql.com/doc/refman/5.7/en/group-replication-configuring-instances.html
# Replication Framework
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_bin=binlog
binlog_format=ROW
log_slave_updates=ON
binlog_checksum=NONE
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "192.168.142.48:33061"
loose-group_replication_group_seeds= "192.168.142.48:33061,192.168.142.49:33061,192.168.142.50:33061"
loose-group_replication_bootstrap_group=off
loose-group_replication_member_weight=50
?
?
手動搭建或者自動化腳本分別在三臺主機上配置mysql實例,這里可參考MySQL單實例搭建的方法,不在贅述
?
?
1、設置復制賬號權限
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
2、指定恢復渠道channel
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
3、安裝插件plugin和查看
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;
4、開啟組復制
# 設置group_replication_bootstrap_group為ON是為了標示以后加入集群的服務器以這臺服務器為基準,以后加入的就不需要設置
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
5、查看mgr的狀態
# 查詢表performance_schema.replication_group_members
select * from performance_schema.replication_group_members;
?
1、設置復制賬號權限
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
2、指定恢復渠道channel
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
3、安裝插件plugin和查看
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;
4、開啟組復制
# 這里不再需要開啟group_replication_bootstrap_group,由于復制組已經被創建了,只需要將第二個節點添加進去即可
START GROUP_REPLICATION;
5、查看mgr的狀態
# 查詢表performance_schema.replication_group_members
select * from performance_schema.replication_group_members;
?
?
1、切換
STOP GROUP_REPLICATION;會根據權重重新選擇新的主master
START GROUP_REPLICATION;新加入后作為從服務器slave
?
2、相關狀態查看
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';
?
?
?
例如原有192.168.142.48,192.168.142.49,192.168.142.50組成MGR的基礎上動態新增節點192.168.142.51
?
1、創建hostname和ip的映射
在四臺數據庫服務器上都設置:
192.168.142.48 dbtest1
192.168.142.49 dbtest2
192.168.142.50 dbtest3
192.168.142.51 dbtest4
2、192.168.142.51的my.cnf配置文件和上面my.cnf保持一致,額外修改的如下
loose-group_replication_local_address= "192.168.142.51:33061"
loose-group_replication_group_seeds= "192.168.142.48:33061,192.168.142.49:33061,192.168.142.50:33061,192.168.142.51:33061"
3、創建數據庫實例
手動搭建或者自動化腳本分別在三臺主機上配置mysql實例,這里可參考MySQL單實例搭建的方法,不在贅述
4、設置復制賬號權限
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
5、指定恢復渠道channel
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
6、安裝插件plugin和查看
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;
7、集群中已存在的節點配置修改group_replication_group_seeds的值
1、分別在192.168.142.48,192.168.142.49,192.168.142.50對應節點服務器配置參數
set global group_replication_group_seeds="192.168.142.48:33061,192.168.142.49:33061,192.168.142.50:33061,192.168.142.51:33061";
2、將對應參數值寫入配置文件my.cnf持久化
8、開啟組復制
# 這里不再需要開啟group_replication_bootstrap_group,由于復制組已經被創建了,只需要將新增節點添加進去即可
START GROUP_REPLICATION;
9、查看mgr的狀態
# 查詢表performance_schema.replication_group_members
select * from performance_schema.replication_group_members;
?
?
例如原有192.168.142.48,192.168.142.49,192.168.142.50,192.168.142.51組成MGR的基礎上動態刪除節點192.168.142.51
1、停止192.168.142.51上組復制
STOP GROUP_REPLICATION;
slave關閉后就被移除了組成員
2、集群中剩余的節點配置修改group_replication_group_seeds的值
1、分別在192.168.142.48,192.168.142.49,192.168.142.50對應節點服務器配置參數
set global group_replication_group_seeds="192.168.142.48:33061,192.168.142.49:33061,192.168.142.50:33061";
2、將對應參數值寫入配置文件my.cnf持久化
3、徹底清理192.168.142.51節點相關組信息,配置修改group_replication_group_seeds和group_replication_local_address的值
1、在192.168.142.51對應節點服務器配置參數
set global group_replication_group_seeds="";
set global group_replication_local_address="";
2、將對應參數值寫入配置文件my.cnf持久化(添加注釋)
4、刪除插件plugin、復制賬號權限
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。