【概述】macOS v10.15.7 无法访问 docker v20.10.8 容器内的 TiKV 节点
【背景】为了轻便地对与 TiKV 的集成进行测试,我们自己封装了一个 TiUP 镜像,里面包含 TiKV。我们使用自己做的一个小工具 oomplay 执行 oomplay init tikv
部署 TiKV 容器,并把 pd 映射到 localhost 的 22379 端口。部署成功后,执行 docker ps
得到:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ef0f71beb7e oomai/tiup:5.3.0 "tiup playground --t…" 13 minutes ago Up 13 minutes 3000/tcp, 3930/tcp, 4000/tcp, 9090/tcp, 0.0.0.0:22379->2379/tcp, :::22379->2379/tcp oomplay-tikv
【问题】在 macOS 下,无法从 localhost 正常连接 pd。而在 Ubuntu 20.04 上则不存在这个问题。
我尝试了两种 tikv client:python sdk 和 tcli
python sdk
>>> import os; from tikv_client import RawClient;
>>> RawClient.connect(['127.0.0.1:22379']).get('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/yiksanchan/miniconda3/lib/python3.9/site-packages/tikv_client/__init__.py", line 14, in connect
inner = event_loop.run_until_complete(
File "/Users/yiksanchan/miniconda3/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
return future.result()
File "/Users/yiksanchan/miniconda3/lib/python3.9/site-packages/tikv_client/asynchronous/__init__.py", line 14, in connect
inner = await tikv_client.RawClient.connect(pd_endpoints)
Exception: [/Users/runner/.cargo/git/checkouts/client-rust-5a1ccd35a54db20f/eb1d2da/tikv-client-pd/src/cluster.rs:264]: failed to connect to [Member { name: "pd-0", member_id: 13498724266307579611, peer_urls: ["http://172.17.0.2:2380"], client_urls: ["http://172.17.0.2:2379"], leader_priority: 0, deploy_path: "", binary_version: "", git_hash: "", dc_location: "" }]
tcli
$ tcli --pd 127.0.0.1:22379
2022/01/05 10:15:01 txnkv_client.go:18: F | rpc error: code = Unavailable desc = connection closed
两种方法都连不上。
但是,我尝试在容器里使用 python sdk 进行连接是没问题的。
>>> import os; from tikv_client import RawClient;
>>> RawClient.connect(['172.17.0.2:2379']).get('')
Jan 05 02:26:13.296 INFO connect to tikv endpoint: "172.17.0.2:20160"
在本地直接 curl health 接口也没问题。
$ curl 127.0.0.1:22379/health
{"health":"true"}
【TiDB 版本】5.3.0
若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。