1. 程式人生 > >MySQL中間件之ProxySQL(15):ProxySQL代理MySQL組復制

MySQL中間件之ProxySQL(15):ProxySQL代理MySQL組復制

這樣的 body -a 問題 -i 友好 必須 命名 mct

返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html

1.ProxySQL+組復制前言

在以前的ProxySQL版本中,要支持MySQL組復制(MGR,MySQL Group Replication)需要借助第三方腳本對組復制做健康檢查並自動調整配置,但是從ProxySQL v1.4.0開始,已原生支持MySQL組復制的代理,在main庫中也已提供mysql_group_replication_hostgroups表來控制組復制集群中的讀、寫組。

Admin> show tables ;
+--------------------------------------------+
| tables                                     |
+--------------------------------------------+
| global_variables                           |
| mysql_collations                           |
| mysql_group_replication_hostgroups         |
| mysql_query_rules                          |
...
| runtime_mysql_group_replication_hostgroups |
...
| scheduler                                  |
+--------------------------------------------+

admin> show tables from monitor;
+------------------------------------+
| tables                             |
+------------------------------------+
| mysql_server_connect_log           |
| mysql_server_group_replication_log |
| mysql_server_ping_log              |
| mysql_server_read_only_log         |
| mysql_server_replication_lag_log   |
+------------------------------------+

盡管已原生支持MGR,但仍然需要在MGR節點中創建一張額外的系統視圖sys.gr_member_routing_candidate_status為ProxySQL提供監控指標。創建該視圖的腳本addition_to_sys.zip我已上傳。在後文需要創建該系統視圖的地方,我會將這個腳本的內容貼出來。

本文先解釋mysql_group_replication_hostgroups表中各字段的意義,然後按照實驗環境做好各種組的分配。最後根據實驗環境快速搭建單主模型的組復制環境,以及ProxySQL代理單主模型組復制的配置步驟。因為本文描述了ProxySQL代理單主、多主MGR的情形,所以搭建ProxySQL代理多主MGR也是沒有任何問題的。

本文實驗環境:

roles IP_address
proxysql 192.168.100.21
node1 192.168.100.22
node2 192.168.100.23
node3 192.168.100.24

1.1 mysql_group_replication_hostgroups表

該表的定義語句:

Admin> show create table mysql_group_replication_hostgroups\G
*************************** 1. row ***************************
       table: mysql_group_replication_hostgroups
Create Table: CREATE TABLE mysql_group_replication_hostgroups (
    writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,
    backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL,
    reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0),
    offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0),
    active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1,
    max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1,
    writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0,
    max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0,
    comment VARCHAR,
    UNIQUE (reader_hostgroup),
    UNIQUE (offline_hostgroup),
    UNIQUE (backup_writer_hostgroup))

各字段的意義如下:

  • writer_hostgroup:默認的寫組。後端read_only=0的節點會自動分配到這個組中。
  • backup_writer_hostgroup:如果後端MySQL集群有多個節點可寫並設置了max_writes字段的值,ProxySQL將會把其余的所有節點(超出max_writes)都放進備寫組backup_writer_hostgroup中作為備份節點。
  • reader_hostgroup:負責讀的組。查詢規則或者只具有只讀權限的用戶的讀請求都會路由到該主機組中的節點。後端read_only=1的節點會自動分配到這個組中。
  • offline_hostgroup:當ProxySQL監控並決定了某節點為OFFLINE後,會將其放進組offline_hostgroup中。
  • active:當啟用後,ProxySQL會監控該主機組,並在不同組之間合理地移動節點。
  • max_writers:該字段的值決定寫組writer_hostgroup中最大允許的節點數量,超出該數量的但允許寫的節點都會放進備份組backup_writer_hostgroup中。
  • writer_is_also_reader:決定一個節點升級為寫節點(放進writer_hostgroup)後是否仍然保留在reader_hostgroup組中提供讀服務。
  • max_transactions_behind:當某節點延後於寫節點時,為了防止讀取到過期數據,ProxySQL可能會自動避開該節點。該字段決定最多延後寫節點多少個事務(具體延後的事務數量可以從MySQL的sys.gr_member_routing_candidate_status表中的transaction_behind字段獲取),延後的事務數量超出該值時,ProxySQL就會自動避開這個節點。
  • comment:該字段用於說明、註釋,可隨便定義。

需要註意的是,writer_hostgroup是主鍵字段,reader_hostgroup、offline_hostgroup、backup_writer_hostgroup具有唯一性,它們的值都是INT數值。

所以,ProxySQL代理每一個後端MGR集群時,都必須為這個MGR定義讀組、寫組、備寫組、離線組,且這四個組的值各不相同、不允許NULL、具有唯一性。此外,每個username還有一個默認組,一般這個默認組會設置為寫組,這樣在定義select規則時比較容易。

1.2 ProxySQL代理MGR時必須考慮的問題

ProxySQL代理MGR時有幾種情況:ProxySQL代理的MGR運行模式是單主模型還是多主模型,ProxySQL代理的是一個還是多個MGR集群。需要單獨考慮這些不同的情況,它們影響ProxySQL如何分配組,甚至配置步驟不同。

1.2.1 ProxySQL代理單主模型的MGR

MRG以單主模型運行時,有兩個相關特性:

  • 1.非master節點會自動設置read_only=1
  • 2.master節點故障時,會自動選舉新的master節點,選舉時根據權重(group_replication_member_weigth,較老版本的組復制根據server_uuid按字典排序,值小的優先選為master)決定誰是新的master

所以ProxySQL代理單主MGR時,ProxySQL中 要設置對後端節點read_only值的監控 。因為ProxySQL會根據read_only值自動調整讀、寫組中的節點,所以代理單主模型時非常方便。當然,如果不想讓ProxySQL來自動調整MGR節點所屬組,則無需設置read_only監控,見下文"ProxySQL代理單個MGR集群"中的描述。

由於只有一個寫節點,所以用不上備寫組,但仍然需要定義好它。例如:
寫組 -->hg=10
備寫組 -->hg=20
讀組 -->hg=30
離線組 -->hg=40

1.2.2 ProxySQL代理多主模型的MGR

多主模型的MGR,可以同時有多個寫節點,並且允許少數節點出現故障。

仍然假設組的分配情況:

寫組 -->hg=10
備寫組 -->hg=20
讀組 -->hg=30
離線組 -->hg=40

192.168.100.{22,23,24}分別命名為node1、node2、node3節點。

假設max_writers=2,則node1、node2、node3其中2個節點(假設node1、node2)在寫組hg=10中,node3在備寫組hg=20中。此時必須設置writer_is_also_reader=1,否則沒有節點負責讀操作,所以hg=30中有node1、node2、node3共3個節點。假如node2節點故障,node3節點將從hg=20轉移到hg=10,讀組hg=30也只有node1和node3,node2會轉移到hg=40中,並ProxySQL不斷監控它是否上線。

所以,ProxySQL代理多主模型的MGR時,必須設置writer_is_also_reader=1

1.2.3 ProxySQL代理單個MGR集群

ProxySQL代理單個MGR集群時,如果不定制復雜的路由規則,完全由ProxySQL來控制讀、寫組的節點分配,那麽在mysql_group_replication_hostgroups表中只能有一條記錄。

但是如果想要實現復雜的需求,例如想要將開銷大的select語句路由到某個固定的slave上或自定義的某個hostgroup中,就不能再讓ProxySQL來管理MGR,這時不能在mysql_group_replication_hostgroups中插入和該MGR集群有關的記錄(如果可以,也不要去監控read_only值),而是在mysql_servers中定義好目標組。這種情況下,ProxySQL不關心後端是MGR還是普通的MySQL實例。

1.2.4 ProxySQL代理多個MGR集群

很不幸,ProxySQL的mysql_group_replication_hostgroups表對多MGR集群並不友好。因為ProxySQL通過監控read_only值來自動調整節點所屬組。如果ProxySQL代理兩個MGR集群X、Y,在mysql_group_replication_hostgroups添加一條記錄後,MGR集群X、Y中的節點都會加入到這條記錄所定義的組中,於是兩個MGR集群就混亂了。添加多條記錄也無濟於事,因為這個表中並沒有識別集群的方法。其實mysql_replication_hostgroups也一樣存在這樣的問題。

這時只能在mysql_servers中對不同MGR集群中的各個節點定義好所屬組,然後在規則中指定路由目標。也就是說,用不上mysql_group_replication_hostgroups表,也無需去監控read_only值。

1.3 配置組復制

本文配置的單主模型的組復制。

1.設置主機名和DNS解析(必須保證各mysql實例的主機名不一致,且能通過主機名找到各成員)

# node1上:
hostnamectl set-hostname --static node1.longshuai.com
hostnamectl -H [email protected] set-hostname node2.longshuai.com
hostnamectl -H [email protected] set-hostname node3.longshuai.com

# 寫/etc/hosts
# node1上:
cat >>/etc/hosts<<eof
    192.168.100.22 node1.longshuai.com
    192.168.100.23 node2.longshuai.com
    192.168.100.24 node3.longshuai.com
eof
scp /etc/hosts 192.168.100.23:/etc
scp /etc/hosts 192.168.100.24:/etc

2.提供node1、node2、node3的配置文件

node1的/etc/my.cnf內容:

[mysqld]
datadir=/data
socket=/data/mysql.sock

server-id=100                      # 各節點不一致
gtid_mode=on                       
enforce_gtid_consistency=on        
log-bin=/data/master-bin           
binlog_format=row                  
binlog_checksum=none               
master_info_repository=TABLE       
relay_log_info_repository=TABLE    
relay_log=/data/relay-log          
log_slave_updates=ON               
sync-binlog=1                      
log-error=/data/error.log
pid-file=/data/mysqld.pid

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_member_weigth = 40     # 建議各節點設置不同值
loose-group_replication_local_address="192.168.100.22:20002"  # 各節點不一致
loose-group_replication_group_seeds="192.168.100.22:20002,192.168.100.23:20003,,192.168.100.24:20004"

node2和node3的配置文件只需修改幾項需要不一致的值即可:

以下為node2的/etc/my.cnf的部分內容

server-id=110
loose-group_replication_member_weigth = 30
loose-group_replication_local_address="192.168.100.23:20003"

以下為node3的/etc/my.cnf的部分內容

server-id=120
loose-group_replication_member_weigth = 20
loose-group_replication_local_address="192.168.100.24:20004"

3.啟動node1,引導組復制

先啟動node1的MySQL服務。

systemctl start mysqld

連上node1節點,創建用於復制的用戶。我這裏創建的用戶為repl,密碼為P@ssword1!。

create user repl@'192.168.100.%' identified by 'P@ssword1!';
grant replication slave on *.* to repl@'192.168.100.%';

在node1上配置恢復通道。

change master to 
            master_user='repl',
            master_password='P@ssword1!'
            for channel 'group_replication_recovery';

安裝組復制插件。

install plugin group_replication soname 'group_replication.so';

引導、啟動組復制功能。

set @@global.group_replication_bootstrap_group=on;
start group_replication;
set @@global.group_replication_bootstrap_group=off;

查看node1是否ONLINE。

select * from performance_schema.replication_group_members\G

4.添加node2、node3到復制組中

先啟動node2和node3的mysql服務:

systemctl start mysqld

再在node2和node3上指定恢復通道,從Donor處恢復數據。

change master to 
            master_user='repl',
            master_password='P@ssword1!'
            for channel 'group_replication_recovery';

最後,在node2和node3上安裝組復制插件,並啟動組復制功能即可。

install plugin group_replication soname 'group_replication.so';
start group_replication;

在任意一個節點上查看node1、node2、node3是否都是ONLINE。

select * from performance_schema.replication_group_members\G

*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: a5165443-6aec-11e8-a8f6-000c29827955
 MEMBER_HOST: node1.longshuai.com
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: ba505889-6aec-11e8-a864-000c29b0bec4
 MEMBER_HOST: node2.longshuai.com
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: bf12fe97-6aec-11e8-a909-000c29e55287
 MEMBER_HOST: node3.longshuai.com
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE

至此,node1、node2、node3組成的3節點單主模型的組復制配置完成。下面配置ProxySQL。

1.4 配置ProxySQL

根據前文的分析,ProxySQL代理單主模型組復制時,如果想讓ProxySQL來自動調整節點所屬讀、寫組,需要開啟read_only監控,並在mysql_group_replication_hostgroups表中插入一條記錄。

假設4種組的hostgroup_id為:
寫組 -->hg=10
備寫組 -->hg=20
讀組 -->hg=30
離線組 -->hg=40

安裝ProxySQL的過程略。以下是配置ProxySQL的過程。

1.連上ProxySQL的Admin管理接口

mysql -uadmin -padmin -h127.0.0.1 -P6032 --prompt 'Admin> '

2.向 mysql_servers 表中添加後端節點node1、node2和node3

delete from mysql_servers;

insert into mysql_servers(hostgroup_id,hostname,port) 
values(10,'192.168.100.22',3306),
      (10,'192.168.100.23',3306),
      (10,'192.168.100.24',3306);

load mysql servers to runtime;
save mysql servers to disk;

查看3個節點是否都是ONLINE

admin> select hostgroup_id,hostname,port,status,weight from mysql_servers;
+--------------+----------------+------+--------+--------+
| hostgroup_id | hostname       | port | status | weight |
+--------------+----------------+------+--------+--------+
| 10           | 192.168.100.22 | 3306 | ONLINE | 1      |
| 10           | 192.168.100.23 | 3306 | ONLINE | 1      |
| 10           | 192.168.100.24 | 3306 | ONLINE | 1      |
+--------------+----------------+------+--------+--------+

3.監控後端節點

首先,在node1上創建ProxySQL用於監控的用戶。註意,這裏監控用戶的權限和ProxySQL代理普通mysql實例不一樣,ProxySQL代理組復制時,是從MGR的系統視圖sys.gr_member_routing_candidate_status中獲取監控指標,所以授予監控用戶對該視圖的查詢權限,因為無需從show slave status中獲取Seconds_Behind_Master,所以無需replication client權限。

# 在node1上執行:
mysql> create user monitor@'192.168.100.%' identified by 'P@ssword1!';
mysql> grant select on sys.* to monitor@'192.168.100.%';

然後回到ProxySQL上配置監控。

set mysql-monitor_username='monitor';
set mysql-monitor_password='P@ssword1!';

load mysql variables to runtime;
save mysql variables to disk;

4.創建系統視圖sys.gr_member_routing_candidate_status

在node1節點上,創建系統視圖sys.gr_member_routing_candidate_status,該視圖將為ProxySQL提供組復制相關的監控狀態指標。

如果前面下載了addition_to_sys.sql腳本,執行如下語句導入MySQL即可。

mysql -uroot -pP@ssword1! < addition_to_sys.sql

也可以執行如下語句創建該系統視圖:

USE sys;

DELIMITER $$

CREATE FUNCTION IFZERO(a INT, b INT)
RETURNS INT
DETERMINISTIC
RETURN IF(a = 0, b, a)$$

CREATE FUNCTION LOCATE2(needle TEXT(10000), haystack TEXT(10000), offset INT)
RETURNS INT
DETERMINISTIC
RETURN IFZERO(LOCATE(needle, haystack, offset), LENGTH(haystack) + 1)$$

CREATE FUNCTION GTID_NORMALIZE(g TEXT(10000))
RETURNS TEXT(10000)
DETERMINISTIC
RETURN GTID_SUBTRACT(g, '')$$

CREATE FUNCTION GTID_COUNT(gtid_set TEXT(10000))
RETURNS INT
DETERMINISTIC
BEGIN
  DECLARE result BIGINT DEFAULT 0;
  DECLARE colon_pos INT;
  DECLARE next_dash_pos INT;
  DECLARE next_colon_pos INT;
  DECLARE next_comma_pos INT;
  SET gtid_set = GTID_NORMALIZE(gtid_set);
  SET colon_pos = LOCATE2(':', gtid_set, 1);
  WHILE colon_pos != LENGTH(gtid_set) + 1 DO
     SET next_dash_pos = LOCATE2('-', gtid_set, colon_pos + 1);
     SET next_colon_pos = LOCATE2(':', gtid_set, colon_pos + 1);
     SET next_comma_pos = LOCATE2(',', gtid_set, colon_pos + 1);
     IF next_dash_pos < next_colon_pos AND next_dash_pos < next_comma_pos THEN
       SET result = result +
         SUBSTR(gtid_set, next_dash_pos + 1,
                LEAST(next_colon_pos, next_comma_pos) - (next_dash_pos + 1)) -
         SUBSTR(gtid_set, colon_pos + 1, next_dash_pos - (colon_pos + 1)) + 1;
     ELSE
       SET result = result + 1;
     END IF;
     SET colon_pos = next_colon_pos;
  END WHILE;
  RETURN result;
END$$

CREATE FUNCTION gr_applier_queue_length()
RETURNS INT
DETERMINISTIC
BEGIN
  RETURN (SELECT sys.gtid_count( GTID_SUBTRACT( (SELECT
Received_transaction_set FROM performance_schema.replication_connection_status
WHERE Channel_name = 'group_replication_applier' ), (SELECT
@@global.GTID_EXECUTED) )));
END$$

CREATE FUNCTION gr_member_in_primary_partition()
RETURNS VARCHAR(3)
DETERMINISTIC
BEGIN
  RETURN (SELECT IF( MEMBER_STATE='ONLINE' AND ((SELECT COUNT(*) FROM
performance_schema.replication_group_members WHERE MEMBER_STATE != 'ONLINE') >=
((SELECT COUNT(*) FROM performance_schema.replication_group_members)/2) = 0),
'YES', 'NO' ) FROM performance_schema.replication_group_members JOIN
performance_schema.replication_group_member_stats USING(member_id));
END$$

CREATE VIEW gr_member_routing_candidate_status AS SELECT
sys.gr_member_in_primary_partition() as viable_candidate,
IF( (SELECT (SELECT GROUP_CONCAT(variable_value) FROM
performance_schema.global_variables WHERE variable_name IN ('read_only',
'super_read_only')) != 'OFF,OFF'), 'YES', 'NO') as read_only,
sys.gr_applier_queue_length() as transactions_behind, Count_Transactions_in_queue as 'transactions_to_cert' from performance_schema.replication_group_member_stats;$$

DELIMITER ;

視圖創建後,可以查看該視圖:

node1上:

mysql> select * from sys.gr_member_routing_candidate_status;
+------------------+-----------+---------------------+----------------------+
| viable_candidate | read_only | transactions_behind | transactions_to_cert |
+------------------+-----------+---------------------+----------------------+
| YES              | NO        |                   0 |                    0 |
+------------------+-----------+---------------------+----------------------+

node2上:

mysql> select * from sys.gr_member_routing_candidate_status;
+------------------+-----------+---------------------+----------------------+
| viable_candidate | read_only | transactions_behind | transactions_to_cert |
+------------------+-----------+---------------------+----------------------+
| YES              | YES       |                   0 |                    0 |
+------------------+-----------+---------------------+----------------------+

5.向mysql_group_replication_hostgroups中插入記錄

delete from mysql_group_replication_hostgroups;

insert into mysql_group_replication_hostgroups(writer_hostgroup,backup_writer_hostgroup,reader_hostgroup,offline_hostgroup,active,max_writers,writer_is_also_reader,max_transactions_behind) 
values(10,20,30,40,1,1,0,0);

load mysql servers to runtime;
save mysql servers to disk;

上述配置中,我把writer_is_also_reader設置為false,讓master只負責寫操作。

admin> select * from mysql_group_replication_hostgroups\G
*************************** 1. row ***************************
       writer_hostgroup: 10
backup_writer_hostgroup: 20
       reader_hostgroup: 30
      offline_hostgroup: 40
                 active: 1
            max_writers: 1
  writer_is_also_reader: 0
max_transactions_behind: 0
                comment: NULL

再看看節點的分組調整情況:

admin> select hostgroup_id, hostname, port,status from runtime_mysql_servers;
+--------------+----------------+------+--------+
| hostgroup_id | hostname       | port | status |
+--------------+----------------+------+--------+
| 10           | 192.168.100.22 | 3306 | ONLINE |
| 30           | 192.168.100.24 | 3306 | ONLINE |
| 30           | 192.168.100.23 | 3306 | ONLINE |
+--------------+----------------+------+--------+

查看對MGR的監控指標。

Admin> select  hostname,
               port,
               viable_candidate,
               read_only,
               transactions_behind,
               error 
       from mysql_server_group_replication_log 
       order by time_start_us desc 
       limit 6;
+----------------+------+------------------+-----------+---------------------+-------+
| hostname       | port | viable_candidate | read_only | transactions_behind | error |
+----------------+------+------------------+-----------+---------------------+-------+
| 192.168.100.24 | 3306 | YES              | YES       | 0                   | NULL  |
| 192.168.100.23 | 3306 | YES              | YES       | 0                   | NULL  |
| 192.168.100.22 | 3306 | YES              | NO        | 0                   | NULL  |
| 192.168.100.24 | 3306 | YES              | YES       | 0                   | NULL  |
| 192.168.100.23 | 3306 | YES              | YES       | 0                   | NULL  |
| 192.168.100.22 | 3306 | YES              | NO        | 0                   | NULL  |
+----------------+------+------------------+-----------+---------------------+-------+

6.配置mysql_users

在node1節點上執行:

grant all on *.* to root@'192.168.100.%' identified by 'P@ssword1!';

回到ProxySQL,向mysql_users表插入記錄。

delete from mysql_users;

insert into mysql_users(username,password,default_hostgroup,transaction_persistent) 
values('root','P@ssword1!',10,1);

load mysql users to runtime;
save mysql users to disk;

7.配置測試用的讀寫分離規則

delete from mysql_query_rules;

insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)
VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1),
       (2,1,'^SELECT',30,1);

load mysql query rules to runtime;
save mysql query rules to disk;

測試是否按預期進行讀寫分離。

mysql -uroot -pP@ssword1! -h192.168.100.21 -P6033 -e 'create database gr_test;'
mysql -uroot -pP@ssword1! -h192.168.100.21 -P6033 -e 'select user,host from mysql.user;' 
mysql -uroot -pP@ssword1! -h192.168.100.21 -P6033 -e 'show databases;' 

查看語句路由狀態:

admin> select hostgroup,digest_text from stats_mysql_query_digest;  
+-----------+----------------------------------+
| hostgroup | digest_text                      |
+-----------+----------------------------------+
| 10        | show databases                   |
| 30        | select user,host from mysql.user |
| 10        | create database gr_test          |
| 10        | select @@version_comment limit ? |
+-----------+----------------------------------+

select語句路由到讀組hg=30上,show操作按照默認主機組路由到hg=10,create操作路由到hg=10這個寫組。

8.測試MGR故障轉移

將MGR的某個節點停掉,例如直接關閉當前master節點node1的mysql服務。

在node1上執行:

systemctl stop mysqld

然後,看看ProxySQL上的節點狀態。

admin> select hostgroup_id, hostname, port,status from runtime_mysql_servers;
+--------------+----------------+------+---------+
| hostgroup_id | hostname       | port | status  |
+--------------+----------------+------+---------+
| 10           | 192.168.100.23 | 3306 | ONLINE  |
| 40           | 192.168.100.22 | 3306 | SHUNNED |
| 30           | 192.168.100.24 | 3306 | ONLINE  |
+--------------+----------------+------+---------+

結果顯示node1的狀態為SHUNNED,表示該節點被ProxySQL避開了。且node2節點移到了hg=10的組中,說明該節點被選舉為了新的Master節點。

再將node1加回組中。在node1上執行:

shell> systemctl start mysqld

mysql> start group_replication;

然後,看看ProxySQL上的節點狀態。

admin> select hostgroup_id, hostname, port,status from runtime_mysql_servers;
+--------------+----------------+------+--------+
| hostgroup_id | hostname       | port | status |
+--------------+----------------+------+--------+
| 10           | 192.168.100.23 | 3306 | ONLINE |
| 30           | 192.168.100.22 | 3306 | ONLINE |
| 30           | 192.168.100.24 | 3306 | ONLINE |
+--------------+----------------+------+--------+

可見,node1已經重新ONLINE。

MySQL中間件之ProxySQL(15):ProxySQL代理MySQL組復制