Cluster第2台机器掉线,发现集群仍可以连接,但“某些”表的insert、select会报错

【TiDB 版本】 2.1.6

【集群节点分布】 3台机器,每台机器部署1个tidb、1个pd、2个tikv、1个pump,第2台机器多部署1个drainer。

【问题描述】 第2台机器(多部署1个drainer)掉线,发现集群仍可以连接,但“某些”表的insert、select会报错。 TiDB具有3副本高可用,理论上1台机器掉线,不应该出现该情况,请问为什么呢?

【掉线及恢复时间】 09-24 09:05掉线,09-25 10:56发现重启恢复(可从tikv日志看出)。

【日志】

  1. 第2台机器的第1个tkv的日志(第2个tikv实例日志类似) tikv_log (65.9 KB)
  2. 第1台机器的tidb日志(程序始终访问该tidb-server角色) tidb_log (760.5 KB)
  3. 程序出错日志 progress_log (1.3 MB)
1赞

每台机器的 2个 tikv 有打好 label 么?

请问打label什么意思?如何操作?会影响高可用吗?

1, 打 label 是指在 inventory.ini 文件中设置 tikv-server 的 labels 以及 location_labels,具体参考下单机多实例部署 https://pingcap.com/docs-cn/v3.0/how-to/deploy/orchestrated/ansible/#单机多-tikv-实例集群拓扑,label 的含义可以参考下 https://pingcap.com/docs-cn/v3.0/how-to/deploy/geographic-redundancy/location-awareness/

2,如果确认 label 没问题,即同一个机器上的两个 tikv 的 label 相同,再通过 pd-ctl 看下是否宕机的 tikv 上有 leader 没有及时调度到其他节点;

3,当某个 TiKV 负载较高时,也可能报错 TiKV Server timeout,通过监控检查下 TiKV Errors 下的面板是否有大量的报错异常

经检查,inventory.ini的[tikv_servers]未配置labels,同时[pd_servers:vars]也没有配置location_labels。配置如下图

请问这就是导致clusrer高可用失效的原因吗?

修改inventory.ini,增加这2个配置,再ansibli-playbook依次执行stop、deploy、start.yml是否就可以恢复cluster高可用了?

没有打 label 同一机器上可能存在两个副本,宕机后会剩下一个副本会造成高可用失效;增加这两个配置后, rollling_update 滚动重启下集群,然后 pd-ctl > config show all 确认下 location-labels 以及 label scheduler 已经加上

编辑inventory.ini如下

执行ansible-playbook rolling_update.yml也成功了,没有报错。但pd-ctl查看配置如下

location-labels仍然为空,并且找不到label_scheduler配置项。请问如何解决?

可以 pd-ctl 设置下 config set location-labels host

设置后location-labels为host,但未找到label scheduler。请问如何确认label scheduler已经正确加上?

现在pd-ctl执行config show all显示如下:

scheduler show 如果看不到,尝试 scheduler add label-scheduler 手动添加

如下图所示,是否表明label-scheduler已经加上?

嗯,也可以去 PD 监控面板, scheduler 中看看

针对打label恢复高可用还有几个问题想请教下:

  1. tikv打label、location-labels修改为host、新增label-scheduler后,历史数据会做副本迁移吗?还是只有新数据才能保证高可用?

  2. 如何确定打label后高可用生效了呢(不好测试呀)?有没有什么简单明了的方法?观察pd的scheduler监控页面,没有发现曲线波动,数据迁移。

1: 打标签,会加该节点的调度分数,进而触发数据进行重新平衡,所以历史数据会做副本迁移,但因为整个调度有最大线程数,所以再平衡是需要一定时间的,注意不要在这个窗口期出问题。

2: 如果确定生效?可以通过 pt-ctl 命令来查看该 store 下的 region id list,然后在看下同一宿主机下的 store 是否有相同的 region。

3: 可以通过监控:level 分别表示 label 配置的级别,比如 hosts

image

针对回复2,是指pd-ctl执行region命令,查看每个region的peers的3个store_id是否分布在不同机器上吗?类似下图:

这个方法不太直观啊。很难找到1个“原先在一台机器上有多副本,在打label后平衡到不同机器上的region”。没法前后比较,验证配置生效,请问有没有什么直观的看法吗?比如监控图什么的?

可以的,我在上面的回答补充了一下。如果需要具体 region id,需要通过 pt-ctl