1. 程式人生 > >mysql5.8實現組複製(MGR)

mysql5.8實現組複製(MGR)

1.什麼是MYSQL GROUP REPLICATE?

MySQL Group Replication(下簡稱MGR)準確來說是官方推出的高可用解決方案,基於原生複製技術,並以外掛的方式提供。

通過Paxos協議提供資料庫叢集節點資料強一致保證,掃清了MySQL進入金融行業最後的障礙。

叢集間所有節點可寫入,這是很多同學夢寐以求的功能,解決了單個叢集的寫入效能,所有節點都能讀寫,不過現實還是有些殘酷;

解決網路分割槽導致的腦裂問題,提升複製資料的可靠性。

3種複製的比較:

第一種:組複製與非同步主從複製區別.

第二種:半同步複製,它在協議中添加了一個同步步驟。 這意味著主節點在提交時需要等待從節點確認它已經接收到事務。只有這樣,主節點才能繼續提交操作。

3.MySQL 組複製實現了基於複製協議的多主更新。

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

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

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

4)他們是由一個分散式恢復程式來確保當有 server 加入組時,它們會自動更新組資訊到最新。並且多主更新確保了即使在單個伺服器故障的情況下也不會阻止更新,不必進行 server故障轉移。因此,MySQL 組複製保證資料庫服務持續可用。

5)值得注意的一點是,儘管資料庫服務可用,但當有一個 server 崩潰時,連線到它的客戶端必須定向或故障轉移到不同的 server。

這不是組複製要解決的問題。聯結器,負載均衡器,路由器或其他形式的中介軟體更適合處理這個問題。

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

MGR的限制

僅支援InnoDB表,並且每張表一定要有一個主鍵,用於做write set的衝突檢測;

必須開啟GTID特性,二進位制日誌格式必須設定為ROW,用於選主與write set

COMMIT可能會導致失敗,類似於快照事務隔離級別的失敗場景

目前一個MGR叢集最多支援9個節點

不支援外來鍵於save point特性,無法做全域性間的約束檢測與部分部分回滾

二進位制日誌不支援binlog event checksum

MYsql 5.8的安裝與叢集的安裝

步驟一 . 安裝5.8

wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.12-linux-glibc2.12-x86_64.tar.xz  #下載
xz -d mysql-8.0.12-linux-glibc2.12-x86_64.tar.xz #解壓
tar -xvf mysql-8.0.12-linux-glibc2.12-x86_64.tar #tar解壓

建立一個my.cnf 用於初始化

[[email protected] mysql]# cat my.cnf

[mysqld]
server-id                      = 2
port                           = 3307
mysqlx_port                    = 33070
mysqlx_socket                  = /tmp/mysqlx.sock
datadir                        = /root/mgr/node1/mysql/node1/data/mysql
socket                         = /tmp/mysql.sock
pid-file                       = /tmp/mysqld.pid
log-error                      = error.log
slow-query-log                 = 1
slow-query-log-file            = slow.log
long_query_time                = 0.2
log-bin                        = bin.log
relay-log                      = relay.log
binlog_format                 =ROW
relay_log_recovery            = 1
character-set-client-handshake = FALSE
character-set-server           = utf8mb4
collation-server               = utf8mb4_unicode_ci
init_connect                   ='SET NAMES utf8mb4'
innodb_buffer_pool_size        = 1G
join_buffer_size               = 128M
sort_buffer_size               = 2M
read_rnd_buffer_size           = 2M
log_timestamps                 = SYSTEM
lower_case_table_names         = 1
default-authentication-plugin  =mysql_native_password

#server_id=1                     #設定複製過程是不同的server_id
gtid_mode=ON                    #開啟GTID事務模式
enforce_gtid_consistency=ON     #開啟GTID事務模式
master_info_repository=TABLE       #slave的master_info放在TABLE裡
relay_log_info_repository=TABLE    #slave的relay_log_info放在TABLE裡
binlog_checksum=NONE            #關閉binlog的checksum
log_slave_updates=ON            #接收master的log資訊並寫入slave的binary log裡
log_bin=binlog                  #開啟binary log
binlog_format=ROW               #binary log的日誌格式為row
transaction_write_set_extraction=XXHASH64         #server為每個事務收集write set並用XXHASH64哈唏演算法編碼這個set
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"    #表示plugin連線、建立的group的名稱
loose-group_replication_start_on_boot=off         #當server開啟時,plugin並不會自動開啟
loose-group_replication_local_address= "127.0.0.1:33071"    #表示本地以IP,PORT與group中的其它member進行連線
loose-group_replication_group_seeds= "127.0.0.1:33071,127.0.0.1:33081,127.0.0.1:33091"  #告訴plugin這些IP加入group中通過port相互
loose-group_replication_bootstrap_group= off      #關閉boostrap the group
loose-group_replication_single_primary_mode=FALSE #關閉single_primary_mode
loose-group_replication_enforce_update_everywhere_checks= TRUE    #當multi-master時對任何更改開啟強一制性檢查

建立資料夾 /root/mgr/node1/mysql/node1/data/mysql 

my.cnf 位於/root/mgr/node1/mysql/node1 下

basedir 指的是mysql的安裝目錄 

初始化:

./bin/mysqld --defaults-file=/root/mgr/node1/mysql/node1/my.cnf --initialize-insecure

這邊使用 --initialize-insecure 建立 然後免密碼登入 ,   初始化data 

mysql 啟動 

./bin/mysqld --defaults-file=/root/mgr/node1/mysql/node1/my.cnf --user=root &

mysql 登入 

./mysql -uroot -P3308 -h127.0.0.1

節點2 對應的my.cnf 

[[email protected] node1]# cat ../node2/my.cnf
[mysqld]
server-id                      = 2
port                           = 3308
mysqlx_port                    = 33080
mysqlx_socket                  = /tmp/mysqlx1.sock
datadir                        = /root/mgr/node1/mysql/node2/data/mysql
socket                         = /tmp/mysql1.sock
pid-file                       = /tmp/mysqld1.pid
log-error                      = error.log
slow-query-log                 = 1
slow-query-log-file            = slow.log
long_query_time                = 0.2
log-bin                        = bin.log
relay-log                      = relay.log
binlog_format                 =ROW
relay_log_recovery            = 1
character-set-client-handshake = FALSE
character-set-server           = utf8mb4
collation-server               = utf8mb4_unicode_ci
init_connect                   ='SET NAMES utf8mb4'
innodb_buffer_pool_size        = 1G
join_buffer_size               = 128M
sort_buffer_size               = 2M
read_rnd_buffer_size           = 2M
log_timestamps                 = SYSTEM
lower_case_table_names         = 1
default-authentication-plugin  =mysql_native_password

gtid_mode=ON                    #開啟GTID事務模式
enforce_gtid_consistency=ON     #開啟GTID事務模式
master_info_repository=TABLE       #slave的master_info放在TABLE裡
relay_log_info_repository=TABLE    #slave的relay_log_info放在TABLE裡
binlog_checksum=NONE            #關閉binlog的checksum
log_slave_updates=ON            #接收master的log資訊並寫入slave的binary log裡
log_bin=binlog                  #開啟binary log
binlog_format=ROW               #binary log的日誌格式為row
transaction_write_set_extraction=XXHASH64         #server為每個事務收集write set並用XXHASH64哈唏演算法編碼這個set
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"    #表示plugin連線、建立的group的名稱
loose-group_replication_start_on_boot=off         #當server開啟時,plugin並不會自動開啟
loose-group_replication_local_address= "127.0.0.1:33081"    #表示本地以IP,PORT與group中的其它member進行連線
loose-group_replication_group_seeds= "127.0.0.1:33071,127.0.0.1:33081,127.0.0.1:33091"  #告訴plugin這些IP加入group中通過port相互聯絡。那些想加入group的就是seed member   
loose-group_replication_bootstrap_group= off      #關閉boostrap the group
loose-group_replication_single_primary_mode=FALSE #關閉single_primary_mode
loose-group_replication_enforce_update_everywhere_checks= TRUE    #當multi-master時對任何更改開啟強一制性檢查

第二步mysql group replicate 叢集建立

my.conf中 如果沒有下面這部分對應的進行新增.

#server_id=1                     #設定複製過程是不同的server_id
gtid_mode=ON                    #開啟GTID事務模式
enforce_gtid_consistency=ON     #開啟GTID事務模式
master_info_repository=TABLE       #slave的master_info放在TABLE裡
relay_log_info_repository=TABLE    #slave的relay_log_info放在TABLE裡
binlog_checksum=NONE            #關閉binlog的checksum
log_slave_updates=ON            #接收master的log資訊並寫入slave的binary log裡
log_bin=binlog                  #開啟binary log
binlog_format=ROW               #binary log的日誌格式為row
transaction_write_set_extraction=XXHASH64         #server為每個事務收集write set並用XXHASH64哈唏演算法編碼這個set
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"    #表示plugin連線、建立的group的名稱
loose-group_replication_start_on_boot=off         #當server開啟時,plugin並不會自動開啟
loose-group_replication_local_address= "127.0.0.1:33071"    #表示本地以IP,PORT與group中的其它member進行連線
loose-group_replication_group_seeds= "127.0.0.1:33071,127.0.0.1:33081,127.0.0.1:33091"  #告訴plugin這些IP加入group中通過port相互
loose-group_replication_bootstrap_group= off      #關閉boostrap the group
loose-group_replication_single_primary_mode=FALSE #關閉single_primary_mode
loose-group_replication_enforce_update_everywhere_checks= TRUE    #當multi-master時對任何更改開啟強一制性檢查

 primary進行對應的設定:

mysql> create user [email protected]'%'; #建立使用者
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> ALTER USER 'rpl_user'@'%' IDENTIFIED BY '[email protected]'; #修改密碼
Query OK, 0 rows affected (0.08 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected]'%';      #來自其它member的恢復需要的user credentials
Query OK, 0 rows affected (0.06 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.06 sec)

mysql>  CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='[email protected]' FOR CHANNEL 'group_replication_recovery'; #這個複製跟普通的change master命令有區別,並不需要指定master是誰,但需要指定通道為’group_replication_recovery’。
Query OK, 0 rows affected, 1 warning (0.28 sec)

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; #建立外掛
Query OK, 0 rows affected (0.08 sec)


mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A


Database changed
mysql> select * from plugin;
+-------------------+----------------------+
| name              | dl                   |
+-------------------+----------------------+
| group_replication | group_replication.so |
+-------------------+----------------------+
1 row in set (0.01 sec)

mysql> reset master;  # 情空空一些事務  有時候 也需要reset salve

mysql> SET GLOBAL group_replication_bootstrap_group=ON;  #此引導應僅由單個 sever 獨立完成,該 server 啟動組並且只啟動一次。 這就是為什麼引導配置選項的值不儲存在配置檔案中的原因。 如果將其儲存在配置檔案中,則在重新啟動時,server 會自動引導具有相同名稱的第二
個組。 這將導致兩個不同的組具有相同的名稱
Query OK, 0 rows affected (0.00 sec)

mysql> start GROUP_REPLICATION;
Query OK, 0 rows affected (3.13 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 | MEMBE
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+------
| group_replication_applier | 5074d59f-b654-11e8-a315-000c294c72a4 | localhost.localdomain |        3307 | ONLINE       | PRIMA
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+------
1 row in set (0.00 sec)

replicate:

mysql> create user [email protected]'%';
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> ALTER USER 'rpl_user'@'%' IDENTIFIED BY '[email protected]';
Query OK, 0 rows affected (0.08 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected]'%';
Query OK, 0 rows affected (0.06 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.06 sec)

mysql>  CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='[email protected]' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 1 warning (0.28 sec)

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.08 sec)

mysql> select * from plugin;
ERROR 1046 (3D000): No database selected
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A


Database changed
mysql> select * from plugin;
+-------------------+----------------------+
| name              | dl                   |
+-------------------+----------------------+
| group_replication | group_replication.so |
+-------------------+----------------------+
1 row in set (0.01 sec)

mysql> reset master;
Query OK, 0 rows affected (0.03 sec)

mysql>  START GROUP_REPLICATION;
Query OK, 0 rows affected (3.99 sec)

或者在建立使用者的時候 關閉bin_log

SET SQL_LOG_BIN=0;
...

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

第三步: 錯誤 

mysql> start GROUP_REPLICATION;
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.
檢視 data/error.log

2018-09-13T19:40:37.540136-08:00 0 [ERROR] [MY-011526] [Repl] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 3d335d54-b7c6-11e8-8cd5-000c294c72a4:1-3 > Group transactions: 5074d59f-b654-11e8-a315-000c294c72a4:1-5,
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-13'
2018-09-13T19:40:37.540182-08:00 0 [ERROR] [MY-011522] [Repl] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'

解決辦法:
reset master;
stop GROUP_REPLICATION;

第四部:GR相關的檢視 檢視命令

1.檢視GR中的memeber:

SELECT * FROM performance_schema.replication_group_members \G ;

2.檢視GR中的memeber的統計資訊:

select * from performance_schema.replication_group_member_stats \G ;

3.檢視replication連線status:

select * from performance_schema.replication_connection_status \G ;

4.檢視replicaton的applier的狀態:

select * from performance_schema.replication_applier_status \G ;

5.看哪個是primary

select *from  performance_schema.replication_group_members where member_id =(select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member');

或  show global status like 'group_replication_primary_member';

備份與匯入:

資料全部丟失的情況下,或者data 下的檔案全都丟失了。

mysqlbackup --defaults-file=/etc/my.cnf --with-timestamp \
--host=localhost --user=root --password=mtls0352 \
--backup-dir=/tmp/ --backup-image=/tmp/2017-12-01T12:30:00.mbi --no-history-logging \
backup-to-image

目標主機恢復:

mysqlbackup --defaults-file=/etc/my.cnf --backup-image=/tmp/2017-12-01T12:30:00.mbi \
 --backup-dir=/tmp/ --datadir=/database/mysql/data/3306/ \
 copy-back-and-apply-log

mysql命令執行:

mysql> reset master;
Query OK, 0 rows affected (0.10 sec)

mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)

mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

mysql> source /database/mysql/data/3306/backup_gtid_executed.sql ;
Query OK, 0 rows affected (0.10 sec)

mysql> set sql_log_bin=1;

餘下就是配置作為replicate加入叢集。

參考資料:

https://blog.csdn.net/vkingnew/article/details/81267223  Linux安裝MySQL8.0.12之二進位制安裝
https://blog.csdn.net/yajie_12/article/details/78770573  mysql MGR常見問題大全
https://www.cnblogs.com/JiangLe/p/7941929.html   mysql group replication 主節點宕機恢復
https://blog.csdn.net/sinat_36888624/article/details/79215233  mysql5.7實現組複製(MGR)
https://blog.csdn.net/u010719917/article/details/79098734   mysql5.7的GROUP REPLICATION操作步驟
https://www.cnblogs.com/JiangLe/p/7941929.html  mysql group replication 主節點宕機恢復