組複製
組複製是一種可用於實現容錯系統的技術。 複製組是一個通過消息傳遞相互交互的 server 集羣。通信層提供了原子消息(atomic
message)和完全有序信息交互等保障機制,實現了基於複製協議的多主更新複製組由多個 server成員構成,並且組中的每個 server成員可以獨立地執行事務。但所有讀寫(RW)事務只有在衝突檢測成功後纔會提交。只讀(RO)事務不需要在衝突檢測,可以立即提交。對於任何 (RW )事務,提交操作並不是由始發 server 單向決定的,而是由組來決定是否提交。準確地說,在始發 server上,當事務準備好提交時,該server會廣播寫入值(已改變的行)和對應的寫入集(已更新的行的唯一標識符)。然後會爲該事務建立一個全局的順序。最終,這意味着所有server成員以相同的順序接收同一組事務
因此,所有 server 成員以相同的順序應用相同的更改,以確保組內一致
MySQL組複製是Mysql 5.7.17開始引入的新功能,爲主從複製實現高可用功能
它支持單主模型和多主模型兩種工作方式(默認是單主模型)
單主模型
:從複製組中衆多個Mysql節點中自動選舉一個master節點,只有master節點可以寫,其他節點自動設置爲read only當master節點故障時,會自動選舉一個新的master節點,選舉成功後,它將設置爲可寫,其他slave將指向這個新的master
多主模型
:複製組中的任何一個節點都可以寫,因此沒有master和slave的概念只要突然故障的節點數量不太多,這個多主模型就能繼續可用
Mysql 組複製提供了高可用性,高彈性,可靠的 Myaql 服務
但是組複製的效率很低
當master節點寫數據的時候,會等待所有的slave節點完成數據的複製,然後才繼續往下進行
組複製的每一個節點都可能是slave
環境
ip:172.25.30.1/24
server1
ip:172.25.30.2/24
server2
ip:172.25.30.3/24
server3
server1、server2、server3、安裝Mysqld服務
操作流程
組複製,互相爲master和slave 相當於一個集羣,都可以作爲master和slave只需要在一個上面開啓組複製即可,大家都是master
server1
vim /etc/mysql.cnf
server_id=1
第一個節點
gtid_mode=ON
gtid模塊
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
關閉binlog校驗
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
組複製依賴基於行的複製格式
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="系統生成的uuid"(cat/var/lib/mysql/auto.cnf)
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.30.1:3306"
當前節點的ip
loose-group_replication_group_seeds="172.25.30.1:3306,172.25.30.2:3306,172.25.30.3:3306"
loose-group_replication_bootstrap_group=off
插件是否自動引導,這個選項一般都要off掉,只需要由發起組複製的節點開啓,並只啓動一次,如果是on,下次再啓動時,會生成一個同名的組,可能會發生腦裂
loose-group_replication_ip_whitelist="127.0.0.1,172.25.30.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF
開啓多主模式的參數
systemctl start mysqld
grep password /var/log/mysqld.log
mysql -uroot -p*
alter user root@localhost identified by 'Wps+123ld';
修改密碼
SET SQL_LOG_BIN=0
關閉二進制日誌
CREATE USER rpl_user@'%' IDENTIFIED BY 'Wps+123ld';
創建用戶
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
用戶授權
FLUSH PRIVILEGES;
刷新用戶授權表
SET SQL_LOG_BIN=1;
開啓二進制日誌
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Wps+123ld' FOR CHANNEL 'group_replication_recovery';
配置用戶
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
安裝組複製插件
SET GLOBAL group_replication_bootstrap_group=ON;
在第一個節點上要先打開一次
START GROUP_REPLICATION;
開啓組複製
SET GLOBAL group_replication_bootstrap_group=OFF;
關閉組複製激活
SELECT * FROM performance_schema.replication_group_members;
查看組的狀態,當前只有一個節點在線
CREATE DATABASE test;
創建庫
USE test;
進入庫
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t1 VALUES (1, 'Luis');
插入數據
SELECT * FROM t1;
查看數據
/etc/my.cnf配置文件,使用scp /etc/my.cnf [email protected]:/etc
scp /etc/my.cnf [email protected]:/etc
給server2和server3傳送my.cnf的配置文件
server2
vim /etc/my.cnf
只需要修改server_id等於2,local_address=172.25.30.2(本機ip)即可
systemctl start mysqld
grep password /var/log/mysqld.log
mysql -uroot -p*
alter user root@localhost identified by 'Wps+123ld';
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'Wps+123ld';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
C
HANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Wps+123ld' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
set global group_replication_allow_local_disjoint_gtids_join=on;
START GROUP_REPLICATION;
server3
vim /etc/my.cnf
只需要修改server_id等於3,local_address=172.25.30.3(本機ip)即可
systemctl start mysqld
grep password /var/log/mysqld.log
mysql -uroot -p*
alter user root@localhost identified by 'Wps+123ld';
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'Wps+123ld';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
C
HANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Wps+123ld' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
set global group_replication_allow_local_disjoint_gtids_join=on;
START GROUP_REPLICATION;
測試
server1
mysql -uroot -p*
SELECT * FROM performance_schema.replication_group_members;
查看三臺server是否同時在線
server2
mysql -uroot -p*
insert into t1 valuse(2,'westos');
select * from t1;
server1 與 server3
mysql -uroot -p*
select * from t1;
組複製同步完成