MySQL中間件之ProxySQL(15):ProxySQL代理MySQL組複製

来源:https://www.cnblogs.com/f-ck-need-u/archive/2018/07/28/9383126.html
-Advertisement-
Play Games

返回 "ProxySQL系列文章:http://www.cnblogs.com/f ck need u/p/7586194.html"   1.ProxySQL+組複製前言 在以前的ProxySQL版本中,要支持MySQL組複製(MGR,MySQL Group Replication)需要 ...


返回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。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • var httpService = angular.module('httpService', []);httpService.factory("$httpService",function ($http, $q) { var $httpService = {}; $httpService.getD ...
  • StreamReader sr = new StreamReader(path); //path是要讀取的文件的完整路徑 String str_read = sr.ReadToEnd(); //從開始到末尾讀取文件的所有內容,str_read 存放的就是讀取到的文本 sr.Close(); //讀完 ...
  • 我這裡使用的時centos7-mini,centos系統本身預設安裝有python2.x,版本x根據不同版本系統有所不同,可通過 python --V 或 python --version 查看系統自帶的python版本 有一些系統命令時需要用到python2,不能卸載 1、安裝依賴包 1)首先安裝 ...
  • 今天郵箱里發現有一封某伺服器inode使用率發生告警的郵件 登錄到伺服器上df i查看,發現/路徑下91%,磁碟使用率卻不高,猜測可能是某個目錄下的小文件過多,進而造成inode占用率過高,但不清楚根路徑下各文件夾里的文件數 於是乎執行以下命令,查看根路徑下各國文件夾的文件數 for i in / ...
  • Linux下源碼安裝並配置Nginx,並將nginx命令添加到系統環境變數,將nginx添加到系統服務中 ...
  • NAT(Network address translation)即網路地址轉換,作為一種過渡解決手段,可以用來減少對全球合法IP地址的需求。簡單的說,NAT就是在內部專用網路中使用內部地址,而當內部節點要與外界網路發生聯繫時,就在邊緣路由器或者防火牆處,將內部地址轉換成全局地址,從而使得在外部公共網... ...
  • Vim進入和退出命令 本來不想寫任何關於vim的文章的,無奈我今天又忘記怎麼退出vim了,常用命令是ESC,然後:wq(保存並退出),:q!(不保存並強制退出),i進入vim模式。另外還有其它的,我可能都不會用到。。。 按ESC鍵 跳到命令模式,然後: :w 保存文件但不退出vi :w file 將 ...
  • 對於存儲過程中需要編寫大量的sql語句,這必然需要美化語句,使得程式可讀性更高。 pl/sql developer開發工具自帶美化工具,不過美化的時候容易使得語句全部改變成大寫格式,這樣就需要一個插件包或者說一個使得程式只格式不改變原來大小寫的文件包。 1、自帶美化,(自帶的不夠完美,不建議推薦使用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...