supernode启动失败、dfdaemon连不上,根本原因是supernode未监听0.0.0.0或dfdaemon配置的supernode.addr与实际地址不一致;需检查监听地址、显式绑定0.0.0.0:8002、填真实ip、放行防火墙端口。

supernode 启动失败,dfdaemon 连不上怎么办
根本原因通常是 supernode 服务未真正监听在预期地址,或 dfdaemon 配置里写的 supernode.addr 和实际暴露的不一致。Dragonfly 默认只监听 127.0.0.1,而 dfdaemon 往往运行在其他节点或容器里,直连 localhost 必然超时。
- 检查 supernode 实际监听地址:
ss -tlnp | grep :8002(默认端口),确认是*:8002而非127.0.0.1:8002 - 启动 supernode 时显式指定绑定地址:
dragonfly-supernode --addr 0.0.0.0:8002,别依赖配置文件里没生效的字段 -
dfdaemon的--supernode-addr必须填 supernode 所在机器的真实 IP 或可解析域名,不能写localhost或127.0.0.1 - 防火墙常被忽略:确保宿主机或云厂商安全组放行
8002(supernode)和65001(dfdaemon p2p 端口)
dfdaemon 拉取镜像慢,P2P 流量没走起来
不是所有请求都会触发 P2P 下载——Dragonfly 有“种子阈值”机制:只有当同一文件的并发请求数 ≥ seedPeer.download.concurrent(默认 3),supernode 才会把该文件标记为“可种”,后续请求才走 peer-to-peer。冷启动阶段永远走源站,这是设计使然,不是 bug。
- 验证是否命中 P2P:查
dfdaemon日志,搜"use p2p"或"download from peer";没出现就说明还在回源 - 调低测试阈值快速验证:
dfdaemon --seed-peer-download-concurrent 1,让首个请求就尝试找 peer - 确保多个
dfdaemon实例用的是同一个--registry和镜像名(含 tag),否则会被视为不同资源,无法共享 peer - docker daemon 配置必须启用
dfdaemon代理:修改/etc/docker/daemon.json加"registry-mirrors": ["http://127.0.0.1:65001"],且重启 docker
supernode 负载高、CPU 暴涨,但 dfdaemon 日志显示大量 "no available peers"
这说明 supernode 在拼命做“调度决策”,但下游 peer 实在太少或网络不通——它得反复查询 peer 列表、校验健康状态、重试失败连接,全靠 CPU 硬扛。本质是 P2P 网络拓扑没跑通,supernode 变成了单点瓶颈。
- 确认
dfdaemon是否真在上报心跳:查 supernode 日志是否有"register peer",没有则 peer 根本没注册成功 -
dfdaemon必须开启--enable-health-check,否则 supernode 不知道 peer 是否存活,不敢调度 - peer 间直连依赖 udp 打洞或中继,若集群跨公网或 NAT 严重,需手动配置
--scheduler-addr指向统一 scheduler,并确保其dfget能互通 - supernode 自身不要部署在 k8s Pod 里直接暴露 Service —— 它需要稳定 IP 和端口映射,推荐用 DaemonSet + hostNetwork 或裸机部署
升级 Dragonfly 后 dfdaemon 报 "rpc Error: code = Unavailable desc = connection closed"
这是典型的 gRPC 版本不兼容:新版 supernode 默认启用了 TLS(或强制要求 TLS),但旧版 dfdaemon 还在用明文 HTTP/2 连接。错误信息里没提 TLS,是因为底层连接在握手阶段就被拒了,gRPC 只能报“connection closed”。
- 先看 supernode 启动参数:若含
--tls-cert或配置了tls.enabled: true,则dfdaemon必须同步加--supernode-tls-enable并提供 CA 证书路径 - 临时绕过验证(仅测试):
dfdaemon --supernode-tls-enable --supernode-tls-insecure-skip-verify - 生产环境务必配齐证书:supernode 的
--tls-cert和--tls-key,dfdaemon的--supernode-tls-ca-cert,三者需匹配 - 注意 Dragonfly v2.2+ 默认关闭 HTTP fallback,不加 TLS 参数就完全无法通信,不能再靠“试试看”蒙混过关
Dragonfly 的 P2P 调度不是开箱即用的黑盒,supernode 和 dfdaemon 之间的信任链、网络可达性、版本对齐、甚至时钟偏差(影响 Token 签名有效期),任何一个环节松动都会导致流量静默回落源站——而日志里往往只报最表层的连接错误。