暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

万里数据库SQLNode节点探活方案

原创 Dbb 2024-06-03
349

查询sqlnode节点状态

  1. 通过information_schema系统表查询。其中STATUS列的结果表示节点的状态信息。

    ## 查询所有的sqlnode节点的信息
    mysql> select * from information_schema.greatdb_sqlnodes\G
    *************************** 1. row ***************************
                     NODE_ID: 3
                        UUID: 06d5c7db-ec6b-11ec-b043-d08e7908bddb
                        HOST: 127.0.0.1
                        PORT: 13002
                   ZONE_NAME: DEFAULT
                     ZONE_ID: 0
                      STATUS: ONLINE
               EXECUTED_GTID: 2d53d273-47a7-0819-ccad-e62b16ed95f8:1-40
    Received_transaction_set: 2d53d273-47a7-0819-ccad-e62b16ed95f8:1-40
    *************************** 2. row ***************************
                     NODE_ID: 1
                        UUID: 06d82ad9-ec6b-11ec-8fd0-d08e7908bddb
                        HOST: 127.0.0.1
                        PORT: 13000
                   ZONE_NAME: DEFAULT
                     ZONE_ID: 0
                      STATUS: ONLINE
               EXECUTED_GTID: 2d53d273-47a7-0819-ccad-e62b16ed95f8:1-40
    Received_transaction_set: 2d53d273-47a7-0819-ccad-e62b16ed95f8:1-40
    *************************** 3. row ***************************
                     NODE_ID: 5
                        UUID: 06d86f06-ec6b-11ec-b5be-d08e7908bddb
                        HOST: 127.0.0.1
                        PORT: 13004
                   ZONE_NAME: DEFAULT
                     ZONE_ID: 0
                      STATUS: ONLINE
               EXECUTED_GTID: 2d53d273-47a7-0819-ccad-e62b16ed95f8:1-40
    Received_transaction_set: 2d53d273-47a7-0819-ccad-e62b16ed95f8:1-40
    3 rows in set (0.02 sec)
    
    ## 节点故障时,状态会发生变化
    mysql> stop group_replication;
    Query OK, 0 rows affected (4.07 sec)
    
    mysql> select * from information_schema.greatdb_sqlnodes where uuid=@@server_uuid\G
    *************************** 1. row ***************************
                     NODE_ID: 1
                        UUID: 06d82ad9-ec6b-11ec-8fd0-d08e7908bddb
                        HOST: 127.0.0.1
                        PORT: 13000
                   ZONE_NAME: DEFAULT
                     ZONE_ID: 0
                      STATUS: ERROR
               EXECUTED_GTID: 
    Received_transaction_set: 
    1 row in set (0.00 sec)
    
  2. 查询sqlnode节点greatdb_read_only_mode。只能查询当前sqlnode节点的状态。

    ## sqlnode节点正常运行时的状态,greatdb_read_only_mode=OFF
    mysql> start group_replication;
    Query OK, 0 rows affected (3.11 sec)
    
    mysql> show status like 'greatdb_read_only_mode';
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | greatdb_read_only_mode | OFF   |
    +------------------------+-------+
    1 row in set (0.02 sec)
    
    ## sqlnode异常时的状态,greatdb_read_only_mode=ON
    mysql> stop group_replication;
    Query OK, 0 rows affected (4.07 sec)
    
    mysql> show status like 'greatdb_read_only_mode';
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | greatdb_read_only_mode | ON    |
    +------------------------+-------+
    1 row in set (0.00 sec)
    
  3. 查询sqlnode节点中group_replication状态。其中,MEMBER_STATE表示状态。可以查询到多个sqlnode节点的信息,但只能查询到其中还在mgr节点的。如果一个sqlnode节点退出了mgr,从其它sqlnode中是查不到该节点的信息的。

    ## 连接13000节点,节点都正常状态
    mysql> start group_replication;
    Query OK, 0 rows affected (2.99 sec)
    
    mysql> select * from performance_schema.replication_group_members\G
    *************************** 1. row ***************************
      CHANNEL_NAME: group_replication_applier
         MEMBER_ID: 06d5c7db-ec6b-11ec-b043-d08e7908bddb
       MEMBER_HOST: 127.0.0.1
       MEMBER_PORT: 13002
      MEMBER_STATE: ONLINE
       MEMBER_ROLE: PRIMARY
    MEMBER_VERSION: 8.0.25
    *************************** 2. row ***************************
      CHANNEL_NAME: group_replication_applier
         MEMBER_ID: 06d82ad9-ec6b-11ec-8fd0-d08e7908bddb
       MEMBER_HOST: 127.0.0.1
       MEMBER_PORT: 13000
      MEMBER_STATE: ONLINE
       MEMBER_ROLE: PRIMARY
    MEMBER_VERSION: 8.0.25
    *************************** 3. row ***************************
      CHANNEL_NAME: group_replication_applier
         MEMBER_ID: 06d86f06-ec6b-11ec-b5be-d08e7908bddb
       MEMBER_HOST: 127.0.0.1
       MEMBER_PORT: 13004
      MEMBER_STATE: ONLINE
       MEMBER_ROLE: PRIMARY
    MEMBER_VERSION: 8.0.25
    3 rows in set (0.00 sec)
    
    ## 13000异常,从13000节点查询结果,只能查询到本节点的信息
    mysql> stop group_replication;
    Query OK, 0 rows affected (4.07 sec)
    
    mysql> select * from performance_schema.replication_group_members\G
    *************************** 1. row ***************************
      CHANNEL_NAME: group_replication_applier
         MEMBER_ID: 06d82ad9-ec6b-11ec-8fd0-d08e7908bddb
       MEMBER_HOST: 127.0.0.1
       MEMBER_PORT: 13000
      MEMBER_STATE: OFFLINE
       MEMBER_ROLE: 
    MEMBER_VERSION: 
    1 row in set (0.00 sec)
    
    ## 13000异常,从13002查询的结果。无法查看到13000的信息。
    mysql> select * from performance_schema.replication_group_members\G
    *************************** 1. row ***************************
      CHANNEL_NAME: group_replication_applier
         MEMBER_ID: 06d5c7db-ec6b-11ec-b043-d08e7908bddb
       MEMBER_HOST: 127.0.0.1
       MEMBER_PORT: 13002
      MEMBER_STATE: ONLINE
       MEMBER_ROLE: PRIMARY
    MEMBER_VERSION: 8.0.25
    *************************** 2. row ***************************
      CHANNEL_NAME: group_replication_applier
         MEMBER_ID: 06d86f06-ec6b-11ec-b5be-d08e7908bddb
       MEMBER_HOST: 127.0.0.1
       MEMBER_PORT: 13004
      MEMBER_STATE: ONLINE
       MEMBER_ROLE: PRIMARY
    MEMBER_VERSION: 8.0.25
    2 rows in set (0.01 sec)
    

sqlnode探活方案

方案一:通过查询sqlnode节点状态探活

根据前文所述的状态查看方式,可以使用如下几种方式查询节点的状态是否异常:

  1. 查询information_schema.greatdb_sqlndoes系统表,使用如下语句查询,如果结果不为ONLINE,表示sqlnode节点异常。

    mysql> select status from information_schema.greatdb_sqlnodes where uuid=@@server_uuid;
    +--------+
    | status |
    +--------+
    | ONLINE |
    +--------+
    1 row in set (0.02 sec)
    
  2. 查询greatdb_read_only_mode状态,使用如下语句查询,如果结果不为OFF,表示sqlnode节点异常。

    mysql> show status like 'greatdb_read_only_mode';
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | greatdb_read_only_mode | OFF   |
    +------------------------+-------+
    1 row in set (0.02 sec)
    
  3. 查询group_replication状态,使用如下语句查询,如果结果不为ONLINE,表示sqlnode节点异常。

    mysql> select member_state from performance_schema.replication_group_members where member_id=@@server_uuid;
    +--------------+
    | member_state |
    +--------------+
    | ONLINE       |
    +--------------+
    1 row in set (0.00 sec)
    

方案二:普通用户连接异常探活

在集群中,引入了一个配置参数:greatdb_exit_state_action,可选变量包括READ_ONLY和OFFLINE_MODE,示例如下:

## read_only模式
mysql> start group_replication;
Query OK, 0 rows affected (3.05 sec)

mysql> select @@offline_mode;
+----------------+
| @@offline_mode |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)

mysql> set global greatdb_exit_state_action='READ_ONLY';
Query OK, 0 rows affected (0.00 sec)

mysql> stop group_replication;
Query OK, 0 rows affected (4.07 sec)

mysql> select @@offline_mode;
+----------------+
| @@offline_mode |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)

## offline_mode模式
mysql> start group_replication;
Query OK, 0 rows affected (3.05 sec)

mysql> select @@offline_mode;
+----------------+
| @@offline_mode |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)

mysql> set global greatdb_exit_state_action='OFFLINE_MODE';
Query OK, 0 rows affected (0.00 sec)

mysql> stop group_replication;
Query OK, 0 rows affected (4.07 sec)

mysql> select @@offline_mode;
+----------------+
| @@offline_mode |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)

当设置greatdb_exit_state_action为OFFLINE_MODE时,如果sqlnode节点故障,会将系统的@@offline_mode变量的结果设置为1。此时,有如下几种现象:

  1. 具有super权限的用户,其操作和登录不受任何影响
  2. 非super权限的用户,无法创建新连接到故障的sqlnode节点
  3. 非super权限的用户,已经登录的连接,会被系统自动kill掉

根据上述现象,可以使用一个非super权限的普通用户进行探活。如果sqlnode节点故障,对非super用户来说,节点是处于不可连接的状态的。

另外需要注意的是,在group_replication中也存在一个类似的变量group_replication_exit_state_action,可以配置为READ_ONLY,OFFLINE_MODE,或者ABORT。但其中OFFLINE_MODE或者ABORT生效的条件较为复杂,在集群中,使用的是默认的READ_ONLY参数值,并且不建议更改该参数值。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论