多节点部署

概述

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 处于 pendingprocessing 状态(正在补副本)时,自动从其他 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