【 TiDB 使用环境】测试/ Poc
【 TiDB 版本】 v4.0.9
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
tidb部署在k8s里面,如何在k8s外部使用tidb lightning工具,采用物理导入的方式导入数据到tidb集群。由于公司安全限制,不允许将tidb lignhing部署到tidb所在的k8s集群里面。
我采用的方式是:将pd 节点采用nodeport暴露出来,lightning工具配置pd-addr时配置成nodeIp+ port;
遇到的问题:
linghting报获取不到集群clusterid:
在lightning 工具所在主机上,使用pd-ctl工具查看member list,发现获取到的pd peer_url地址是k8s集群内的地址:
请问是否有方法将pd 所有节点暴露出来。或者是否有在集群外使用lightning 物理导入的可行性方案?
新建一个pod,安装lignhing,不影响以前集群,把本地目录挂载进入不行吗
kevinsna
(Ti D Ber P O Zcnp Ja)
6
- 确保 PD 服务可以被外部访问:您已经通过 NodePort 暴露了 PD 服务,确保 PD 的地址和端口可以被外部访问,并且没有网络安全限制阻止访问。
- 检查 TiDB Lightning 配置:在配置 TiDB Lightning 时,确保
pd-addr
配置正确指向了 PD 服务的 NodeIP 和端口。同时,检查其他配置项是否符合您的集群设置和要求。
- 获取 Cluster ID:TiDB Lightning 需要获取集群的
cluster-id
来识别它要连接的 TiDB 集群。如果 Lightning 报告无法获取 cluster-id
,这可能是因为它无法与 PD 服务建立连接。您可以通过以下命令获取集群 ID:
shell
kubectl exec -it <pd-pod-name> -- /usr/bin/pd-ctl -d "http://<pd-ip>:<pd-port>" cluster-id
确保替换 <pd-pod-name>
, <pd-ip>
, 和 <pd-port>
为您的 PD 服务的实际值。
4. 检查 TiDB Lightning 日志:查看 TiDB Lightning 的日志,可能会提供为什么无法获取 cluster-id
的更多线索。使用以下命令查看日志:
shell
kubectl logs <tidb-lightning-pod-name>
替换 <tidb-lightning-pod-name>
为实际的 Pod 名称。
5. 使用 TiDB Lightning 工具:使用 tidb-lightning-ctl
工具来管理导入过程,包括检查状态和故障排除。例如,您可以使用以下命令来获取导入状态:
tidb-lightning-ctl --config <path-to-config-file> status
- 检查 TiDB Lightning 版本兼容性:确保 TiDB Lightning 的版本与您的 TiDB 集群版本兼容。根据 PingCAP 文档中心的说明,TiDB Lightning 的版本应与集群相同2。
- 检查 TiDB 集群状态:确保 TiDB 集群处于健康状态,并且没有其他问题影响 Lightning 的连接和操作。
- 考虑使用 Helm chart 部署:如果您还没有使用 Helm chart 部署 TiDB Lightning,可以考虑使用 Helm chart 来简化部署和管理过程。Helm chart 可以自动处理配置和部署,减少手动配置的错误3。
现在的方法是用nodeport暴露了一个pd, 但是lightning报了“failed to get cluster id”的错误,不确定是哪里的问题。想请教一下,跟使用pd-ctl查出来的peer_urls:是集群内地址有关系么?
特殊原因,想在集群外用物理导入的方式。验证了应该是不行。感谢
这个方法应该可行。只是想在集群外试试物理导入,谢谢
经过验证,集群外物理导入无法实现。因为物理导入会从pd拿到所有pd的内部地址,然后会使用内部k8s的域名地址进行连接,从而出现dns解析失败导致链接失败。
这种方式应该是行不通了。
无论如何,谢谢回复的各位
你可以通过网关把pd的端口暴露出来。不要用nodeport暴露,nodeport只能暴露一个节点上的pd。
dba-kit
(张天师)
13
谢谢,这个方案要求前置条件“ Kubernetes 集群外物理机或虚拟机节点必须与集群内 Pod 网络互通”。我这个环境不满足。不过还是非常感谢!
不是很明白,例如使用ingress? 是指的这种方式么?能否说的详细点儿,谢谢
是的,通过ingress做个网关映射。前提是你得有ingress。
MrSylar
( Mr.Sylar)
18
方案是可行的,执行导入前需要在执行导入的机器配置 /etc/hosts 文件,把pd、tikv、tidb的 pod ip 与 srv 名字配置上解析
比如:
128.170.203.106 tidb-bstest-pd-0.tidb-bstest-pd-peer.tidb-federal.svc, 这里 tidb-federal 是 namespace 名字,tidb-bstest 是实例名字
这个方案要求前置条件“ Kubernetes 集群外物理机或虚拟机节点必须与集群内 Pod 网络互通”。这个环境不满足。所以还是行不通。
考虑过ingress的方案,但是分析下来认为还是不可行:
使用ingress的话,访问服务的时候要使用ingress-controller的ip 或者域名 + 路径来访问吧。但是现在的问题是,通过配置在lightning的配置文件里面的pd地址,lightning会拿到pd自己返回的所有内部地址(请看问题的第二张图),然后lightning 程序里面的pd客户端,会使用内部地址来获取元数,这时候会dns解析失败报错。
这个方案并没有解决这个关键问题。
不知道我理解的是否正确。希望再指导一下,感谢