一、三節點MGR集群的安裝部署
1. 安裝準備
準備好下面三臺服務器: ?
IP | 端口 | 角色 |
---|---|---|
192.168.150.21 | 3306 | mgr1 |
192.168.150.22 | 3306 | mgr2 |
192.168.150.23 | 3306 | mgr3 |
配置hosts解析
# cat >> /etc/hosts << EOF
192.168.150.21 mgr1
192.168.150.22 mgr2
192.168.150.23 mgr3
EOF
2. 啟動MySQL Server
首先修改 /etc/my.cnf.d/mysql-server.cnf 配置文件,增加:
#/etc/my.cnf*.d/mysql-server.cnf
[mysqld]
...
#開啟GTID,必須開啟
gtid_mode = ON
#強制GTID的一致性
enforce_gtid_consistency = ON
#binlog格式,MGR要求必須是ROW,不過就算不是MGR,也最好用
binlog_format = row
#server-id必須是唯一的
server-id = 1
#MGR使用樂觀鎖,所以官網建議隔離級別是RC,減少鎖粒度
transaction_isolation = READ-COMMITTED
#因為集群會在故障恢復時互相檢查binlog的數據,
#所以需要記錄下集群內其他服務器發過來已經執行過的binlog,按GTID來區分是否執行過.
log-slave-updates = 1
#binlog校驗規則,5.6之后的高版本是CRC32,低版本都是NONE,但是MGR要求使用NONE
binlog_checksum = NONE
#基于安全的考慮,MGR集群要求復制模式要改成slave記錄記錄到表中,不然就報錯
master_info_repository = TABLE
#同上配套
relay_log_info_repository = TABLE
#組復制設置#記錄事務的算法,官網建議設置該參數使用 XXHASH64 算法
transaction_write_set_extraction = XXHASH64
#相當于此GROUP的名字,是UUID值,不能和集群內其他GTID值的UUID混用,可用uuidgen來生成一個新的,
#主要是用來區分整個內網里邊的各個不同的GROUP,而且也是這個group內的GTID值的UUID
loose-group_replication_group_name = '5dbabbe6-8050-49a0-9131-1de449167446'
#IP地址白名單,默認只添加127.0.0.1,不會允許來自外部主機的連接,按需安全設置
loose-group_replication_ip_whitelist = '127.0.0.1/8,192.168.0.0/16'
#是否隨服務器啟動而自動啟動組復制,不建議直接啟動,怕故障恢復時有擾亂數據準確性的特殊情況
loose-group_replication_start_on_boot = OFF
#本地MGR的IP地址和端口,host:port,是MGR的端口,不是數據庫的端口
loose-group_replication_local_address = '192.168.150.21:33081'
#需要接受本MGR實例控制的服務器IP地址和端口,是MGR的端口,不是數據庫的端口
loose-group_replication_group_seeds = '192.168.150.21:33081,192.168.150.22:33081,192.168.150.23:33081'
#開啟引導模式,添加組成員,用于第一次搭建MGR或重建MGR的時候使用,只需要在集群內的其中一臺開啟,
loose-group_replication_bootstrap_group = OFF
#是否啟動單主模式,如果啟動,則本實例是主庫,提供讀寫,其他實例僅提供讀,如果為off就是多主模式了
loose-group_replication_single_primary_mode = ON
#多主模式下,強制檢查每一個實例是否允許該操作,如果不是多主,可以關閉
loose-group_replication_enforce_update_everywhere_checks = on
?將mgr1的文件發送到mgr2和mgr3, 修改server-id和loose-group_replication_local_address的相關值
# scp /etc/my.cnf.d/mysql-server.cnf mgr2:/etc/my.cnf.d/
# scp /etc/my.cnf.d/mysql-server.cnf mgr2:/etc/my.cnf.d/
3.安裝插件(三臺機器都要安裝)
利用這份配置文件,重啟MySQL Server,之后就應該能看到已經成功加載 group_replicaiton
插件了:
[root@mgr1 ~]# mysql -e "show plugins;" | grep "group_replication"
如果沒正確加載,也可以登入MySQL Server自行手動加載這個plugin:
[root@mgr1 ~]# mysql -e "install plugin group_replication soname 'group_replication.so'"
[root@mgr1 ~]# mysql -e "show plugins;" | grep "group_replication"
group_replication ACTIVE GROUP REPLICATION group_replication.so GPL
4.配置賬號(三臺機器都要配置)
接下來,創建MGR服務專用賬戶,并準備配置MGR服務通道:
#每個節點都要單獨創建用戶,因此這個操作沒必要記錄binlog并復制到其他節點
mysql> set session sql_log_bin=0;
mysql> create user repl@'%' identified with mysql_native_password by 'repl';
mysql> GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO `repl`@`%`;
#創建完用戶后繼續啟用binlog記錄
mysql> set session sql_log_bin=1;#配置MGR服務通道
#通道名字 group_replication_recovery 是固定的,不能修改
mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
5.啟動MGR單主模式
在mgr1節點,啟動引導,進入mysql服務端
mysql> SET GLOBAL group_replication_bootstrap_group = ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group = OFF;
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 | 3460f111-9314-11ee-a532-000c295df6cf | mgr1 | 3306 | ONLINE | PRIMARY | 8.0.30 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
1 row in set (0.01 sec)
?在mgr2\mgr3節點,進入mysql服務端
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;
再次查看MGR節點狀態:
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 | 3460f111-9314-11ee-a532-000c295df6cf | mgr1 | 3306 | ONLINE | PRIMARY | 8.0.30 | XCom |
| group_replication_applier | 52854f96-9314-11ee-8821-000c29ced34f | mgr2 | 3306 | ONLINE | SECONDARY | 8.0.30 | XCom |
| group_replication_applier | 70fa199f-9314-11ee-a8eb-000c29f957d2 | mgr3 | 3306 | ONLINE | SECONDARY | 8.0.30 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)
?看到上面這個集群共有3個節點處于ONLINE狀態,其中 192.168.150.21 是 PRIMARY 節點,其余兩個都是 SECONDARY 節點,也就是說當前這個集群采用 單主 模式。如果采用多主模式,則所有節點的角色都是 PRIMARY。
6. 向MGR集群中寫入數據
接下來我們連接到 PRIMARY 節點,創建測試庫表并寫入數據:
mysql> create database mgr;
mysql> use mgr;
mysql> create table t1(c1 int unsigned not null primary key);
mysql> insert into t1 select rand()*10240;
mysql> select * from t1;
+------+
| c1 |
+------+
| 442 |
+------+
?再連接到其中一個 SECONDARY 節點,查看剛剛在 PRIMARY 寫入的數據是否可以看到:
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| mgr2 |
+------------+
1 row in set (0.00 sec)mysql> select * from mgr.t1;
+-----+
| c1 |
+-----+
| 442 |
+-----+
1 row in set (0.01 sec)
確認可以讀取到該數據。
到這里,就完成了三節點MGR集群的安裝部署
二、?MGR管理維護
現在有個三節點的MGR集群:
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 | 3460f111-9314-11ee-a532-000c295df6cf | mgr1 | 3306 | ONLINE | PRIMARY | 8.0.30 | XCom |
| group_replication_applier | 52854f96-9314-11ee-8821-000c29ced34f | mgr2 | 3306 | ONLINE | SECONDARY | 8.0.30 | XCom |
| group_replication_applier | 70fa199f-9314-11ee-a8eb-000c29f957d2 | mgr3 | 3306 | ONLINE | SECONDARY | 8.0.30 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)
1. 切換主節點
當主節點需要進行維護時,或者執行滾動升級時,就可以對其進行切換,將主節點切換到其他節點。
在命令行模式下,可以使用 group_replication_set_as_primary() 這個udf實現切換,例如:
-- 將Primary角色切換到第二個節點
在mgr1上做
mysql> select group_replication_set_as_primary('52854f96-9314-11ee-8821-000c29ced34f');
+--------------------------------------------------------------------------+
| group_replication_set_as_primary('52854f96-9314-11ee-8821-000c29ced34f') |
+--------------------------------------------------------------------------+
| Primary server switched to: 52854f96-9314-11ee-8821-000c29ced34f ? ? ? ? |
+--------------------------------------------------------------------------+
1 row in set (0.02 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 | 3460f111-9314-11ee-a532-000c295df6cf | mgr1 ? ? ? ?| ? ? ? ?3306 | ONLINE ? ? ? | SECONDARY ? | 8.0.30 ? ? ? ? | XCom ? ? ? ? ? ? ? ? ? ? ? |
| group_replication_applier | 52854f96-9314-11ee-8821-000c29ced34f | mgr2 ? ? ? ?| ? ? ? ?3306 | ONLINE ? ? ? | PRIMARY ? ? | 8.0.30 ? ? ? ? | XCom ? ? ? ? ? ? ? ? ? ? ? |
| group_replication_applier | 70fa199f-9314-11ee-a8eb-000c29f957d2 | mgr3 ? ? ? ?| ? ? ? ?3306 | ONLINE ? ? ? | SECONDARY ? | 8.0.30 ? ? ? ? | XCom ? ? ? ? ? ? ? ? ? ? ? |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)
順便提一下,在MySQL 5.7版本中,只能通過重啟以實現主節點的自動切換,不能手動切換。從這個角度來說,如果想要使用MGR,最好是選擇MySQL 8.0版本,而不要使用5.7版本。
2. 切換單主/多主模式
在命令行模式下,可以調用 group_replication_switch_to_single_primary_mode()
和 group_replication_switch_to_multi_primary_mode()
來切換單主/多主模式。
#直接調用函數即可
mysql> select group_replication_switch_to_multi_primary_mode();
+--------------------------------------------------+
| group_replication_switch_to_multi_primary_mode() |
+--------------------------------------------------+
| Mode switched to multi-primary successfully. |
+--------------------------------------------------+
1 row in set (1.01 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 | 3460f111-9314-11ee-a532-000c295df6cf | mgr1 | 3306 | ONLINE | PRIMARY | 8.0.30 | XCom |
| group_replication_applier | 52854f96-9314-11ee-8821-000c29ced34f | mgr2 | 3306 | ONLINE | PRIMARY | 8.0.30 | XCom |
| group_replication_applier | 70fa199f-9314-11ee-a8eb-000c29f957d2 | mgr3 | 3306 | ONLINE | PRIMARY | 8.0.30 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)#切換成單主模式時可以指定某個節點的 server_uuid,如果不指定則會根據規則自動選擇一個新的主節點
#在這里,我選擇了指定mgr3節點作為新主
mysql> select group_replication_switch_to_single_primary_mode('70fa199f-9314-11ee-a8eb-000c29f957d2');
+-----------------------------------------------------------------------------------------+
| group_replication_switch_to_single_primary_mode('70fa199f-9314-11ee-a8eb-000c29f957d2') |
+-----------------------------------------------------------------------------------------+
| Mode switched to single-primary successfully. |
+-----------------------------------------------------------------------------------------+
1 row in set (0.02 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 | 3460f111-9314-11ee-a532-000c295df6cf | mgr1 | 3306 | ONLINE | SECONDARY | 8.0.30 | XCom |
| group_replication_applier | 52854f96-9314-11ee-8821-000c29ced34f | mgr2 | 3306 | ONLINE | SECONDARY | 8.0.30 | XCom |
| group_replication_applier | 70fa199f-9314-11ee-a8eb-000c29f957d2 | mgr3 | 3306 | ONLINE | PRIMARY | 8.0.30 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)
3. 添加新節點
接下來我們演示如何向MGR集群中添加一個新節點。
首先,要先完成MySQL Server初始化,創建好MGR專用賬戶、設置好MGR服務通道等前置工作。
接下來,直接執行命令 start group_replication
啟動MGR服務即可,新增的節點會進入分布式恢復這個步驟,它會從已有節點中自動選擇一個作為捐獻者(donor),并自行決定是直接讀取binlog進行恢復,還是利用Clone進行全量恢復。
如果是已經在線運行一段時間的MGR集群,有一定存量數據,這時候新節點加入可能會比較慢,建議手動利用Clone進行一次全量復制。還記得前面創建MGR專用賬戶時,給加上了 BACKUP_ADMIN 授權嗎,這時候就派上用場了,Clone需要用到這個權限。
下面演示如何利用Clone進行一次全量數據恢復,假定要新增的節點是 192.168.150.24 (給它命名為 mgr4)。
#在mgr4上設置捐獻者
#為了降低對Primary節點的影響,建議選擇其他Secondary節點
mysql> set global clone_valid_donor_list='192.168.150.24:3306';#停掉mgr服務(如果有的話),關閉super_read_only模式,然后開始復制數據
#注意這里要填寫的端口是3306(MySQL正常服務端口),而不是33061這個MGR服務專用端口
mysql> stop group_replication; set global super_read_only=0; clone INSTANCE FROM repl@192.168.150.21:3306 IDENTIFIED BY 'repl';
全量復制完數據后,該節點會進行一次自動重啟。重啟完畢后,再次確認 group_replication_group_name
、group_replication_local_address
、group_replication_group_seeds
這些選項值是否正確,如果沒問題,執行 start group_replication
后,該節點應該就可以正常加入集群了。
4. 刪除節點
在命令行模式下,一個節點想退出MGR集群,直接執行 stop group_replication
即可,如果這個節點只是臨時退出集群,后面還想加回集群,則執行 start group_replication
即可自動再加入。而如果是想徹底退出集群,則停止MGR服務后,執行 reset master; reset slave all;
重置所有復制(包含MGR)相關的信息就可以了。
5. 異常退出的節點重新加回
當節點因為網絡斷開、實例crash等異常情況與MGR集群斷開連接后,這個節點的狀態會變成 UNREACHABLE,待到超過 group_replication_member_expel_timeout
+ 5 秒后,集群會踢掉該節點。等到這個節點再次啟動并執行 start group_replication
,正常情況下,該節點應能自動重新加回集群。
6. 重啟MGR集群
正常情況下,MGR集群中的Primary節點退出時,剩下的節點會自動選出新的Primary節點。當最后一個節點也退出時,相當于整個MGR集群都關閉了。這時候任何一個節點啟動MGR服務后,都不會自動成為Primary節點,需要在啟動MGR服務前,先設置 group_replication_bootstrap_group=ON
,使其成為引導節點,再啟動MGR服務,它才會成為Primary節點,后續啟動的其他節點也才能正常加入集群。可自行測試,這里不再做演示。
P.S,第一個節點啟動完畢后,記得重置選項 group_replication_bootstrap_group=OFF
,避免在后續的操作中導致MGR集群分裂。
三、 MGR狀態監控
MGR和傳統主從復制類似,在運行過程中主要關注各節點的運行狀態,以及Secondary節點的事務是否有延遲。本文介紹如何監控MGR節點狀態、事務狀態等。
1. 節點狀態監控
通過查詢 performance_schema.replication_group_members
表即可知道MGR各節點的狀態:
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 | 3460f111-9314-11ee-a532-000c295df6cf | mgr1 | 3306 | ONLINE | SECONDARY | 8.0.30 | XCom |
| group_replication_applier | 52854f96-9314-11ee-8821-000c29ced34f | mgr2 | 3306 | ONLINE | SECONDARY | 8.0.30 | XCom |
| group_replication_applier | 70fa199f-9314-11ee-a8eb-000c29f957d2 | mgr3 | 3306 | ONLINE | PRIMARY | 8.0.30 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.01 sec)
?輸出結果中主要幾個列的解讀如下:
-
MEMBER_ID 列值就是各節點的 server_uuid,用于唯一標識每個節點,在命令行模式下,調用 udf 時傳入 MEMBER_ID 以指定各節點。
-
MEMBER_ROLE 表示各節點的角色,如果是 PRIMARY 則表示該節點可接受讀寫事務,如果是 SECONDARY 則表示該節點只能接受只讀事務。如果只有一個節點是 PRIMARY,其余都是 SECONDARY,則表示當前處于 單主模式;如果所有節點都是 PRIMARY,則表示當前處于 多主模式。
-
MEMBER_STATE
表示各節點的狀態,共有幾種狀態:ONLINE、RECOVERING、OFFLINE、ERROR、UNREACHABLE 等,下面分別介紹幾種狀態。
-
ONLINE,表示節點處于正常狀態,可提供服務。
-
RECOVERING,表示節點正在進行分布式恢復,等待加入集群,這時候有可能正在從donor節點利用clone復制數據,或者傳輸binlog中。
-
OFFLINE,表示該節點當前處于離線狀態。提醒,在正要加入或重加入集群時,可能也會有很短瞬間的狀態顯示為 OFFLINE。
-
ERROR,表示該節點當前處于錯誤狀態,無法成為集群的一員。當節點正在進行分布式恢復或應用事務時,也是有可能處于這個狀態的。當節點處于ERROR狀態時,是無法參與集群事務裁決的。節點正在加入或重加入集群時,在完成兼容性檢查成為正式MGR節點前,可能也會顯示為ERROR狀態。
-
UNREACHABLE,當組通信消息收發超時時,故障檢測機制會將本節點標記為懷疑狀態,懷疑其可能無法和其他節點連接,例如當某個節點意外斷開連接時。當在某個節點上看到其他節點處于 UNREACHABLE 狀態時,有可能意味著此時部分節點發生了網絡分區,也就是多個節點分裂成兩個或多個子集,子集內的節點可以互通,但子集間無法互通。
-
當節點的狀態不是 ONLINE 時,就應當立即發出告警并檢查發生了什么。
在節點狀態發生變化時,或者有節點加入、退出時,表 performance_schema.replication_group_members
的數據都會更新,各節點間會交換和共享這些狀態信息,因此可以在任意節點查看。
2. MGR事務狀態監控
另一個需要重點關注的是Secondary節點的事務狀態,更確切的說是關注待認證事務及待應用事務隊列大小。
可以執行下面的命令查看當前除了 PRIMARY 節點外,其他節點的 trx_tobe_certified
或 relaylog_tobe_applied
值是否較大:
mysql> SELECT MEMBER_ID AS id, COUNT_TRANSACTIONS_IN_QUEUE AS trx_tobe_certified, COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE AS relaylog_tobe_applied, COUNT_TRANSACTIONS_CHECKED AS trx_chkd, COUNT_TRANSACTIONS_REMOTE_APPLIED AS trx_done, COUNT_TRANSACTIONS_LOCAL_PROPOSED AS proposed FROM performance_schema.replication_group_member_stats;
+--------------------------------------+--------------------+-----------------------+----------+----------+----------+
| id | trx_tobe_certified | relaylog_tobe_applied | trx_chkd | trx_done | proposed |
+--------------------------------------+--------------------+-----------------------+----------+----------+----------+
| 3460f111-9314-11ee-a532-000c295df6cf | 0 | 0 | 3 | 3 | 3 |
| 52854f96-9314-11ee-8821-000c29ced34f | 0 | 0 | 3 | 4 | 0 |
| 70fa199f-9314-11ee-a8eb-000c29f957d2 | 0 | 0 | 3 | 3 | 0 |
+--------------------------------------+--------------------+-----------------------+----------+----------+----------+
3 rows in set (0.01 sec)
其中,relaylog_tobe_applied
的值表示遠程事務寫到relay log后,等待回放的事務隊列,trx_tobe_certified
表示等待被認證的事務隊列大小,這二者任何一個值大于0,都表示當前有一定程度的延遲。
還可以通過關注上述兩個數值的變化,看看兩個隊列是在逐步加大還是縮小,據此判斷Primary節點是否"跑得太快"了,或者Secondary節點是否"跑得太慢"。
多提一下,在啟用流控(flow control)時,上述兩個值超過相應的閾值時(group_replication_flow_control_applier_threshold 和 group_replication_flow_control_certifier_threshold 默認閾值都是 25000),就會觸發流控機制
3. 其他監控
另外,也可以查看接收到的事務和已執行完的事務之間的差距來判斷:
mysql> SELECT RECEIVED_TRANSACTION_SET FROM performance_schema.replication_connection_status WHERE channel_name = 'group_replication_applier' UNION ALL SELECT variable_value FROM performance_schema.global_variables WHERE variable_name = 'gtid_executed'\G
*************************** 1. row ***************************
RECEIVED_TRANSACTION_SET: 5dbabbe6-8050-49a0-9131-1de449167446:1-6
*************************** 2. row ***************************
RECEIVED_TRANSACTION_SET: 5dbabbe6-8050-49a0-9131-1de449167446:1-6
2 rows in set (0.01 sec)
四、利用MySQL Router構建讀寫分離MGR集群
本文介紹如何在MGR集群前端部署MySQL Router以實現讀寫分離、讀負載均衡,以及故障自動轉移。
MySQL Router是一個輕量級的中間件,它采用多端口的方案實現讀寫分離以及讀負載均衡,而且同時支持mysql和mysql x協議。
建議把MySQL Router部署在應用服務器上,每個應用服務器都部署一套,這樣應用程序可以直接連接本機IP,連接的效率更高,而且后端數據庫發生變化時,程序端也無需修改IP配置。
1. 部署MySQL Router
MySQL Router第一次啟動時要先初始化:
[root@proxy ~]# yum install mysql-router-community-8.0.35-1.el7.x86_64.rpm
?2. 啟動mysqlrouter服務
這就初始化完畢了,按照上面的提示,直接啟動 mysqlrouter 服務即可
[root@proxy ~]# systemctl enable --now mysqlrouter.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqlrouter.service to /usr/lib/systemd/system/mysqlrouter.service.[root@proxy ~]# ps -ef | grep -v grep | grep mysqlrouter
mysqlro+ 1461 1 0 11:38 ? 00:00:00 /usr/bin/mysqlrouter
可以看到 mysqlrouter 服務正常啟動了。
mysqlrouter 初始化時自動生成的配置文件是 /etc/mysqlrouter/mysqlrouter.conf
,主要是關于R/W、RO不同端口的配置,例如:
cat >> /etc/mysqlrouter/mysqlrouter.conf << EOF
[routing:write]
bind_address = 192.168.150.24
bind_port = 8001
mode = read-write
destinations = 192.168.150.21:3306
[routing:blanace]
bind_address = 192.168.150.24
bind_port = 8002
mode = read-only
destinations = 192.168.150.22:3306,192.168.150.23:3306
EOF[root@proxy ~]# systemctl restart mysqlrouter.service
3. 確認讀寫分離效果
創建用戶
mysql> create user admin@'192.168.150.%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.00 sec)
?
mysql> grant all on *.* to admin@'192.168.150.%';
Query OK, 0 rows affected (0.01 sec)
現在,用客戶端連接到6446(讀寫)端口,確認連接的是PRIMARY節點:
[root@mgr1 ~]# mysql -uadmin -p123456 -h192.168.150.24 -P8001
Enter password:
...
#記住下面幾個 MEMBER_ID
mysql> select MEMBER_ID,MEMBER_ROLE from performance_schema.replication_group_members;
+--------------------------------------+-------------+
| MEMBER_ID | MEMBER_ROLE |
+--------------------------------------+-------------+
| 3460f111-9314-11ee-a532-000c295df6cf | SECONDARY |
| 52854f96-9314-11ee-8821-000c29ced34f | SECONDARY |
| 70fa199f-9314-11ee-a8eb-000c29f957d2 | PRIMARY |
+--------------------------------------+-------------+
3 rows in set (0.00 sec)mysql> select @@server_uuid;
+--------------------------------------+
| @@server_uuid |
+--------------------------------------+
| 3460f111-9314-11ee-a532-000c295df6cf |
+--------------------------------------+
1 row in set (0.00 sec)
# 確實是連接的PRIMARY節點
?同樣地,連接8002(只讀)端口,確認連接的是SECONDARY節點:
[root@mgr2 ~]# mysql -uadmin -p123456 -h192.168.150.24 -P8002
Enter password:
...
mysql> select @@server_uuid;
+--------------------------------------+
| @@server_uuid |
+--------------------------------------+
| 52854f96-9314-11ee-8821-000c29ced34f |
+--------------------------------------+
1 row in set (0.00 sec)# 確實是連接的SECONDARY節點
4. 確認只讀負載均衡效果
MySQL Router連接讀寫節點(Primary節點)默認的策略是 first-available,即只連接第一個可用的節點。Router連接只讀節點(Secondary節點)默認的策略是 round-robin-with-fallback,會在各個只讀節點間輪詢。
保持8002端口原有的連接不退出,繼續新建到8002端口的連接,查看 server_uuid,這時應該會發現讀取到的是其他只讀節點的值,因為 mysqlrouter 的讀負載均衡機制是在幾個只讀節點間自動輪詢。在默認的 round-robin-with-fallback 策略下,只有當所有只讀節點都不可用時,只讀請求才會打到PRIMARY節點上。
[root@mgr3 ~]# mysql -uadmin -p123456 -h192.168.150.24 -P8002
mysql> select @@server_uuid;
+--------------------------------------+
| @@server_uuid ? ? ? ? ? ? ? ? ? ? ? |
+--------------------------------------+
| 70fa199f-9314-11ee-a8eb-000c29f957d2 |
+--------------------------------------+
1 row in set (0.00 sec)