tikv节点下线后,region 分布不均匀

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】v5.4.3
【复现路径】每台物理机上部署了2 个 tikv 节点(同一个物理机下不同盘部署tikv多实例),共3台物理机部署了6个tikv节点。当关闭某台物理机上的一个tikv后,region都往同物理机上的另一个tikv去补,造成 region 分布不均匀。

【资源配置】6 tikv ,3 pd,3 tidb(每台物理机上2个tikv节点,3台tikv物理机硬件相同)
【遇到的问题:问题现象及影响】
相关配置如下:

server_configs:
  tidb:
    log.slow-threshold: 300
  tikv:
    raftdb.defaultcf.force-consistency-checks: false
    raftstore.apply-max-batch-size: 256
    raftstore.apply-pool-size: 8
    raftstore.hibernate-regions: true
    raftstore.raft-max-inflight-msgs: 2048
    raftstore.store-max-batch-size: 256
    raftstore.store-pool-size: 8
    raftstore.sync-log: false
    readpool.coprocessor.use-unified-pool: true
    readpool.storage.use-unified-pool: true
    readpool.unified.max-thread-count: 24
    rocksdb.defaultcf.force-consistency-checks: false
    rocksdb.lockcf.force-consistency-checks: false
    rocksdb.raftcf.force-consistency-checks: false
    rocksdb.writecf.force-consistency-checks: false
    server.grpc-concurrency: 8
    storage.block-cache.capacity: 32G
    storage.scheduler-worker-pool-size: 8
  pd:
    dashboard.public-path-prefix: /test-tidb
    replication.enable-placement-rules: true
    replication.location-labels:
    - zone
    - rack
    - host
    schedule.leader-schedule-limit: 4
    schedule.region-schedule-limit: 2048
    schedule.replica-schedule-limit: 64
» config show leader-scheduler-limit
{
  "replication": {
    "enable-placement-rules": "true",
    "enable-placement-rules-cache": "false",
    "isolation-level": "",
    "location-labels": "zone,rack,host",
    "max-replicas": 3,
    "strictly-match-label": "true"
  },
  "schedule": {
    "enable-cross-table-merge": "true",
    "enable-joint-consensus": "true",
    "high-space-ratio": 0.7,
    "hot-region-cache-hits-threshold": 3,
    "hot-region-schedule-limit": 8,
    "hot-regions-reserved-days": 7,
    "hot-regions-write-interval": "10m0s",
    "leader-schedule-limit": 8,
    "leader-schedule-policy": "count",
    "low-space-ratio": 0.8,
    "max-merge-region-keys": 200000,
    "max-merge-region-size": 20,
    "max-pending-peer-count": 64,
    "max-snapshot-count": 64,
    "max-store-down-time": "30m0s",
    "merge-schedule-limit": 8,
    "patrol-region-interval": "10ms",
    "region-schedule-limit": 4096,
    "region-score-formula-version": "v2",
    "replica-schedule-limit": 64,
    "split-merge-interval": "1h0m0s",
    "tolerant-size-ratio": 0
  }
}

【附件:截图/日志/监控】



为什么 store-140936 关闭后, region 都往同物理机的另一个tikv节点 store-396786 上迁移,而不是往剩下的5个tikv节点均衡迁移呢?

mysql> SELECT t1.store_id, sum(case when t1.is_leader = 1 then 1 else 0 end) leader_cnt,count(t1.peer_id) region_cnt FROM information_schema.tikv_region_peers t1 GROUP BY t1.store_id
    -> ;
+----------+------------+------------+
| store_id | leader_cnt | region_cnt |
+----------+------------+------------+
|        3 |       6840 |      16757 |
|   140936 |          0 |      12275 |
|        6 |       6846 |      17050 |
|        7 |       6838 |      17151 |
|   396786 |       6839 |      21927 |
|        5 |       6838 |      17444 |
+----------+------------+------------+
6 rows in set (1.33 sec)

你这应该有有设置策略 打了 label标签

1 个赞

是的,打了label标签。详情如下:

tikv_servers:
- host: 192.1.1.3
  ssh_port: 22
  port: 20175
  status_port: 20185
  deploy_dir: /data01/tidb-deploy/tikv-20175
  data_dir: /data01/tidb-data/tikv-20175
  log_dir: /data/tidb-deploy/tikv-20175/log
  config:
    server.labels:
      host: tikv3
      rack: E06
      zone: qsh
  arch: amd64
  os: linux
- host: 192.1.1.3
  ssh_port: 22
  port: 20176
  status_port: 20186
  deploy_dir: /data02/tidb-deploy/tikv-20176
  data_dir: /data02/tidb-data/tikv-20176
  log_dir: /data/tidb-deploy/tikv-20176/log
  config:
    server.labels:
      host: tikv3
      rack: E06
      zone: qsh
- host: 192.1.1.4
  ssh_port: 22
  port: 20175
  status_port: 20185
  deploy_dir: /data01/tidb-deploy/tikv-20175
  data_dir: /data01/tidb-data/tikv-20175
  log_dir: /data/tidb-deploy/tikv-20175/log
  config:
    server.labels:
      host: tikv4
      rack: F06
      zone: qsh
  arch: amd64
  os: linux
- host: 192.1.1.4
  ssh_port: 22
  port: 20176
  status_port: 20186
  deploy_dir: /data02/tidb-deploy/tikv-20176
  data_dir: /data02/tidb-data/tikv-20176
  log_dir: /data/tidb-deploy/tikv-20176/log
  config:
    server.labels:
      host: tikv4
      rack: F06
      zone: qsh
- host: 192.1.1.5
  ssh_port: 22
  port: 20177
  status_port: 20187
  deploy_dir: /data02/tidb-deploy/tikv-20177
  data_dir: /data02/tidb-data/tikv-20177
  log_dir: /data02/tidb-deploy/tikv-20177/log
  config:
    server.labels:
      host: tikv5
      rack: E06
      zone: qsh
  arch: amd64
  os: linux
- host: 192.1.1.5
  ssh_port: 22
  port: 20179
  status_port: 20189
  deploy_dir: /data03/tidb-deploy/tikv-20179
  data_dir: /data03/tidb-data/tikv-20179
  log_dir: /data03/tidb-deploy/tikv-20179/log
  config:
    server.labels:
      host: tikv5
      rack: E06
      zone: qsh  

做的操作是tiup cluster stop tidb-test --node 192.1.1.5:20177

可以看看 @h5n1 的这篇内容~

谢谢表妹。

上次有个 是重启pd leader 进行魔幻操作就好了。 如果 上面的SOP 内容 满足不了你, 也可以重启下看看

我请教个问题:为什么 版本是5.4.3.而不是比较新的版本???

打label了

目前的版本够用了,就还没追最新版本。

感谢!我试试~

你这个虽然打了3种标:
host,rack,zone,但是是不是实际上只用了host?
也就是
tikv3\tikv3一组
tikv4\tikv4一组
tikv5\tikv5一组

你下线任何一个tikv,为了保证同一个区域最多一个副本,那只能往同一个物理机的另一个节点挪了。

啊,一语惊醒梦中人,应该就是这个原因了,实际起作用的label 估计只有 host…

能用上rack的前提是你有大于3个host,为了避免关闭某一个机架丢2副本,就会按照1个机架一副本。

:+1:

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。