MySQL—組複製

1. 組複製模型

  • 組複製模型

MySQL組複製是MySQL 5.7.17開始引入的新功能,爲主從複製實現高可用功能。它支持單主模型和多主模型兩種工作方式(默認是單主模型)。

  • 單主模型

從複製組中衆多個MySQL節點中自動選舉一個master節點,只有master節點可以寫,其他節點自動設置爲read only。當master節點故障時,會自動選舉一個新的master節點,選舉成功後,它將設置爲可寫,其他slave將指向這個新的master。

  • 多主模型

複製組中的任何一個節點都可以寫,因此沒有master和slave的概念,只要突然故障的節點數量不太多,這個多主模型就能繼續可用。

2. 組複製原理

複製組由多個 server成員構成,並且組中的每個 server 成員可以獨立地執行事務。但所有讀寫(RW)事務只有在衝突檢測成功後纔會提交。只讀(RO)事務不需要在衝突檢測,可以立即提交。

換句話說,對於任何 RW 事務,提交操作並不是由始發 server 單向決定的,而是由組來決定是否提交。準確地說,在始發 server 上,當事務準備好提交時,該 server 會廣播寫入值(已改變的行)和對應的寫入集(已更新的行的唯一標識符)。然後會爲該事務建立一個全局的順序。最終,這意味着所有 server 成員以相同的順序接收同一組事務。因此,所有 server 成員以相同的順序應用相同的更改,以確保組內一致。

組複製使您能夠根據在一組 server 中複製系統的狀態來創建具有冗餘的容錯系統。因此,只要它不是全部或多數 server 發生故障,即使有一些 server 故障,系統仍然可用,最多隻是性能和可伸縮性降低,但它仍然可用。server 故障是孤立並且獨立的。它們由組成員服務來監控,組成員服務依賴於分佈式故障檢測系統,其能夠在任何 server 自願地或由於意外停止而離開組時發出信號。

總之,MySQL 組複製提供了高可用性,高彈性,可靠的 MySQL 服務。

3. 實現組複製

實驗環境:

server1 server2 server3三臺裝有mysql的虛擬機,並且三臺虛擬機中都要寫好解析

vim /etc/hosts
172.25.254.1 server1
172.25.254.2 server2
172.25.254.3 server3

server1:

step1 還原之前做過的實驗:
注意:如果之前沒有做過其他的mysql實驗,就可不用做這一步驟

systemctl stop mysqld
cd /var/lib/mysql
rm -fr *

step2 生成UUID:

uuidgen	#這一步生成的uuid要在後面用到

step3 編輯mysql配置文件:

vim /etc/my.cnf
寫入:
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64	#指示Server必須爲每個事務收集寫集合,並使用XXHASH64哈希算法將其編碼爲散列
group_replication_group_name="624dda22-8761-43a3-8abd-b06716fb1694"	#告知插件,正在加入或創建的組要命名,一般寫UUID
group_replication_start_on_boot=off	#指示插件在 server 啓動時不自動啓動組複製
group_replication_local_address= "172.25.254.1:33061"	#告訴插件使用 IP 地址 本地主機,端口33061用於接受來自組中其他成員的傳入連接。
group_replication_group_seeds= "172.25.254.1:33061,172.25.254.2:33061,172.25.254.3:33061"
group_replication_bootstrap_group=off	#配置是否自動引導組
loose-group_replication_ip_whitelist="127.0.0.1,172.25.254.0/24"	#用戶白名單
loose-group_replication_enforce_update_everywhere_checks=ON	#多主模式下爲多主更新啓用或禁用嚴格一致性檢查
loose-group_replication_single_primary_mode=OFF	#設置組自動選擇一個 server 來處理讀/寫工作

在這裏插入圖片描述

step4 打開服務、過濾密碼、安全初始化:

systemctl start mysqld
cat /var/log/mysqld.log | grep password
mysql_secure_installation 

step5 啓動組複製:

mysql> SET SQL_LOG_BIN=0;	#禁用二進制日誌
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Redhat.123'#創建用戶
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';	#加用戶權限
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;	#刷新數據
Query OK, 0 rows affected (0.00 sec)

mysql> SET SQL_LOG_BIN=1;	#啓用二進制日誌
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Redhat.123' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.04 sec)

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';	#安裝組複製插件(因爲配置文件已經寫過此參數,所以報錯)
ERROR 1125 (HY000): Function 'group_replication' already exists
mysql> SHOW PLUGINS;


mysql> SET GLOBAL group_replication_bootstrap_group=ON;	#先打開,等打開組複製之後再開啓
Query OK, 0 rows affected (0.00 sec)

mysql> START GROUP_REPLICATION;	#打開組複製
Query OK, 0 rows affected (2.30 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;	#查看狀態,顯示ONLINE則開啓成功

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

server2:

step1 還原之前做過的實驗:

注意:如果之前沒有做過其他的mysql實驗,就可不用做這一步驟

systemctl stop mysqld
cd /var/lib/mysql
rm -fr *

step2 編輯mysql配置文件:

vim /etc/my.cnf
修改兩處:
server_id=2	#修改id
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64	
group_replication_group_name="624dda22-8761-43a3-8abd-b06716fb1694"	
group_replication_start_on_boot=off	
group_replication_local_address= "172.25.254.2:33061"	#修改本機ip
group_replication_group_seeds= "172.25.254.1:33061,172.25.254.2:33061,172.25.254.3:33061"
group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="127.0.0.1,172.25.254.0/24"	
loose-group_replication_enforce_update_everywhere_checks=ON	
loose-group_replication_single_primary_mode=OFF	

在這裏插入圖片描述

step3 打開服務、過濾密碼、安全初始化:

systemctl start mysqld
cat /var/log/mysqld.log | grep password
mysql_secure_installation 

step4 配置組複製:

mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Redhat.123';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Redhat.123' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.11 sec)

mysql> set global group_replication_allow_local_disjoint_gtids_join=on;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (4.69 sec)

在這裏插入圖片描述

step5 在server1上查看狀態:

mysql> SELECT * FROM performance_schema.replication_group_members;

在這裏插入圖片描述

server3

step1 還原之前做過的實驗:
注意:如果之前沒有做過其他的mysql實驗,就可不用做這一步驟

systemctl stop mysqld
cd /var/lib/mysql
rm -fr *

step2 編輯mysql配置文件:

vim /etc/my.cnf
修改兩處:
server_id=3	#修改id
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64	
group_replication_group_name="624dda22-8761-43a3-8abd-b06716fb1694"	
group_replication_start_on_boot=off	
group_replication_local_address= "172.25.254.3:33061"	#修改本機ip
group_replication_group_seeds= "172.25.254.1:33061,172.25.254.2:33061,172.25.254.3:33061"
group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist="127.0.0.1,172.25.254.0/24"	
loose-group_replication_enforce_update_everywhere_checks=ON	
loose-group_replication_single_primary_mode=OFF	

在這裏插入圖片描述
step3 打開服務、過濾密碼、安全初始化:

systemctl start mysqld
cat /var/log/mysqld.log | grep password
mysql_secure_installation 

step4 配置組複製:

mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Redhat.123';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Redhat.123' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.11 sec)

mysql> set global group_replication_allow_local_disjoint_gtids_join=on;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (4.69 sec)

在這裏插入圖片描述

step5 在server1上查看狀態:

mysql> SELECT * FROM performance_schema.replication_group_members;

在這裏插入圖片描述
測試:

step1 在server2創建新表:

mysql> create database test;
Query OK, 1 row affected (0.01 sec)

mysql> use test;
Database changed
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO t1 VALUES (1, 'Luis');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM t1;

在這裏插入圖片描述
step2 在server1和server3中都可以看到插入的信息:

mysql> use test;

Database changed
mysql> SELECT * FROM t1;

在這裏插入圖片描述

step3 在server1中插入信息:

mysql> INSERT INTO t1 VALUES (2, 'nigar');
Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM t1;

在這裏插入圖片描述

在server2和server3中可看到最新信息

step4 在server3中插入信息:

mysql> INSERT INTO t1 VALUES (3, 'xadi');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM t1;

在這裏插入圖片描述

在server1和server2中看到最新信息
在這裏插入圖片描述

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