mysql8.0使用MGR實現高可用

一、三節點MGR集群的安裝部署

1. 安裝準備

準備好下面三臺服務器: ?

IP端口角色
192.168.150.213306mgr1
192.168.150.223306mgr2
192.168.150.233306mgr3

配置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.21PRIMARY 節點,其余兩個都是 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_namegroup_replication_local_addressgroup_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_certifiedrelaylog_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)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711290.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711290.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711290.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows環境下的調試器探究——硬件斷點

與軟件斷點與內存斷點不同&#xff0c;硬件斷點不依賴被調試程序&#xff0c;而是依賴于CPU中的調試寄存器。 調試寄存器有7個&#xff0c;分別為Dr0~Dr7。 用戶最多能夠設置4個硬件斷點&#xff0c;這是由于只有Dr0~Dr3用于存儲線性地址。 其中&#xff0c;Dr4和Dr5是保留的…

java中容器繼承體系

首先上圖 源碼解析 打開Collection接口源碼&#xff0c;能夠看到Collection接口是繼承了Iterable接口。 public interface Collection<E> extends Iterable<E> { /** * ...... */ } 以下是Iterable接口源碼及注釋 /** * Implementing this inte…

makefileGDB使用

一、makefile 1、make && makefile makefile帶來的好處就是——自動化編譯&#xff0c;一旦寫好&#xff0c;只需要一個make命令&#xff0c;整個工程完全自動編譯&#xff0c;極大的提高了軟件開發的效率 下面我們通過如下示例來進一步體會它們的作用&#xff1a; ①…

使用 Python 實現一個飛書/微信記賬機器人,酷B了!

Python飛書文檔機器人 今天的主題是&#xff1a;使用Python聯動飛書文檔機器人&#xff0c;實現一個專屬的記賬助手&#xff0c;這篇文章如果對你幫助極大&#xff0c;歡迎你分享給你的朋友、她、他&#xff0c;一起成長。 也歡迎大家留言&#xff0c;說說自己想看什么主題的…

代碼隨想錄第天 78.子集 90.子集II

LeetCode 78 子集 題目描述 給你一個整數數組 nums &#xff0c;數組中的元素 互不相同 。返回該數組所有可能的子集&#xff08;冪集&#xff09;。 解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 示例 1&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出&…

LeetCode 2581.統計可能的樹根數目:換根DP(樹形DP)

【LetMeFly】2581.統計可能的樹根數目&#xff1a;換根DP(樹形DP) 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 個節點的樹&#xff0c;節點編號為 0 到 n - 1 。樹用一個長度為 n - 1 的二維整數數組 edges…

debian/ubuntu 編譯安裝nginx php

debian/ubuntu 編譯安裝nginx php tar -zxvf nginx-1.9.9.tar.gz apt-get install libpcre3 libpcre3-dev ./configure --prefix/work/nginx-1.9.9 --with-pcre make make install service iptables stop #關閉防火墻, 可能不需要 修改nginx運行用戶為tboqi 抱著log目錄可…

【通信基礎知識】完整通信系統的流程圖及各模塊功能詳解

2024.2.29 抱歉最近在寫畢設大論文&#xff0c;因此沒有太多時間更新。然而&#xff0c;在寫論文的過程中&#xff0c;發現自己對通信系統的了解還不夠全明白&#xff0c;因此差了一些碩博論文總結了一個完整的通信系統流程圖。若有不對的地方請多多指正//部分內容有參考ChatGP…

【Elasticsearch管理】網絡配置

文章目錄 HTTP高級網絡設置高級TCP設置 TransportTCP傳輸概要文件Transport跟蹤 線程池fixed線程池fixed_auto_queue_sizescaling處理器設置 HTTP Elasticsearch只在默認情況下綁定到本地主機。對于運行本地開發服務器(如果在同一臺機器上啟動多個節點&#xff0c;甚至可以運行…

YOLOv7基礎 | 第2種方式:簡化網絡結構之yolov7.yaml(由104層簡化為30層)

前言:Hello大家好,我是小哥談。通過下載YOLOv7源碼可知,原始的yolov7.yaml文件是拆開寫的,比較混亂,也不好理解,并且為后續改進增添了很多困難。基于此種情況,筆者就給大家介紹一種將yolov7.yaml文件簡化的方法,將104層簡化為30層,并且參數量和計算量和原來是一致的,…

內存占用構造方法

#使用虛擬內存構造內存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #釋放消耗的虛擬內存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #內存占用可直接在/dev/shm目錄下寫文件

《極客時間 - 左耳聽風》【文章筆記個人思考】

《極客時間 - 左耳聽風》原文鏈接&#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 這里的Leader是在技術上取得優勢&#xff0c;而不是行政…

2024年2月個人工作生活總結

本文為 2024年2月工作生活總結。 研發編碼 一些警告修正記錄 這個月修正了個人所負責的工程警告&#xff0c;這些警告其實是前人的代碼遺留的&#xff0c;我續寫的代碼&#xff0c;除printf函數的%d、%ld格式&#xff0c;都在寫的過程中改了。 下面記錄一些典型的警告及應對…

NLP(一)——概述

參考書: 《speech and language processing》《統計自然語言處理》 宗成慶 語言是思維的載體&#xff0c;自然語言處理相比其他信號較為特別 word2vec用到c語言 Question 預訓練語言模型和其他模型的區別? 預訓練模型是指在大規模數據上進行預訓練的模型&#xff0c;通常…

測試環境搭建整套大數據系統(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一&#xff1a;搭建kafka。 1. 三臺機器執行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下倆內容 1.三臺機器分別給予各自的broker_id…

git操作學習記錄,簡單易上手

配置git 的賬戶郵箱 $ git config --global user.name "Firstname Lastname" $ git config --global user.email "your_emailexample.com"代碼回溯 git rest --hard [commit哈希值]git log命令只能查看以當前狀態為終點的歷史日志 git reflog命令&#x…

Python+neo4j構建豆瓣電影知識圖譜

文章目錄 數據來源數據整理導入節點和關系導入使用Subgraph批量導入節點和關系 多標簽實體和實體去重 數據來源 http://www.openkg.cn/dataset/douban-movie-kg 該網址擁有豐富的中文知識圖譜數據集&#xff0c;OpenKG(Open Knowledge Graph)&#xff0c;可供研究人員使用研究…

【golang】25、圖片操作

用 “github.com/fogleman/gg” 可以畫線, 框 用 “github.com/disintegration/imaging” 可以變換顏色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

Python爬蟲——Urllib庫-3

目錄 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 獲取豆瓣電影前十頁的數據 ajax的post請求 總結 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 首先可以在瀏覽器找到發送數據的接口 那么我們的url就可以在header中找到了 再加上UA這個header 進行請…

Facebook的元宇宙實踐:數字化社交的新前景

近年來&#xff0c;元宇宙&#xff08;Metaverse&#xff09;這一概念備受矚目&#xff0c;被認為是數字化社交的未來趨勢之一。而在眾多科技巨頭中&#xff0c;Facebook&#xff08;現更名為Meta&#xff09;一直處于元宇宙發展的前沿。在本文中&#xff0c;我們將深入探討Fac…