TiKV failed to start node due to duplicate Store Address

【 TiDB 使用环境】测试
【 TiDB 版本】7.1.0
【复现路径】有一个5副本的TiKV cluster, 和3副本的PD cluster.
5副本的TiKV cluster部署在一个k8s 集群中,每台Host 有一个Pod,每一个Pod对应一个TiKV Store。

现在手动针对其中一个Pod 发起一次k8s的重新部署
遇到下面的问题。我的理解是因为Pod对应的data directory被删除,导致Pod重新加入的时PD重新分配了一个Store ID。如果data directory 能够被正常留存,Pod就会以原有Store的come back。

【遇到的问题:问题现象及影响】
[FATAL] [server.rs:921] [“failed to start node: Other("[components/pd_client/src/util.rs:885]: duplicated store address: id:5751 address:\"lor1-0003273.int.linkedin.com:19878\" labels:<key:\"host\" value:\"lor1-0003273.int.linkedin.com\" > labels:<key:\"zone\" value:\"ei4\" > labels:<key:\"rack\" value:\"9\" > version:\"7.1.0\" peer_address:\"lor1-0003273.int.linkedin.com:19878\" status_address:\"lor1-0003273.int.linkedin.com:19879\" git_hash:\"0c34464e386940a60f2a2ce279a4ef18c9c6c45b\" start_timestamp:1729097212 deploy_path:\"/export/content/lid/apps/tikv-runner/install/bin\" , already registered by id:5087 address:\"lor1-0003273.int.linkedin.com:19878\" labels:<key:\"host\" value:\"lor1-0003273.int.linkedin.com\" > labels:<key:\"zone\" value:\"ei4\" > labels:<key:\"rack\" value:\"9\" > version:\"7.1.0\" peer_address:\"lor1-0003273.int.linkedin.com:19878\" status_address:\"lor1-0003273.int.linkedin.com:19879\" git_hash:\"0c34464e386940a60f2a2ce279a4ef18c9c6c45b\" start_timestamp:1729030434 deploy_path:\"/export/content/lid/apps/tikv-runner/install/bin\" last_heartbeat:1729031924848343837 node_state:Serving ")”]

【资源配置】*

pd-ctl store delete 5087

通过pd-ctl工具删除旧的Store ID,并让PD为重新部署的Pod分配新的Store ID

但是新加入的Pod依然部署在之前的Host上面, 我需要重新使用之前的Store ID。 出现这种情况代表着原来的数据已经丢失了吗

怎么重新部署的,你原来 pod 上的持久化盘呢?

1 个赞

问题分析

  1. Store ID 冲突
  • 当 Pod 被删除并重新创建时,如果其数据目录(通常包含 Store ID 信息)被删除,TiKV 会尝试注册一个新的 Store ID。
  • PD 检测到同一 IP 和端口(lor1-0003273.int.linkedin.com:19878)上已经有一个 Store 注册了旧的 Store ID,因此出现了冲突。
  1. 数据目录清理
  • 在 Kubernetes 中,Pod 的数据目录如果没有持久化存储(Persistent Volume)进行管理,Pod 删除后,其数据也会被清理,导致重启后无法找到原有的 Store ID。

解决方案

要解决这个问题,可以考虑以下几种方案:

  1. 使用持久化存储(Persistent Volume)
  • 确保 TiKV 的数据目录使用持久化卷(PV),以便在 Pod 被删除和重新创建时能够保留数据。这样,TiKV 在重新启动时可以找到旧的 Store ID,从而避免冲突。示例配置:

yamlCopy Code

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: tikv-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi  # 根据需要调整存储大小

在 TiKV 的 Pod 定义中引用此 PVC:

yamlCopy Code

volumeMounts:
  - mountPath: /var/lib/tikv  # TiKV 默认数据目录
    name: tikv-storage
volumes:
  - name: tikv-storage
    persistentVolumeClaim:
      claimName: tikv-pvc
  1. 手动注册 Store
  • 如果因为某些原因无法使用持久化存储,可以尝试在 PD 中手动删除重复的 Store 信息。但这并不是最佳实践,并且可能导致数据丢失或不一致,因此需谨慎操作。删除 Store 的命令示例:

shCopy Code

curl -X DELETE http://<pd_address>:<pd_port>/pd/api/v1/store/<store_id>

这样可以从 PD 中删除旧的 Store,之后再重新启动 TiKV。
3. 设置 Store ID 保留

  • 在 TiKV 的配置中,可以尝试设置 store_id 为一个固定值,以防止在重启时创建新的 Store ID。但请注意,这种做法在 Kubernetes 环境中可能不太符合动态扩展的原则。
  1. 监控和告警
  • 设置监控和告警机制,以便及时发现和解决此类问题。例如,使用 Prometheus 监控 TiKV 和 PD 的状态,并设置告警规则。
3 个赞

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