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手工设置表某个分片为故障状态的方法