存储位置管理
概述
ul-disk 支持 4 种后端驱动,通过 FlySystem 3.0 统一抽象。每个存储位置自动生成 MD5 指纹用于 Hamming 路由(类似一致性哈希,但用 Hamming 距离替代环距离)。
驱动类型
Local(本地磁盘)
| 配置项 | 说明 |
|---|---|
path |
存储根目录(如 /data/storage) |
Local 后端不能跨节点共享,只本节点访问。
SFTP
| 配置项 | 说明 |
|---|---|
host |
主机地址 |
port |
端口(默认 22) |
username |
用户名 |
password |
密码(与密钥二选一) |
privateKey |
私钥路径(与密码二选一) |
root |
根目录 |
使用 phpseclib V3(已从 V2 迁移)。
FTP
| 配置项 | 说明 |
|---|---|
host |
主机地址 |
port |
端口(默认 21) |
username |
用户名 |
password |
密码 |
root |
根目录 |
WebDAV
| 配置项 | 说明 |
|---|---|
baseUri |
WebDAV 服务地址 |
userName |
用户名 |
password |
密码 |
prefix |
路径前缀 |
第一参数是
Sabre\DAV\Client(非Sabre\HTTP\Client)。
Hamming 路由算法
文件写入时,系统按以下步骤选择存储位置:
1. 筛选:status=enable AND (size_limit=0 OR size_limit > size_used)
2. 算距离:gmp_hamdist(chunk_md5 二进制, position.md5 二进制)
3. 排序:Hamming 距离 ASC,同距离 weight DESC
4. 写入:首个可用位置成功即完成
意图:将内容哈希相近的 chunk 倾向放到同一位置,优化跨后端访问局部性。
容量管理
- 每个位置有
size_limit(0 = 不限)和size_used(实时累加) - 写入前检查容量,满则跳过该位置
- 原子
UPDATE size_used = size_used + ?防多副本并发竞争 - 容量不足时抛出
InsufficientStorageException(507 Insufficient Storage)
位置测速
# 测全部 online 位置(写+读 4MB,更新 priority 权重)
docker exec uldisk-dev-uldisk-1 php think position:benchmark
# 测指定位置
docker exec uldisk-dev-uldisk-1 php think position:benchmark --position=1
配合配置:
storage.priority_mode = auto(默认):按 Hamming 距离路由storage.priority_mode = manual:按 priority 权重降序路由(测速后自动更新)
限流
每个位置可配置三维度限流(0 = 不限):
| 配置项 | 说明 |
|---|---|
rate_limit_rpm |
每分钟请求数(令牌桶) |
max_concurrent |
最大并发数 |
bandwidth_limit_mbps |
带宽上限 Mbps |
基于 APCu 共享内存,跨 FPM worker 共享但不跨节点。APCu 不可用时 fail-closed(拒绝不降级)。
后端超时
优先级链:position.config.timeout > storage.position_timeout_default(默认 30s) > 30(硬编兜底)
原文标题:存储位置管理
原文文档:uldisk
原文地址:/read/augushong/ul-disk/zh-cn/1.0.0/6a3e73c598601/6a3e73d807b60.html
原文平台:奥宏文档
1.0.0