Files
dht/dht-search

dht-search

dht-search 是集 DHT Metadata 采集 RocksDB 持久化 Tantivy 搜索索引和 HTTP API 于一体的应用

构建准备

RocksDB 包含 C++ 代码并在构建时使用 bindgen 因此需要 libclang

Windows 可以把 libclang 安装到工作区本地目录

python -m pip install --target .tools\libclang libclang
$env:LIBCLANG_PATH = "$PWD\.tools\libclang\clang\native"
cargo build -p dht-search --release

.tools 只用于本地构建不会部署到运行设备

配置

复制根目录的配置模板

Copy-Item dht-search.example.toml dht-search.toml

相对 data_dir 以配置文件所在目录为基准解析

也可以通过命令行覆盖数据目录和本次运行时长

cargo run -p dht-search -- --data-dir D:\data\dht-search --run-duration-secs 3600

不设置 run-duration-secs 时服务持续运行直到收到 Ctrl+C SIGINT 或 SIGTERM

网络保护配置

主动 DHT 查询共享 max_outbound_queries_per_second 总预算,因此 find_node get_peerssample_infohashes 的总发送速率不会各自叠加后失控

配置项 保守默认值 作用
max_outbound_queries_per_second 10 三类主动 DHT UDP 查询的合计每秒速率
outbound_query_burst 2 空闲后允许立即消费的 UDP 查询数
find_node_queries_per_second 6 find_node 自身速率上限
find_node_max_in_flight 12 同时等待响应的 find_node 数量
new_destinations_per_minute 60 每分钟首次探测的新 UDP 目标数量
peer_lookups_per_second 1 每秒启动的 infohash Peer 查找数量
peer_lookup_max_active 4 同时运行的 Peer 查找数量
sample_queries_per_second 1 BEP-51 采样查询速率
metadata_workers 8 同时处理的 Metadata 任务数量
metadata_connects_per_second 2 每秒真正开始的 Peer TCP 连接数量

桌面网络不要在不了解路由器 NAT 和代理容量时大幅提高这些值

采样去重和 Peer 查找

BEP-51 返回的 infohash 会先进入有界批量准入队列并由 RocksDB 精确判断

已有 infohash 只更新最后发现时间和发现次数不会再次执行 Peer Lookup

未知 infohash 首先只向返回样本的 DHT 节点查询一次 get_peers 只有单点查询没有返回 Peer 时才降级为有限迭代查找

/stats 中的 sampled_hashes_filtered peer_lookup_preferred_succeededpeer_lookup_fallbacks 用于观察提前去重和单点优先效果

Linux 资源限制

生产环境仍可能同时使用较多 TCP socket

Linux 生产运行必须把文件描述符上限提高到至少 65536

prlimit --nofile=65536:65536 -- \
  /opt/dht-search/dht-search --config /opt/dht-search/dht-search.toml

systemd 服务需要设置

[Service]
LimitNOFILE=65536

文件描述符上限过低时 DHT 连接会挤占 Tantivy 和 RocksDB 打开文件所需的描述符并导致服务安全停止

API

默认只监听 127.0.0.1:8080

GET /health
GET /ready
GET /stats
GET /search?q=ubuntu&offset=0&limit=20
GET /search?q=&min_size=1048576&max_size=10737418240&extension=mkv
GET /torrents/{infohash}

limit 被限制在 1 到 100 之间且 offset 最大为 10000

搜索和大小扩展名过滤由 Tantivy 索引执行不会把全部记录加载到内存过滤

数据恢复

RocksDB 是权威数据源而 Tantivy 是可重建索引

当 Tantivy 目录不存在时应用会把全部 RocksDB 记录重新标记为待索引并自动完成全量重建

正常退出会先停止 DHT 再排空持久化队列提交剩余索引最后关闭 HTTP 服务