https://dev.mysql.com/doc/refman/8.4/en/group-replication.html
1 什么是組復制
- 組復制主要解決了傳統異步復制主機宕機時可能造成主從節點數據不一致問題
- MySQL Group Replication,簡稱MGR
- 將原有的gtid復制功能進行可增強,支持單主模式和多主模式
- 組復制在數據庫層面做到了只要集群中大多數主機可用,則服務可用,也就是3臺服務器的集群,允許其中1臺宕機
- 組復制提供了分布式狀態機復制,服務器之間具有很強的協調性;
- 當服務器屬于同一組時,它們會自動進行協調
- 傳統的主從復制方式有一個主盒不等數據量的從,主節點執行的事務會異步發送給從節點,在從節點重新執行;
- 而組復制采用整組寫入,避免單點問題
- 組復制在傳輸數據時使用了Paxos協議,Paxos協議保證了數據傳輸的一致性和原子性;
- 基于Paxos協議,組復制構建了一個分布式的狀態復制機制。這是實現多主復制的核心技術
- 組復制提供樂多寫方案
- MGR能保證數據庫服務的連續可用,但是存在以下問題
- 當一個組成員不可用時,連接到它的客戶端不能自主轉移到其他組成員
- MySQL Router提供樂故障轉移的能力
2 單主模式
2.1 什么是單主模式
- 在單主模式下,組中只有一個主服務器;
- 主服務器被設置為讀寫模式
- 組中其他所有成員都被設置為只讀模式
2.2 單主模式部署示例
https://dev.mysql.com/doc/refman/8.4/en/group-replication-configuring-instances.html
2.2.1 準備MySQL實例10000
- 創建目錄
mkdir -p /opt/mysql/10000/{data,log,tmp}
- 準備配置文件
vi /opt/mysql/10000/my.cnf[mysql]
#設置mysql客戶端默認編碼
default-character-set=utf8
[mysqld]
port=10000
pid-file= /opt/mysql/10000/mysqld.pid
socket= /opt/mysql/10000/mysqld.sock
datadir= /opt/mysql/10000/data
log-error=/opt/mysql/10000/log/mysqld.log
tmpdir=/opt/mysql/10000/tmp
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#服務器唯一ID,默認是1
server-id=10000
#啟用二進制日志
log-bin=mysql-bin
#最大連接數
max_connections=1000
#設置默認時區
default-time_zone='+8:00'
# 0:區分大小寫
# 1:不區分大小寫
lower_case_table_names=1
user = mysql
#啟用全局事務標識符(GTID)模式
gtid_mode=on
#強制GTID的一致性。這意味著在執行事務時,MySQL將確保所有涉及的服務器都使用相同的GTID集。
enforce_gtid_consistency=on
- 初始化庫
chown -R mysql:mysql /opt/mysql/10000
mysqld --defaults-file=/opt/mysql/10000/my.cnf --initialize
- 啟庫
mysqld --defaults-file=/opt/mysql/10000/my.cnf &
- 初始化密碼
#查看臨時密碼
cat /opt/mysql/10000/log/mysqld.log|grep "A temporary password"
#登錄
mysql -uroot -p'EG+Pvd&jj0N=' --socket=/opt/mysql/10000/mysqld.sock
>ALTER USER 'root'@'localhost' identified by '123456';
flush privileges;
- 創建同步用戶
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
>CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
flush privileges;
- 添加組復制配置
vi /opt/mysql/10000/my.cnf
#組復制設置
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.221.100:33061"
group_replication_group_seeds= "192.168.221.100:33061,192.168.221.100:33062,192.168.221.100:33063"
group_replication_bootstrap_group=off
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
2.2.2 復制MySQL實例10001
cp -rf /opt/mysql/10000 /opt/mysql/10001
sed -i "s#10000#10001#g" /opt/mysql/10001/my.cnf
rm -f /opt/mysql/10001/data/auto.cnf
sed -i "s#group_replication_local_address= '192.168.221.100:33061'#group_replication_local_address= '192.168.221.100:33062'#g" /opt/mysql/10001/my.cnf
chown -R mysql:mysql /opt/mysql/10001
mysqld --defaults-file=/opt/mysql/10001/my.cnf &
2.2.3 復制MySQL實例10002
cp -rf /opt/mysql/10000 /opt/mysql/10002
sed -i "s#10000#10002#g" /opt/mysql/10002/my.cnf
rm -f /opt/mysql/10002/data/auto.cnf
sed -i "s#group_replication_local_address= '192.168.221.100:33061'#group_replication_local_address= '192.168.221.100:33063'#g" /opt/mysql/10002/my.cnf
chown -R mysql:mysql /opt/mysql/10002
mysqld --defaults-file=/opt/mysql/10002/my.cnf &
2.2.3 配置組復制
- 主庫實例10000執行
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
> set global group_replication_recovery_get_public_key=on;CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';SET GLOBAL group_replication_bootstrap_group=ON;START GROUP_REPLICATION;SET GLOBAL group_replication_bootstrap_group=OFF;
- 從庫實例10001執行
mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
> START GROUP_REPLICATION;
- 從庫實例10002執行
mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
> START GROUP_REPLICATION;
- 查看組成員
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock > SELECT CHANNEL_NAME,MEMBER_ID,MEMBER_HOST,MEMBER_PORT, MEMBER_ROLE FROM performance_schema.replication_group_members;
2.2.4 組復制數據同步測試
- 主庫實例10000插入數據
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
> create database test;use test;
create table test (id int,name varchar(10));
ALTER TABLE test ADD PRIMARY KEY id(id);
insert into test values(1,'a'),(2,'b'),(3,'c');
- 從庫實例10001查詢數據
mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
> use test;
select * from test;
- 從庫實例10002查詢數據
mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
> use test;
select * from test;
2.2.5 組復制主庫宕機測試
- kill主庫實例10000
- 查看組成員
3 多主模式
https://dev.mysql.com/doc/refman/8.4/en/group-replication-multi-primary-mode.html
3.1 什么是多主模式
- 在多主模式下,沒有成員具有特殊角色
- 任何組成員在加入組復制時讀背設置為讀寫模式,可都以處理寫事物
3.2 多主模式部署示例
- 關閉實例10000,10001,10002單主模式
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
> stop GROUP_REPLICATION;
set global group_replication_single_primary_mode=off;
set global group_replication_enforce_update_everywhere_checks=ON;mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
> stop GROUP_REPLICATION;
set global group_replication_single_primary_mode=off;
set global group_replication_enforce_update_everywhere_checks=ON;mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
> stop GROUP_REPLICATION;
set global group_replication_single_primary_mode=off;
set global group_replication_enforce_update_everywhere_checks=ON;
- 使用實例10000引導組復制
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
> SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
- 實例10001,10002開啟組復制
mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
> START GROUP_REPLICATION;mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
> START GROUP_REPLICATION;
- 查看組成員
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock > SELECT CHANNEL_NAME,MEMBER_ID,MEMBER_HOST,MEMBER_PORT, MEMBER_ROLE FROM performance_schema.replication_group_members;