tikv节点一直处于 pending offline

这边碰到一个问题,一个 scale-in 节点一直处于 pending offline 状态,pd-ctl 里是 offline 状态,用SQL发现节点上有一个 region 在 scale-in 节点上,用 pd-ctl 工具发现该region没有leader节点

我们这边尝试

  1. restart scale-in 节点 (重启后状态没有改变)
  2. stop scale-in 节点 (tiup 中状态为改变,还是 pending offline 状态)
  3. operator add transfer-region 434317 1094772 {leader}/{voter}/{follower} 报错
    Failed! [500] “cannot build operator for region with no leader”
  4. scale-in --force 还没执行

参考了过这个帖子,貌似要用 tikv-ctl 进行 region 恢复,需要停整个TiDB 集群,感觉代价有点儿大,请问有没有啥平滑的解决方案呢?

pd-ctl看下region现在的状态

» region 434317
{
“id”: 434317,
“start_key”: “748000000000002DFFB95F720000000000FA”,
“end_key”: “748000000000002DFFB95F728000000003FF3F16990000000000FA”,
“epoch”: {
“conf_ver”: 7,
“version”: 4204
},
“peers”: [
{
“id”: 434318,
“store_id”: 1,
“role_name”: “Voter”
},
{
“id”: 434319,
“store_id”: 4,
“role_name”: “Voter”
},
{
“id”: 434320,
“store_id”: 5,
“role_name”: “Voter”
},
{
“id”: 434321,
“store_id”: 390553,
“role”: 1,
“role_name”: “Learner”,
“is_learner”: true
},
{
“id”: 434322,
“store_id”: 390554,
“role”: 1,
“role_name”: “Learner”,
“is_learner”: true
}
],
“leader”: {
“role_name”: “Voter”
},
“written_bytes”: 0,
“read_bytes”: 0,
“written_keys”: 0,
“read_keys”: 0,
“approximate_size”: 0,
“approximate_keys”: 0
}

没有 leader 的 store_ID 节点

附加 pd 节点的 WARN 日志

[task.go:192] [trace] [elapsed=229.17259ms] [rows=1] [sql=“INSERT INTO log_previews (task_id,task_group_id,time,level,message) VALUES (234,42,1648183895316,“Warn”,”[backoff.go:149] [\“regionMiss backoffer.maxSleep 200000ms is exceeded, errors:\ message:\\“region 434317 is missing\\” region_not_found:<region_id:434317 > at 2022-03-25T12:51:34.312726354+08:00\ message:\\“region 434317 is missing\\” region_not_found:<region_id:434317 > at 2022-03-25T12:51:34.814717852+08:00\ message:\\“region 434317 is missing\\” region_not_found:<region_id:434317 > at 2022-03-25T12:51:35.316459195+08:00\”]")"]

你这里是3副本+2tiflash吗?
pd-ctl operator add remove-peer <region_id> <from_store_id> 试试这个删除一个Voter peer看能选举出来leader不。

这个操作尝试过,因为感觉所有的操作都是基于有leader的状态才能向后进行

» operator add remove-peer 434317 5
Failed! [500] “cannot build operator for region with no leader”

这个群集是原来是 3副本 + 2 tiflash

  1. 缩了1个tiflash
  2. 扩了1个tikv
  3. 缩了1个tikv

你的什么版本

v5.2.1

这几个tikv上关于这个region的日志看下

嗯嗯,我这边tikv的日志和 pd的日志搜了进 4个星期的,没有发现什么有用的 :joy:
都是这种的
[task.go:192] [trace] [elapsed=229.17259ms] [rows=1] [sql=“INSERT INTO log_previews ( task_id , task_group_id , time , level , message ) VALUES (234,42,1648183895316,“Warn”,”[backoff.go:149] [\“regionMiss backoffer.maxSleep 200000ms is exceeded, errors:
message:\“region 434317 is missing\” region_not_found:<region_id:434317 > at 2022-03-25T12:51:34.312726354+08:00
message:\“region 434317 is missing\” region_not_found:<region_id:434317 > at 2022-03-25T12:51:34.814717852+08:00
message:\“region 434317 is missing\” region_not_found:<region_id:434317 > at 2022-03-25T12:51:35.316459195+08:00\”]“)”]

https://github.com/tikv/tikv/issues/9505
感觉跟这个有点像
@Lucien 仲舒大佬,帮看看

看 issue 看 tag 是 5.2.1 已经修复了。建议楼主先查查 通过 pd-ctl 和 jq 查一下,之前缩容 tikv 的节点的 region 是否补齐,有没有 region group 是 2 个 peer 的 region,从这个角度确认一下数据状态是否 ok 。如果一直 tikv pending offline 状态可能的原因也比较多,需要看看 pd log 里面对应的 region 有没有报错日志。我们再查查原因。

1 个赞

我重新把静默 region 关闭了,然后 reload了一下 tikv 节点还是 pending offline状态

重新把静默region 关闭了,然后 reload了一下 tikv 节点还是 pending offline状态

» region --jq=".regions[] | {id: .id, peer_stores: [.peers[].store_id] | select(length == 5)}"
{“id”:434317,“peer_stores”:[1,4,5,390553,390554]}

» region --jq=".regions[] | {id: .id, peer_stores: [.peers[].store_id] | select(length == 2)}"

region数量为2的没有,region数量是5的是有的,而且就是问题 region号

» region 434317
{
  "id": 434317,
  "start_key": "748000000000002DFFB95F720000000000FA",
  "end_key": "748000000000002DFFB95F728000000003FF3F16990000000000FA",
  "epoch": {
    "conf_ver": 7,
    "version": 4204
  },
  "peers": [
    {
      "id": 434318,
      "store_id": 1,
      "role_name": "Voter"
    },
    {
      "id": 434319,
      "store_id": 4,
      "role_name": "Voter"
    },
    {
      "id": 434320,
      "store_id": 5,
      "role_name": "Voter"
    },
    {
      "id": 434321,
      "store_id": 390553, <--- 这个store_id 是从4.0.x升上来的store_id
      "role": 1,
      "role_name": "Learner",
      "is_learner": true
    },
    {
      "id": 434322,
      "store_id": 390554, <--- 这个store_id 是从4.0.x升上来的store_id
      "role": 1,
      "role_name": "Learner",
      "is_learner": true
    }
  ],
  "leader": {
    "role_name": "Voter"
  },
  "written_bytes": 0,
  "read_bytes": 0,
  "written_keys": 0,
  "read_keys": 0,
  "approximate_size": 0,
  "approximate_keys": 0
}

比较奇怪是5副本,咋把region的副本搞掉呀?(没有 leader 的状态)

{“id”:434317,“peer_stores”:[1(正常节点),4(正常节点),5(下线节点),390553(v4.0.9升级节点,已经不再了),390554(v4.0.9升级节点,已经不再了)]}

Hi 大佬,这边分析是这样的目前这个 region 只有两个副本,但是pdctl里查看有5副本,具体情况如上

我们尝试使用 --force 缩容节点,在tiup里虽然没有了,但是在 pd-ctl 里的 store 里还是有,有没有不停机的方法把这个问题region给移除掉或者删除手动删除一些不存在的 store,让其内部自动发起选leader 的动作呀?

pd-ctl 里 store delete试试能删除不存在的节点不

删了,还是存在,一致保持 offline 状态:sweat_smile:

这样试试呢
curl -X POST http://{pd_ip}:{pd_port}/pd/api/v1/store/${store_id}/state?state=Tombstone
pd-ctl -u http://pd_ip:2379 store remove-tombstone

找了下5.0后不支持直接设置tombstone了:在 5.0 及以上版本中,该接口只支持更改 state 为 Up 或者 Offline,废弃了直接更改为 Tombstone 这个功能。这是由于直接更改为 Tombstone 总是引起操作者意料之外的结果。

那岂不是癌症了。。:sweat_smile: