前言:
?????????需要清楚知道:MySQL 復制組能夠以一種自動優先選擇的單主模式運行,在某個時間只有一個服務器接受更新 。但是對于更高優先級的用戶,組能夠以多主模式部署,所有的服務器都能夠接受更新,即使它們是同時發生的。組復制中存在著一種內建的組成員關系服務用來保持組的視圖一致,并且在任意時間對于組中的所有的服務器都可用。MySQL 服務器能夠退出或者加入組中,而且視圖也會相應的更新。有時服務器可能會意外的退出組 (故障),在這種情況下失敗檢測機制檢測這種情況并且告知復制組視圖發生了變化,這所有的一切都是自動實現的。
目錄
1.服務器環境部署
2.MGR組復制單主模式配置
(1)組復制第一個實例配置
①參數配置
②重啟服務
③用戶憑據
④組復制插件
⑤加入組復制
⑥數據測試
(2)組復制添加其他實例成員
①參數配置
②重啟服務
③用戶憑據
④組復制插件
⑤加入組復制
(3)數據測試
總結
1.服務器環境部署
本節實驗環境部署的是mysql 8.0.42三臺實例
主機名 | IP | Server ID | OS | MySQL version |
---|---|---|---|---|
node1 | 192.168.72.163 | 81 | OpenEuler24.3 | Mysql 8.0.42 |
node2 | 192.168.72.164 | 82 | OpenEuler24.3 | Mysql 8.0.42 |
node3 | 192.168.72.165 | 83 | OpenEuler24.3 | Mysql 8.0.42 |
#所有主機添加hosts解析
[root@node1 ~]# cat /etc/hosts
192.168.72.163 node1
192.168.72.164 node2
192.168.72.165 node3
2.MGR組復制單主模式配置
(本案例采用 MGR 默認單主模式)。
(1)組復制第一個實例配置
①參數配置
先給這組 MGR 起個組名,組名可以隨便起,但是不能使用主機的 GTID.
可以通過節點的 UUID 作為 loose-group_replication_group_name 的組名,并且每個節點的這個組名必須一樣!
這里使用參照官網設置手冊,如下設置組名,https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-instances.html
?# 如果要通過節點的UUID設置組名,查看節點node1的uid[root@node1 mysql]# cat /var/lib/mysql/auto.cnf [auto]server-uuid=dd746660-528a-11ed-9c86-000c293b9f86-- 或者通過sql查看mysql> select uuid();+--------------------------------------+| uuid() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |+--------------------------------------+| bf4b19ea-60f1-11ed-a06b-000c293b9f86 |+--------------------------------------+# 配置參數文件[root@node1 ~]# vim /etc/my.cnf[mysqld]# 原有默認配置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# 密碼驗證方式
default_authentication_plugin=mysql_native_password
#Storage Engines
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#Replication Framework
server_id=81
gtid_mode=ON
enforce_gtid_consistency=ON
?binlog_checksum=NONE?
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64?
sync-master-info =1
sync_binlog =1
#Group Replication Settings
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= "node1:33061"
group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"
group_replication_bootstrap_group=off
# 雙主模式,如果是單主模式無需配置,默認單主模式# 當前不配置,后續切換多主模式后再持久化該參數# group_replication_single_primary_mode=off# group_replication_enforce_update_everywhere_checks=on
參數說明:
?#以便在server收集寫集合的同時將其記錄到二進制日志。寫集合基于每行的主鍵,并且是行更改后的唯一標識此標識將用于檢測沖突。transaction_write_set_extraction=XXHASH64plugin_load_add='group_replication.so'#組的名字可以隨便起,但不能用主機的GTID! 所有節點的這個組名必須保持一致!group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"#為了避免每次啟動自動引導具有相同名稱的第二個組,所以設置為OFF。group_replication_start_on_boot=offgroup_replication_local_address= "node1:33061"group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"group_replication_bootstrap_group=off#關閉單主模式的參數#group_replication_single_primary_mode=off#開啟多主模式的參數#group_replication_enforce_update_everywhere_checks=on
②重啟服務
?# 所有節點systemctl restart mysqld
③用戶憑據
為了在每個實例上單獨創建復制用戶,可以禁用二進制日志記錄后再創建,請按照以下語句執行:
https://dev.mysql.com/doc/refman/8.0/en/group-replication-user-credentials.html
[root@node1 ~]# mysql -proot
mysql>
# mysql8默認密碼認證方式,客戶端是無法連接的,使用mysql_native_password,或在參數文件中加入參數
# default_authentication_plugin=mysql_native_password
# CREATE USER repl@'%' IDENTIFIED BY 'repl';
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED with mysql_native_password BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;?
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
修改mysql密碼?
進入mysql創建復制用戶
④組復制插件
?# 安裝組復制插件# INSTALL PLUGIN group_replication SONAME 'group_replication.so';# 本次已經在配置文件添加引導,無需再次安裝mysql> SHOW PLUGINS;+----------------------------+----------+--------------------+----------------------+-------------+| Name ? ? ? ? ? ? ? ? ? ? ? | Status ? | Type ? ? ? ? ? ? ? | Library ? ? ? ? ? ? | License ? ? |+----------------------------+----------+--------------------+----------------------+-------------+| binlog ? ? ? ? ? ? ? ? ? ? | ACTIVE ? | STORAGE ENGINE ? ? | NULL ? ? ? ? ? ? ? ? | PROPRIETARY |?(...)?| group_replication ? ? ? ? | ACTIVE ? | GROUP REPLICATION | group_replication.so | PROPRIETARY |+----------------------------+----------+--------------------+----------------------+-------------+
⑤加入組復制
?# 引導只能由單個服務器完成,即啟動組的服務器并且只執行一次。# 這就是為什么group_replication_bootstrap_group選項的值沒有存儲在實例的選項文件中的原因。# 如果它保存在選項文件中,則在重新啟動服務器時會自動引導第二個具有相同名稱的組。這將導致兩個不同的組具有相同的名稱mysql>
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;# 可以檢查該組現在是否已創建并且其中有一個成員# 要保證group_replication_applier的狀態為"ONLINE"!
mysql> SELECT * FROM performance_schema.replication_group_members;+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+| CHANNEL_NAME ? ? ? ? ? ? | MEMBER_ID ? ? ? ? ? ? ? ? ? ? ? ? ? | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+| group_replication_applier | dd746660-528a-11ed-9c86-000c293b9f86 | node1 ? ? ? | ? ? ? ?3306 | ONLINE ? ? ? | PRIMARY ? ? | 8.0.31 ? ? ? ? | XCom ? ? ? ? ? ? ? ? ? ? ? |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+1 row in set (0.00 sec)
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 (1.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;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | fa4f25e1-5beb-11f0-885f-000c29c274d2 | node1 | 3306 | ONLINE | PRIMARY | 8.0.42 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
1 row in set (0.00 sec)
⑥數據測試
?# 組復制環境下要求每個表都需要有主鍵,否則表上的DML會報錯:# ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin.mysql>
CREATE DATABASE test;
USE test;
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t1 VALUES (1, 'Luis');?
mysql> SELECT * FROM test.t1;+----+------+| c1 | c2 ? |+----+------+| ?1 | Luis |+----+------+
mysql> SHOW BINLOG EVENTS;
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)mysql> USE test;
Database changed
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO t1 VALUES (1, 'Luis');
Query OK, 1 row affected (0.03 sec)mysql> SELECT * FROM test.t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | Luis |
+----+------+
1 row in set (0.00 sec)mysql> SHOW BINLOG EVENTS;
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
| binlog.000001 | 4 | Format_desc | 1 | 126 | Server ver: 8.0.42, Binlog ver: 4 |
| binlog.000001 | 126 | Previous_gtids | 1 | 157 | |
| binlog.000001 | 157 | Stop | 1 | 180 | |
+---------------+-----+----------------+-----------+-------------+-----------------------------------+
3 rows in set (0.00 sec)
(2)組復制添加其他實例成員
①參數配置
參數配置和第一個節點的參數類似,只需修改
server_id
和group_replication_local_address
.
?# 將參數文件拷貝到其他節點[root@node1 ~]# scp /etc/my.cnf root@node2:/etc/my.cnf[root@node1 ~]# scp /etc/my.cnf root@node3:/etc/my.cnf?# 配置參數文件,其他參數相同,修改如下兩個參數[root@node2 ~]# vim /etc/my.cnf[mysqld]server_id = 82group_replication_local_address= "node2:33061"[root@node3 ~]# vim /etc/my.cnf[mysqld]server_id = 83group_replication_local_address= "node3:33061"
切換到node2主機修改配置文件?
?切換到node3主機修改配置文件
②重啟服務
?# 所有節點systemctl restart mysqld
③用戶憑據
為了在每個實例上單獨創建復制用戶,可以禁用二進制日志記錄后再創建,請按照以下語句執行:
User Credentials For Distributed Recovery
mysql>
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;?
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
切換到node2主機創建復制用戶
?切換到node3主機創建復制用戶
④組復制插件
?# 安裝組復制插件# INSTALL PLUGIN group_replication SONAME 'group_replication.so';# 本次已經在配置文件添加引導,無需再次安裝
⑤加入組復制
?#這里只需要執行這一步即可,因為組已經創建mysql> START GROUP_REPLICATION;#查看組內情況,發現node2,node3已經成功加入這個組了#一主兩從模式mysql> SELECT * FROM performance_schema.replication_group_members;+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+| CHANNEL_NAME ? ? ? ? ? ? | MEMBER_ID ? ? ? ? ? ? ? ? ? ? ? ? ? | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+| group_replication_applier | 2dd88a45-6161-11ed-b5d2-000c299aa451 | node3 ? ? ? | ? ? ? ?3306 | ONLINE ? ? ? | SECONDARY ? | 8.0.31 ? ? ? ? | XCom ? ? ? ? ? ? ? ? ? ? ? || group_replication_applier | 30c9d73b-6161-11ed-b523-000c2913fd72 | node2 ? ? ? | ? ? ? ?3306 | ONLINE ? ? ? | SECONDARY ? | 8.0.31 ? ? ? ? | XCom ? ? ? ? ? ? ? ? ? ? ? || group_replication_applier | 32710bb7-6161-11ed-b45b-000c29b2256f | node1 ? ? ? | ? ? ? ?3306 | ONLINE ? ? ? | PRIMARY ? ? | 8.0.31 ? ? ? ? | XCom ? ? ? ? ? ? ? ? ? ? ? |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+3 rows in set (0.00 sec)
切換到node2主機加入組復制?
切換到node3主機加入組復制?
(3)數據測試
#主庫創建
mysql> CREATE DATABASE recovery_test;
Query OK, 1 row affected (0.01 sec)
mysql> USE recovery_test;
Database changed
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
Query OK, 0 rows affected (0.03 sec)mysql> INSERT INTO t1 VALUES (1, 'Luis');
Query OK, 1 row affected (0.01 sec)#從庫查詢
mysql> SELECT * FROM recovery_test.t1;
+----+------+
| c1 | c2 ? |
+----+------+
| ?1 | Luis |
+----+------+
1 row in set (0.00 sec)
#主庫添加數據
INSERT INTO recovery_test.t1 VALUES (2, 'Klaus');
#從庫查詢
mysql> ?SELECT * FROM recovery_test.t1;
+----+-------+
| c1 | c2 ? |
+----+-------+
| ?1 | Luis |
| ?2 | Klaus |
+----+-------+
2 rows in set (0.00 sec)
node2驗證?
node3驗證
以上驗證成功后,組復制配置結束
總結:
????????基于GTID的組復制通過事務唯一標識+自動位點同步,顯著簡化了分布式集群的運維復雜度。部署核心在于:
????????1.全節點GTID參數統一配置;
????????2.初始數據強一致保障;
????????3.多主架構下沖突解決策略優化;
????????4.配套半同步復制與自動故障轉移提升可用性。
????????5.生產環境中需持續監控GTID執行進度,并規避非事務引擎操作,以維持集群穩定性。