企業級Mysql數據庫集羣--Mysql全同步複製

組複製

組複製是一種可用於實現容錯系統的技術。 複製組是一個通過消息傳遞相互交互的 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;

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

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

在這裏插入圖片描述

組複製同步完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章