概述
DHT(Kademlia 分布式哈希表)是 BitTorrent 生态的公共元数据网络,任何节点加入后即可持续采集 infohash 广播、抓取种子元数据。本文以 Go 开源项目 bitmagnet 为例,给出可落地的 DHT 爬虫完整部署方案,覆盖协议原理、环境校验、服务编排与性能调优。
系统架构与数据流
整体数据流:DHT 广播 → infohash 队列 → 元数据抓取 → PostgreSQL 入库建索 → Web/GraphQL API 检索。
| 环节 | 组件 | 协议 | 说明 |
| 采集 | bitmagnet crawler | UDP :6881 | 伪装节点接收 get_peers 广播 |
| 抓取 | MetaInfo exchanger | TCP | 拉取种子元数据 |
| 存储 | PostgreSQL 12+ | SQL | 分类 / 全文索引 / 去重 |
| 检索 | Web UI / GraphQL | HTTP :3333 | 搜索与展示 |
协议要点
| 协议 | 载体 | 作用 |
| BEP 5(DHT) | UDP | 节点路由,get_peers 请求携带 infohash |
| BEP 9(Metadata) | TCP | 扩展 handshake 交换种子元数据 |
| BEP 51(Infohash) | UDP | 按前缀枚举全部 infohash,加速全量采集 |
方案对比
| 项目 | 语言 | 吞吐 | 界面 | 适合场景 |
| bitmagnet | Go | 高 | Web+GraphQL | 自建索引,开箱即用 |
| dht-crawler | Go | 高 | 无 | 纯采集,入库自研 |
| opendht | C++ | 中 | 无 | 深度二次开发 |
| dhtreader / py 系 | Python | 低 | 无 | 学习原理、原型验证 |
部署步骤(bitmagnet)
1. 环境校验(必做)
要求服务器全通出站 UDP,且 6881 端口未被安全组限制。多数云厂商默认限制 UDP 出访,采集量为 0 时的第一排查点就是这里。
# TCP 连通性
nc -z -v 8.8.8.8 53
# UDP 收发验证
ncat -u --send-only -w 2 8.8.8.8 53
ss -ulnp | grep 6881
2. 安装
# 下载官方 Release 的 linux_amd64 包后解压安装
curl -L -o bitmagnet.tgz <release_url>
tar -xzf bitmagnet.tgz
install -m 0755 bitmagnet /usr/local/bin/bitmagnet
mkdir -p /etc/bitmagnet
3. PostgreSQL 建库
CREATE USER bitmagnet WITH PASSWORD 'STRONG_PASSWORD';
CREATE DATABASE bitmagnet OWNER bitmagnet ENCODING 'UTF8';
GRANT ALL PRIVILEGES ON DATABASE bitmagnet TO bitmagnet;
4. systemd 托管
[Unit]
Description=Bitmagnet DHT Crawler
After=network-online.target postgresql.service
Wants=network-online.target
[Service]
Type=simple
User=bitmagnet
Group=bitmagnet
ExecStart=/usr/local/bin/bitmagnet serve --config /etc/bitmagnet/config.toml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now bitmagnet
systemctl --no-pager --full status bitmagnet
journalctl -u bitmagnet -f
性能调优
| 参数 | 建议 | 位置 |
| max_open_files | 65535 | systemd LimitNOFILE |
| 采集并发 workers | CPU 核数 × 2 | config.toml |
| PG shared_buffers | 内存 25% | postgresql.conf |
| VACUUM ANALYZE | 每 6h | cron / pg_cron |
故障排查速查表
| 症状 | 原因 | 处理 |
| 采集量为 0 | UDP 出访受限 | 检查安全组 / 防火墙 UDP 出口 |
| 频繁掉线 | 端口未监听 | ss -ulnp,放开 6881/UDP |
| 元数据抓取慢 | 并发不足 | 调高 workers,检查连接数 |
| UI 无法打开 | 端口未放行 | 放开 3333/TCP,查看 systemd 状态 |
| PG 连接拒绝 | 认证配置错误 | 核对 pg_hba.conf / 密码 |
合规与运维
- DHT 网络同时存在公开与受版权保护的资源,对外提供索引时须遵守当地法律与平台政策。
- 数据量增长快,建议独立数据盘 + 冷热分层归档。
- 定期备份 PostgreSQL 与配置文件,避免重建索引成本。
- 建议叠加 Prometheus + Grafana 监控指标(入网节点数、采集速率、队列深度)。
该方案数小时可部署完成,核心前提仍是服务器支持全通出站 UDP。后续可扩展自有搜索前端,或对热门资源做分类挖掘。