
30 秒速读
存二进制大对象又不想运维一套重型存储:Redis 顺手但内存贵,对象存储又重。本篇讲 blobasaur:一个 Rust 写成的分片 Blob 存储服务——说 Redis 协议(直接用 redis-cli 读写)、数据落在每个分片独立的 SQLite 文件里,并给出一套生产配置清单:分片数、压缩算法、异步写入、监控、vacuum 该怎么配。
项目信息一览
| 项目 | 说明 |
|---|---|
| 作者 / 语言 | iamd3vil,Rust(Tokio 异步运行时) |
| 开源协议 | AGPL-3.0 |
| GitHub 数据 | Stars 63 / Forks 8,2025 年创建,累计提交 129,Releases 17 个(数据截至 2026-10-22) |
| 访问协议 | Redis 协议兼容,默认端口 6379,redis-cli 直连 |
| 存储后端 | 每分片一个独立 SQLite 数据库,多探针一致性哈希分片 |
| 配置方式 | config.toml |
| 部署方式 | Linux 预编译二进制 / Docker(ghcr.io/iamd3vil/blobasaur)/ 源码 cargo 构建 |
| 压缩算法 | Gzip / Zstd / Lz4 / Brotli 可配 |
| 监控 | Prometheus 兼容 metrics(默认关闭,需手动开启) |
版本怎么选:结论先行
结论:生产用 Docker 镜像并锁定具体版本号(如 0.8.0),不要用 latest。latest 每次 pull 都可能变,出问题没法回溯;锁版本是容器化部署的基本纪律。
| 方式 | 说明 | 适合谁 |
|---|---|---|
| Docker 镜像锁定版本(如 0.8.0) | tag 规则:latest / x.y.z / x.y,行为可预期 | 生产环境(推荐) |
| Docker latest | 每次 pull 都可能是新版本 | 尝鲜,不推荐生产 |
| Linux 预编译二进制 | Releases 页下载 tar.gz,解压即用 | 不想用 Docker 的裸机 |
| 源码构建 | cargo build –release,需 Rust 工具链;just build-linux 可打 musl 静态包 | 要改代码或交叉编译时 |
安装步骤:只讲关键卡点
- 拉镜像并锁定版本:docker pull ghcr.io/iamd3vil/blobasaur:0.8.0。卡点:别 pull latest 做生产,版本漂移出问题没法回溯。
- 写 config.toml:最小三行 data_dir、num_shards、addr。卡点:num_shards 定了之后再改 = 分片迁移,不是改个数字重启就行,起步按数据量一次定好。
- 启动并挂载:docker run -d -p 6379:6379 -v $(pwd)/config.toml:/app/config.toml -v $(pwd)/data:/app/data ghcr.io/iamd3vil/blobasaur:0.8.0 blobasaur –config /app/config.toml。卡点:data 目录必须挂持久化卷,容器删了数据不能跟着丢。
- 验证:redis-cli -p 6379 SET mykey “Hello” 再 GET mykey。卡点:无需专用客户端,现有 Redis 客户端直接连;SET EX 60 这类 TTL 写法也一并验证。
装完必改设置:5 个配置
- num_shards(分片数):入口是 config.toml 顶层。体感:分片是并发与扩展的粒度;事后调整要走 blobasaur shard migrate <old> <new> 做数据迁移,先定好再上线。
- 存储压缩 [storage_compression]:入口是 config.toml 的 storage_compression 段,algorithm 可选 zstd / lz4 / gzip / brotli。体感:README 推荐 zstd(速度与压缩比最均衡);高吞吐场景换 lz4;压缩发生在写入路径,CPU 和磁盘二选一。
- 异步写入与批处理:入口是 async_write、batch_size、batch_timeout_ms。体感:高吞吐按 README 的高性能配置开(async_write=true、batch_size=100、batch_timeout_ms=10);代价是崩溃可能丢写队列里没落盘的数据,按业务容忍度开。
- 监控 [metrics]:入口是 enabled=true、addr=”0.0.0.0:9090″。体感:Prometheus 兼容,命令延迟、连接数都能看;默认没开,不开等于裸奔,上线前一定打开。
- 定期 vacuum:入口是 blobasaur shard vacuum –all-shards,可跨节点编排。体感:删除和 TTL 过期后空间不自动回收,磁盘只涨不跌,运维日历里固定一条,别等磁盘满了才想起来。
注意事项 / 常见问题
- 它能替代 Redis 吗:不能完全替代。它只实现了 Blob 相关的有限命令集:GET / SET / DEL / EXISTS、HGET / HSET / HSETEX / HDEL / HEXISTS,以及 TTL / EXPIRE;业务依赖的其他 Redis 命令先核对是否在支持列表里,别假设。
- 数据到底存在哪:每个分片一个独立的 SQLite 文件,都在 data_dir 下;备份 = 备份这些文件。分片数量、文件管理、扩容策略要结合实际部署设计,不是装完就不用管了。
- 异常关机 / 崩溃会丢数据吗:默认同步写落盘;开了 async_write 后写队列里的数据可能丢;恢复后先验证数据完整性再接流量,别直接上线。
- TTL 过期的数据什么时候删:后台自动清理(cleanup_interval_secs,默认 60 秒可调);但磁盘空间回收要靠 vacuum——清理不等于回收,这是两个动作。
- 单个请求 / 值有多大限制:max_request_size_mb(默认 100)卡单次请求大小,超了直接断连接;存大文件前先评估这个值和内存占用,别用默认 100MB 去扛 GB 级写入。
排错:常见报错处理
- 连接被断:max_request_size_mb 默认 100MB,单次请求超了会直接断连接;存大文件前先评估这个值和内存占用,不要用默认 100MB 去扛 GB 级写入。
- 崩溃后数据对不上:开了 async_write 后,写队列里没落盘的数据可能丢;恢复后先验证数据完整性再接流量,不要直接上线。
- 磁盘只涨不跌:TTL 后台清理不等于空间回收,删除和过期后空间要靠 vacuum 回收;把 vacuum 排进运维日历,别等磁盘满了才想起来。
适合谁,不适合谁
一句话:适合需要”用 Redis 客户端读写二进制大对象、又想以 SQLite 文件免运维落地”的服务和小型平台团队;不适合依赖完整 Redis 命令集、需要复制 / 哨兵等复杂高可用生态,或组织政策不接受 AGPL-3.0 的场景。
GitHub 国内访问较慢,如打不开可多刷新几次
推广

关注「软件教程管家」
回复软件名即取即下:网盘下载链接 + 提取码,一步直达,不用再跳转。
版权与使用提示
本站资源仅供个人学习交流,请勿用于商业用途。软件与资料版权归原作者所有;如有侵权,请通过公众号「软件教程管家」联系我们,我们将在 24 小时内下架处理。查看免责声明 ›
文章推荐
标签推荐
正文完







