GBase 8a检查Hash分布表各分片是否一致的参数

GBase 8a自身的高可用机制,是能保证主副本一致的,但还是存在一些特殊情况,已经遇到过的包括:清理了错误的event,意外断电而数据没有正确写到物理磁盘(RAID卡无电池),人工操作直接操作了计算节点等。本文介绍一个方案,检查各个分片是否一致。

参数

_t_gcluster_temp_table_trace

不是所有版本都支持,可以通过show预计查看是否支持该参数。默认值是0 关闭;1 是开启。

gbase> show variables like '%_t_gcluster_temp_table_trace%';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| _t_gcluster_temp_table_trace | 0     |
+------------------------------+-------+
1 row in set (Elapsed: 00:00:00.01)

说明

开启该参数后,执行SQL语句,将检查各个分片的主副本是否一致,建议检查后,立即关闭此参数,避免浪费资源。

该参数以下划线开头,不保证后续版本一定支持。

异常信息,在warnings里体现。
该参数支持session级设置。

样例

打开参数

gbase> set _t_gcluster_temp_table_trace=1;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> show variables like '%_t_gcluster_temp_table_trace%';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| _t_gcluster_temp_table_trace | 1     |
+------------------------------+-------+
1 row in set (Elapsed: 00:00:00.00)

检查

通过count(*)等查询语句后台自动检查。如下是一个n1分片主副本行数不一致的样例。

gbase> select count(*) from d1;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set, 2 warnings (Elapsed: 00:00:00.03)

gbase> show warnings;
+-------+------+------------------------------------------------------+
| Level | Code | Message                                              |
+-------+------+------------------------------------------------------+
| Note  | 1702 | testdb.d1_n1: Different row number in pri/dup node   |
| Note  | 1702 | Diagnosing hash tables failed, detail in express.log |
+-------+------+------------------------------------------------------+
2 rows in set (Elapsed: 00:00:00.00)

关闭参数

gbase> set _t_gcluster_temp_table_trace=0;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> show variables like '%_t_gcluster_temp_table_trace%';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| _t_gcluster_temp_table_trace | 0     |
+------------------------------+-------+
1 row in set (Elapsed: 00:00:00.00)

处理方案

主副本不一致,且集群也没有对应的数据故障标志,可以参考 GBase 8a集群通过gc_sync_client手工同步分片数据 , 也可以手工设置故障标志:GBase 8a手工设置表某个分片为故障状态的方法