查询sqlnode节点状态
通过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)查询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)查询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节点状态探活
根据前文所述的状态查看方式,可以使用如下几种方式查询节点的状态是否异常:
查询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)查询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)查询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。此时,有如下几种现象:
- 具有super权限的用户,其操作和登录不受任何影响
- 非super权限的用户,无法创建新连接到故障的sqlnode节点
- 非super权限的用户,已经登录的连接,会被系统自动kill掉
根据上述现象,可以使用一个非super权限的普通用户进行探活。如果sqlnode节点故障,对非super用户来说,节点是处于不可连接的状态的。
另外需要注意的是,在group_replication中也存在一个类似的变量group_replication_exit_state_action,可以配置为READ_ONLY,OFFLINE_MODE,或者ABORT。但其中OFFLINE_MODE或者ABORT生效的条件较为复杂,在集群中,使用的是默认的READ_ONLY参数值,并且不建议更改该参数值。




