1. 規划
2 連接master報錯, 使用主機名連接,所有需要修改主機 /etc/hosts
cat /etc/hosts
127.0.0.1 localhost 172.18.12.2 master 172.18.12.3 slave1 172.18.12.4 slave2 172.18.12.5 slave3 172.18.12.6 slave4
3.設置mysql啟動參數
#關於group replication 一些參數
master_info_repository = TABLE relay_log_info_repository = TABLE relay_log_recovery=1 gtid_mode = on enforce_gtid_consistency = 1 log_slave_updates = ON
binlog_checksum=NONE
slave_preserve_commit_order = ON #開啟並行復制相關
server_id=1 #第一個節點是1 ,第二個節點是2 ......
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers=2-8 #根據cpu數量 transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" loose-group_replication_start_on_boot=off loose-group_replication_local_address="172.18.12.2:23306" loose-group_replication_group_seeds="172.18.12.2:23306,172.18.12.3:23306,172.18.12.4:23306,172.18.12.5:23306,172.18.12.6:23306" loose-grup_replication_bootstrap_group=off
4.初始化:
mysqld --initialize
5.第一個節點啟動
mysqld --defaults-file=/etc/my.cnf &
6. 登錄到mysql, 創建一個賬戶,不記錄到binlog中
mysql -u root -p
set sql_log_bin=0;
create user 'feng'@'172.18.12.%'; grant replication slave on *.* to 'feng'@'172.18.12.%' identified by '123456'; set sql_log_bin=1;
7. channel 的名字不能改變
root@localhost 03:07: [(none)]> change master to master_user='feng', master_password='123456' FOR CHANNEL 'group_replication_recovery';
8. 安裝 加載group_replication插件
install plugin group_replication soname 'group_replication.so'; show plugins;
9. 查看group相關參數
root@localhost 03:11: [(none)]> show global variables like '%group%';
10. 設置第一個節點啟動為on
set global group_replication_bootstrap_group=on; #只在第一個節點使用
11. 啟動group_replication
start group_replication;
#啟動后報錯
2020-03-25T13:31:11.636568+08:00 6 [Warning] Plugin group_replication reported: 'Group Replication requires slave-preserve-commit-order to be set to ON when using more than 1 applier threads.'
slave_preserve_commit_order=on #並行復制相關
12. 查看是否加入到組中
select * from performance_schema.replication_group_members;
root@localhost 05:50: [performance_schema]> select * from replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | a59bc963-5772-11ea-93aa-0242ac120c02 | master | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
二、加入二個節點172.18.12.3 節點
2.設置mysql啟動參數
#關於group replication 一些參數
master_info_repository = TABLE
relay_log_info_repository = TABLE relay_log_recovery=1 gtid_mode = on enforce_gtid_consistency = 1 log_slave_updates = ON
server_id=2 #第一個節點是1 ,第二個節點是2 ......
binlog_checksum=NONE
slave_preserve_commit_order = ON #開啟並行復制相關
slave_parallel_type=LOCIGCAL_CLOCK
slave_parallel_workers=2-8 #根據cpu數量
transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" loose-group_replication_start_on_boot=off loose-group_replication_local_address="172.18.12.3:23306" loose-group_replication_group_seeds="172.18.12.2:23306,172.18.12.3:23306,172.18.12.4:23306,172.18.12.5:23306,172.18.12.6:23306" loose-grup_replication_bootstrap_group=off
初始化mysql,啟動mysql
mysql --initialize
mysqld --defaults-file=/etc/my.cnf &
5. 登錄到mysql, 創建一個賬戶,不記錄到binlog中
mysql -u root -p
set sql_log_bin=0; create user 'feng'@'172.18.12.%'; grant replication slave on *.* to 'feng'@'172.18.12.%' identified by '123456'; set sql_log_bin=1;
6. channel 的名字不能改變
root@localhost 03:07: [(none)]> change master to master_user='feng', master_password='123456' FOR CHANNEL 'group_replication_recovery';
7. 安裝 加載group_replication插件
install plugin group_replication soname 'group_replication.so';
show plugins;
10. 啟動group_replication
set global group_replication_allow_local_disjoint_gtids_join=ON;
start group_replication;
11. 查看狀態:
root@localhost 07:12: [(none)]> show slave status for channel 'group_replication_recovery' \G; *************************** 1. row *************************** Slave_IO_State: Master_Host: master Master_User: rpl_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: Read_Master_Log_Pos: 4 Relay_Log_File: slave1-relay-bin-group_replication_recovery.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: Slave_IO_Running: No Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 0 Relay_Log_Space: 1534 Until_Condition: SQL_VIEW_ID Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 2005 Last_IO_Error: error connecting to master 'rpl_user@master:3306' - retry-time: 60 retries: 1 Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 Master_UUID: Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 1 Master_Bind: Last_IO_Error_Timestamp: 200225 07:15:55 Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: group_replication_recovery Master_TLS_Version: 1 row in set (0.00 sec) ERROR: No query specified
再次查看:
root@localhost 07:20: [(none)]> show slave status for channel 'group_replication_recovery' \G; *************************** 1. row *************************** Slave_IO_State: Master_Host: <NULL> Master_User: rpl_user Master_Port: 0 Connect_Retry: 60 Master_Log_File: Read_Master_Log_Pos: 4 Relay_Log_File: slave1-relay-bin-group_replication_recovery.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: Slave_IO_Running: No Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 0 Relay_Log_Space: 496 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 Master_UUID: Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Master_Retry_Count: 1 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: 09440083-2b74-11ea-838b-549f3510fe78:1-4 Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: group_replication_recovery Master_TLS_Version: 1 row in set (0.00 sec) ERROR: No query specified
11. 查看是否加入到組中
root@localhost 07:21: [performance_schema]> select * from replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 66576b31-579b-11ea-b037-0242ac120c02 | master | 3306 | ONLINE | | group_replication_applier | 6808a18a-579b-11ea-97cd-0242ac120c03 | slave1 | 3306 | ONLINE | | group_replication_applier | 695065b9-579b-11ea-a932-0242ac120c05 | slave3 | 3306 | ONLINE | | group_replication_applier | 6bc82210-579b-11ea-bb3b-0242ac120c04 | slave2 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ 4 rows in set (0.00 sec)
配置出現的問題:
1 [ERROR] Plugin group_replication reported: 'Gtid mode should be ON for Group Replication'
沒有打開GtID
2 Last_IO_Error: error connecting to master 'rpl_user@master:3306' - retry-time: 60 retries: 1
添加所有節點的主機名和ip的對應關系到/etc/hosts
3. [ERROR] Plugin group_replication reported: '[GCS] Error on opening a connection to 172.17.12.6:23306 on local port: 23306.
/etc/my.cnf 配置文件 loose-group_replication_group_seeds ip地址寫錯了
4. 第二個節點加入MGR時報錯[
ERROR] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: f9418f39-8f6a-11ea-8e60-005056841c10:1 > Group transactions: 6c0d784d-8f66-11ea-bd2e-00505684742a:1,
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-5'
2020-05-06T16:09:46.375914+08:00 0 [ERROR] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'
解決辦法 需要設置參數,也就是兼容加入組
set global group_replication_allow_local_disjoint_gtids_join=ON;
12 創建測試數據庫(master可以寫入,其他節點不能寫入)
master:
root@localhost 05:52: [fengjian]> create database fengjian; root@localhost 05:52: [fengjian]> use fengjian; root@localhost 05:52: [fengjian]> create table test(id int, name varchar(60), primary key(id)); root@localhost 05:52: [fengjian]> insert into test values(1,'feng');
slave: 報錯,無法寫入
root@localhost 08:18: [fengjian]> insert into test values(2,'su');
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
查看其他節點所有節點的read_only 選項
master

slave1

Group replication 工作模式
1. 基於single-master 環境:
在group replication 配置中,默認模式是 single-master 模式, 只有一個節點可以進行寫操作,其他節點開啟 --super-read-only 模式, 當主幾點掛了, 其他節點會選出來一個新的master
在 single-master 上查看那個節點是 主節點:
root@localhost 08:25: [performance_schema]> select variable_value from global_status where variable_name='group_replication_primary_member'; +--------------------------------------+ | variable_value | +--------------------------------------+ | 43567e06-6e49-11ea-a1ef-0242ac110003 | +--------------------------------------+

登錄到 其他節點上,查看 uuid
root@localhost 08:27: [fengjian]> select @@server_uuid; +--------------------------------------+ | @@server_uuid | +--------------------------------------+ | 43567e06-6e49-11ea-a1ef-0242ac110003 |
+--------------------------------------+
multi-master 模式 (多主,性能有15%的損失)
如果要開啟multi-master 模式,需要在配置文件/etc/my.cnf 中指定
loose-group_replication_single_primary_mode=OFF;
loose-group_replication_enforce_update_everywhere_checks=ON;
不管是 single-master 還是 multi-master ,我們只提供一台負責寫操作
集群重啟:
1. 滾動重啟
節點上執行 : start group_replication;
2. 全部一起重啟(集體掉電)
第一個節點啟動(single-master 和 multi-master 都一樣)
要在每個節點執行 show master stauts; 如果那個gtid多,則設置成主節點。 set global_replication_bootstrap_group=on; start group_replication;
其他節點 start group-replication;
MGR 監控點講解:
可用性監控
root@localhost 09:28: [performance_schema]> select member_id,member_host,member_state from replication_group_members where member_id=@@server_uuid; +--------------------------------------+-------------+--------------+ | member_id | member_host | member_state | +--------------------------------------+-------------+--------------+ | 66576b31-579b-11ea-b037-0242ac120c02 | master | ONLINE | +--------------------------------------+-------------+--------------+
查看當前是不是可讀
root@localhost 09:32: [performance_schema]> select * from performance_schema.global_variables where variable_name in ('read_only', 'super_read_only'); +-----------------+----------------+ | VARIABLE_NAME | VARIABLE_VALUE | +-----------------+----------------+ | read_only | OFF | | super_read_only | OFF | +-----------------+----------------+
為可讀節點
復制是不是存在延遲:
對比獲得到的GTID和本節點執行的GTID是不是一致:
從遠程獲取的GTID:
SELECT Received_transaction_set FROM performance_schema.replication_connection_status WHERE Channel_name = 'group_replication_applier';
本節點執行的GTID:
select @@global.gtid_executed; 不顯示結果
root@localhost 09:47: [performance_schema]> show global variables like '%gtid_executed%';
+----------------------------------+--------------------------------------------+
| Variable_name | Value |
+----------------------------------+--------------------------------------------+
| gtid_executed | 09440083-2b74-11ea-838b-549f3510fe78:1-977 |
遠程獲取的GTID - 本節點執行的GTID = 延遲的GTID數
本節點執行隊列是不是有堆積(大於0表示有延遲):
select count_transactions_in_queue from replication_group_member_stats where member_id=@@server_uuid;
流控(flow control)
在MGR中如果節點落后集群中其它成員太多,就會發起讓其它節點等他完成在做的控制,這個叫流控。
當啟用:
group_replication_flow_control_mode=QUOTA 是表示啟用流控。 流控默認通過兩個參數控制: group_replication_flow_control_applier_threshold (默認: 25000) group_replication_flow_control_certifier_threshold (默認: 25000)
也就說默認延遲在25000個GTID時,會對整個集群Block住寫操作。
當然,也可以允許,節點延遲,就如同我們主從結構,從節點延遲,不往上面發請求就可以。
關閉流控:
set global group_replication_flow_control_mode='DISABLED';
提示: 關閉流控制,注意查看是不是存在延遲,如果延遲,自已控制閥值不向上面發請求即可。 多IDC結構的MGR,建議關閉流控。
MGR調優參數
因為基本復制結構,所有的數據復制,還是邏輯的重放,所以優化也是復制優化點。
更改:
slave_parallel_type -> LOGICAL_CLOCK #增強sql_thread個數:
slave_parallel_workers -> 2-8 #如果CPU瓶頸,網絡沒問題,減少CPU壓縮:
group_replication_compression_threshold = 1000000 -> 2000000 由原來的1M變成2M,再進行壓縮(主要針對大事務傳述優化)
MGR備份及新節點的加入
1. 通過備份工具,建立備份 2. 加載MGR插件 3. mysqldump -u root --single-transaction -A > full_bak.sql 其他從庫,備份
4. 新加入的mgr節點配置文件
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="172.18.12.7:23306"
loose-group_replication_group_seeds="172.18.12.2:23306,172.18.12.3:23306,172.18.12.4:23306,172.18.12.5:23306,172.18.12.6:23306,172.18.12.7:23306"
loose-group_replication_bootstrap_group=off
5. mysql -u root -p ; reset master ; mysql -u root -p < full_bak.sql 6. 可以加入集群的關鍵點: set global gtid_purged='xxx-xxxx-xxxx:id'
7. start group_replication;
8. use performance_schema; select * from replication_group_members;
root@localhost 08:52: [performance_schema]> show slave status FOR CHANNEL 'group_replication_recovery' \G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: <NULL>
Master_User: rpl_user
Master_Port: 0
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: slave3-relay-bin-group_replication_recovery.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 0
Relay_Log_Space: 496
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 1
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set: 09440083-2b74-11ea-838b-549f3510fe78:1-896
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name: group_replication_recovery
Master_TLS_Version:
如果binlog已經過期, start group_replication 啟動報錯,因為從庫的gtid信息已經刪除了,
引用
https://www.cnblogs.com/manger/p/7212039.html