多节点部署
概述
ul-disk 支持多节点分布式部署,实现跨节点数据冗余和读负载均衡。
节点注册
主节点注册从节点
docker exec uldisk-dev-uldisk-1 php think node:register \
--internal-url=http://node2:8002 \
--internal-token=<共享密钥>
参数:
--internal-url:从节点的内部通信地址--internal-token:节点间通信认证密钥(所有节点共享同一密钥)
从节点心跳
从节点定时向主节点报告存活状态:
# cron 每分钟执行
docker exec uldisk-dev-uldisk-1 php think node:heartbeat
心跳超时(node.heartbeat_timeout 默认 300 秒)后,节点标记为 offline,不再参与跨节点读。
跨节点读
触发条件
当本地 chunk 处于 pending 或 processing 状态(正在补副本)时,自动从其他 online 节点拉取:
readFile → chunk 状态 = pending
→ tryCrossNodeRead()
→ GET {node.internal_url}/internal/chunk/{md5}
→ 返回 chunk 内容
配置
storage.cross_node_read_enabled = 1 # 默认 0(关闭)
内部通信
- 端点:
/internal/chunk/{chunk_md5} - 认证:
InternalTokenAuth中间件(internal-token头校验) - 协议:简单 HTTP GET,返回 chunk 原始内容(已解密解压)
降级策略
跨节点读失败时(网络超时 / 认证失败 / 节点 offline),降级为本地等待或抛异常。
数据再平衡
扫描超载位置
# 扫描 size_used > size_limit 的位置 → 入队迁移任务
docker exec uldisk-dev-uldisk-1 php think position:rebalance
# 预览(不执行)
docker exec uldisk-dev-uldisk-1 php think position:rebalance --dry-run
# 限制处理数量
docker exec uldisk-dev-uldisk-1 php think position:rebalance --limit=100 --sleep=100
撤空位置
下线维护时,将指定位置的全部 chunk 迁移到其他位置:
docker exec uldisk-dev-uldisk-1 php think position:evacuate --position=3
迁移任务入队后由 Worker Pool 异步执行,命令本身不做物理 IO。
Worker Pool
三档 durability_mode
| 模式 | 行为 | 适用场景 |
|---|---|---|
sync_one(默认) |
同步写 1 副本立即返回 + Worker 异步补副本 | 平衡速度与可靠性 |
async |
仅入队不写远端 | 批量导入(不保证 litmus) |
sync_all |
阻塞等全副本写完 | 合规场景 |
配置:storage.durability_mode = sync_one
Worker 部署
开发环境(run.sh):
# WORKER_COUNT=2 控制 Worker 子进程数
# bash while 循环拉起 N 个 Worker + 前台 exec php-fpm
生产环境(supervisord):
[program:uldisk-worker]
command=php think worker:run --max-tasks=1000 --sleep=1000
numprocs=2
autorestart=true
Worker 配置
| 键 | 默认值 | 说明 |
|---|---|---|
worker.pool_size |
4 | Worker 进程数 |
worker.lease_seconds |
60 | 任务租约超时 |
worker.poll_interval_ms |
1000 | 轮询间隔 |
worker.max_tasks_per_worker |
1000 | 单 Worker 最大任务数(防内存泄漏) |
修改
worker.*配置后必须重启 Worker 进程。
自愈扫描
副本数扫描(selfheal:scan)
cron 每 6 小时:扫描副本数不足的 chunk → 入队 Worker 补副本。
php think selfheal:scan --dry-run # 预览
php think selfheal:scan --limit=1000 --sleep=100
内容完整性校验(selfheal:verify)
cron 每 24 小时:校验物理 chunk 的实际 MD5 → 标记损坏 + 触发 Webhook。
php think selfheal:verify --dry-run
php think selfheal:verify --limit=500 --sleep=200
原文标题:多节点部署
原文文档:uldisk
原文地址:/read/augushong/ul-disk/zh-cn/1.0.0/6a3e73c598601/6a3e73d8a53bb.html
原文平台:奥宏文档
1.0.0