MySQL5.7.17 Group Replication初始詳細說明
發表時間:2023-09-10 來源:明輝站整理相關軟件相關文章人氣:
[摘要]1,關于 Group Replication基于組的復制(Group-based Replication)是一種被使用在容錯系統中的技術。Replication-group(復制組)是由能夠相互通信的多個服務器(節點)組成的。在通信層,Group replication實現了一系列的機制:比如原子...
1,關于 Group Replication
基于組的復制(Group-based Replication)是一種被使用在容錯系統中的技術。Replication-group(復制組)是由能夠相互通信的多個服務器(節點)組成的。
在通信層,Group replication實現了一系列的機制:比如原子消息(atomic message delivery)和全序化消息(totalordering of messages)。
這些原子化,抽象化的機制,為實現更先進的數據庫復制方案提供了強有力的支持。
MySQL Group Replication正是基于這些技術和概念,實現了一種多主全更新的復制協議。
簡而言之,一個Replication-group就是一組節點,每個節點都可以獨立執行事務,而讀寫事務則會在于group內的其他節點進行協調之后再commit。
因此,當一個事務準備提交時,會自動在group內進行原子性的廣播,告知其他節點變更了什么內容/執行了什么事務。
這種原子廣播的方式,使得這個事務在每一個節點上都保持著同樣順序。
這意味著每一個節點都以同樣的順序,接收到了同樣的事務日志,所以每一個節點以同樣的順序重演了這些事務日志,最終整個group保持了完全一致的狀態。
然而,不同的節點上執行的事務之間有可能存在資源爭用。這種現象容易出現在兩個不同的并發事務上。
假設在不同的節點上有兩個并發事務,更新了同一行數據,那么就會發生資源爭用。
面對這種情況,Group Replication判定先提交的事務為有效事務,會在整個group里面重演,后提交的事務會直接中斷,或者回滾,最后丟棄掉。
因此,這也是一個無共享的復制方案,每一個節點都保存了完整的數據副本。看如下圖片01.png,描述了具體的工作流程,能夠簡潔的和其他方案進行對比。這個復制方案,在某種程度上,和數據庫狀態機(DBSM)的Replication方法比較類似。

2,安裝mysql5.7.17
官網下載MYSQL5.7.17
在三臺db服務器上面設置/etc/hosts映射,如下:
192.168.136.130 db1 192.168.136.133 db2 192.168.136.134 db3 |
安裝的數據庫服務器:
數據庫服務器地址 | 端口 | 數據目錄 | Server-id |
192.168.136.130(db1) | 3317 | /data/mysql/data | 120136130 |
192.168.136.133(db2) | 3317 | /data/mysql/data | 120136133 |
192.168.136.134(db3) | 3317 | /data/mysql/data | 120136134 |
3,搭建gtid復制:
在3臺my.cnf上面配置gtid:
[mysqld]
gtid_mode=ON
log-slave-updates=ON
enforce-gtid-consistency=ON |
在3臺mysql實例上db1、db2、db3分配賬號:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.%' IDENTIFIED BY 'rlpbright_1927@ys';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> |
在db2、db3上搭建gtid服務:
mysql> change master to master_user='repl',
master_password='rlpbright_1927@ys',
master_host='db1',master_port=3317, master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.04 sec)
mysql>
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: db1
Master_User: repl
Master_Port: 3317
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 445
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 414
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
……………………………….. |
4,開啟Group Replication
有了gtid之后,開啟group replication就方便多了。首先需要安裝group replication插件
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.03 sec)
mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
Name Status Type Library License
+----------------------------+----------+--------------------+----------------------+---------+
binlog ACTIVE STORAGE ENGINE NULL GPL
…………
group_replication ACTIVE GROUP REPLICATION group_replication.so GPL
+----------------------------+----------+--------------------+----------------------+---------+
45 rows in set (0.00 sec)
|
配置參數,db1(master)上:
mysql> set @@global.transaction_write_set_extraction = XXHASH64
mysql> set @@global.group_replication_start_on_boot = OFF
mysql> set @@global.group_replication_bootstrap_group = OFF
mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6
mysql> set @@global.group_replication_local_address = 'db1:6606'
mysql> set @@global.group_replication_group_seeds = 'db2:6607,db3:6608' |
配置參數,db2(slave1)上:
mysql> set @@global.transaction_write_set_extraction = XXHASH64
mysql> set @@global.group_replication_start_on_boot = OFF
mysql> set @@global.group_replication_bootstrap_group = OFF
mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6
mysql> set @@global.group_replication_local_address = 'db2:6607'
mysql> set @@global.group_replication_group_seeds = 'db111:6606,127.0.0.1:db3'
|
配置參數,db3(slave2)上:
mysql> set @@global.transaction_write_set_extraction = XXHASH64
mysql> set @@global.group_replication_start_on_boot = OFF
mysql> set @@global.group_replication_bootstrap_group = OFF
mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6
mysql> set @@global.group_replication_local_address = 'db3:6608'
mysql> set @@global.group_replication_group_seeds = 'db1:6607,db2:6606'
|
BTY:如果之前沒有配置transaction_write_set_extraction=XXHASH64,這里修改之后之前創建的數據庫是沒有辦法執行插入操作的。所有如果想在線完成Group Replication的改造需要保證之前已經設置了transaction_write_set_extraction=XXHASH64。
開始構建集群,在db1(master)上執行:
# 構建集群 CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='rlpbright_1927@ys'FORCHANNEL'group_replication_recovery'; #開啟group_replication SETGLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SETGLOBAL group_replication_bootstrap_group=OFF;
|
db2、db3上加入
stop slave;
START GROUP_REPLICATION; |
在db1上查看集群信息:
mysql> SELECT * FROM performance_schema.replication_group_members;
|
以上就是MySQL5.7.17 Group Replication初始詳解的詳細內容,更多請關注php中文網其它相關文章!
學習教程快速掌握從入門到精通的SQL知識。