【 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 ")”]
【资源配置】*
kevinsna
(Ti D Ber P O Zcnp Ja)
3
通过pd-ctl工具删除旧的Store ID,并让PD为重新部署的Pod分配新的Store ID
但是新加入的Pod依然部署在之前的Host上面, 我需要重新使用之前的Store ID。 出现这种情况代表着原来的数据已经丢失了吗
哈喽沃德
6
问题分析
- Store ID 冲突:
- 当 Pod 被删除并重新创建时,如果其数据目录(通常包含 Store ID 信息)被删除,TiKV 会尝试注册一个新的 Store ID。
- PD 检测到同一 IP 和端口(
lor1-0003273.int.linkedin.com:19878
)上已经有一个 Store 注册了旧的 Store ID,因此出现了冲突。
- 数据目录清理:
- 在 Kubernetes 中,Pod 的数据目录如果没有持久化存储(Persistent Volume)进行管理,Pod 删除后,其数据也会被清理,导致重启后无法找到原有的 Store ID。
解决方案
要解决这个问题,可以考虑以下几种方案:
- 使用持久化存储(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
- 手动注册 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 环境中可能不太符合动态扩展的原则。
- 监控和告警:
- 设置监控和告警机制,以便及时发现和解决此类问题。例如,使用 Prometheus 监控 TiKV 和 PD 的状态,并设置告警规则。
3 个赞
system
(system)
关闭
8
此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。