reductstore/reductstore
High-performance, time-indexed object storage for robotics and industrial IoT
ReductStore – 面向机器人和工业物联网的时序索引对象存储
是什么 – ReductStore 是一个用 Rust 编写的开源服务器,可存储任意二进制负载(图像、视频、ROS 数据包、日志、传感器读数等),并附带时间戳和可选的 标签。数据存储在本地磁盘上,可配置为环形缓冲区,服务器通过 HTTP API(以及 Python 客户端)提供快速写入、时间范围 + 标签查询、选择性复制和生命周期策略(压缩、保留)功能。专为机器人和工业物联网边缘 AI 流水线设计,将传统的时序数据库 + 对象存储 + 自定义脚本堆栈整合为单一高性能存储系统。
对 AI/机器人的重要性 – 边缘 AI 系统持续生成多模态数据,这些数据后续需要用于调试、模型评估或进一步分析。传统架构需要时序数据库 加 对象存储 加 自定义脚本实现保留和复制。ReductStore 将所有这些功能整合为单一服务,使在机器人或边缘网关上保持有限的本地历史记录变得更容易,并仅将相关子集发送到云端用于训练或推理流水线。
核心功能
| 功能 | ReductStore | 典型替代方案 |
|---|---|---|
| 任意二进制负载 | ✅ 原生记录(任意文件类型) | MinIO(对象),TimescaleDB(BYTEA),MongoDB(BinData/GridFS) |
| 内置时间戳索引 | ✅ 每条记录均带时间索引 | MinIO – 无时间索引;TimescaleDB – 超表;MongoDB – 自定义模式 |
| 基于标签的查询 | ✅ 支持时间范围 和 标签表达式查询 | MinIO – 仅支持键列表;TimescaleDB/MongoDB – 需自定义表/集合 |
| 环形缓冲区 / 配额保留 | ✅ 基于容量的 FIFO,自动淘汰 | MinIO – 基于年龄过期;TimescaleDB – 无;MongoDB – 限定集合 |
| 选择性复制 | ✅ 仅复制匹配标签条件的记录 | MinIO – 仅支持前缀/标签;TimescaleDB – 全量流式复制;MongoDB – 无 |
| 生命周期策略 | ✅ 按存储桶/标签自动压缩与删除 | MinIO – 写入时分层;TimescaleDB – 列存 + 保留;MongoDB – 仅 TTL |
| 流式 / 订阅 | ✅ 发布-订阅 API(专为存储设计,非消息队列) |
典型应用场景
- 机器人回放 – 存储带时间戳的相机帧、LiDAR 扫描和日志;后续查询“在最近一小时内,
device_status=error时来自 camera-1 的所有帧”。 - 边缘 AI 数据流水线 – 在机器人上保留 30 天本地缓冲区,压缩旧数据,并仅将与错误相关的记录复制到云端 ReductStore,用于模型重训练。
- 工业物联网网关 – 从多台设备收集传感器数据块,为每台设备添加标签,并在无需独立 TSDB 的情况下强制执行 60 天保留策略。
- 选择性备份 – 定义复制规则,例如“将存储桶 A 中所有
severity=high的内容复制”。
快速入门
# 1️⃣ 创建由容器用户(uid 10001)拥有的数据目录
mkdir -p ./data && sudo chown -R 10001:10001 ./data
# 2️⃣ 运行服务器(在 8383 端口暴露 HTTP API)
docker run -p 8383:8383 -v ${PWD}/data:/data \
-e RS_API_TOKEN=my-secret-token reduct/store:latest
或运行原生二进制文件:
curl -LO https://github.com/reductstore/reductstore/releases/latest/download/reductstore.x86_64-unknown-linux-gnu.tar.gz
tar -xzf reductstore.x86_64-unknown-linux-gnu.tar.gz
mkdir -p ./data
RS_DATA_PATH=./data RS_API_TOKEN=my-secret-token ./reductstore
Python 示例(异步客户端):
import asyncio
from reduct import Client
async def main():
async with Client("http://localhost:8383", api_token="my-secret-token") as client:
bucket = await client.create_bucket("my-bucket", exist_ok=True)
await bucket.write(
"camera-1",
b"hello, reductstore",
timestamp="2024-01-01T10:00:00Z",
labels={"device": "camera-1"},
)
async for rec in bucket.query(
"camera-1",
start="2024-01-01T10:00:00Z",
stop="2024-01-01T10:00:01Z",
when={"&device": {"$eq": "camera-1"}},
):
print((await rec.read_all()).decode())
asyncio.run(main())
完整文档、教程和二进制下载请访问 https://reduct.store。
生态系统与可扩展性
- 客户端库 – 官方 Python 客户端(
reduct),以及社区开发的 Go、Rust 和 JavaScript SDK。 - Docker 镜像 –
reduct/store(官方,每次发布自动构建)。 - Protocol Buffers API – 服务器使用内嵌的
protoc二进制文件;开发者可生成 gRPC 存根,若偏好二进制 RPC 而非 HTTP。 - 社区 – Discourse 论坛、GitHub Issues、
good-first-issues标签、贡献指南。
不应使用 ReductStore 的情况
- 适合经典时序数据库(如 Prometheus、InfluxDB)的纯数值时序数据。
- 无需时间查询的简单对象存储(直接使用 S3 或文件系统更便宜)。
- 有专用消息队列需求 – ReductStore 的发布/订阅是面向存储的,而非高吞吐量代理。
许可证与活跃度
- 许可证 – Apache-2.0(每个仓库独立)。
- 成熟度 – 活跃开发超过 4 年,350+ 星标,60k+ 下载量,100+ 生产部署,管理数据超 1PB。
- CI / 测试 – GitHub Actions CI、代码覆盖率徽章、Docker 拉取次数徽章。
TL;DR
ReductStore 是专为机器人和工业边缘 AI 工作负载设计的高性能存储引擎,用于处理带时间索引的二进制数据。它通过原生时间戳索引、基于标签的查询、环形缓冲区保留和选择性复制,消除了对独立时序数据库 + 对象存储的需求,所有功能均可通过简单 HTTP API 和即用型 Docker 镜像访问。
相关
- 项目
- 项目
- 项目
- 项目
- 项目