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(专为存储设计,非消息队列)

典型应用场景

  1. 机器人回放 – 存储带时间戳的相机帧、LiDAR 扫描和日志;后续查询“在最近一小时内,device_status=error 时来自 camera-1 的所有帧”。
  2. 边缘 AI 数据流水线 – 在机器人上保留 30 天本地缓冲区,压缩旧数据,并仅将与错误相关的记录复制到云端 ReductStore,用于模型重训练。
  3. 工业物联网网关 – 从多台设备收集传感器数据块,为每台设备添加标签,并在无需独立 TSDB 的情况下强制执行 60 天保留策略。
  4. 选择性备份 – 定义复制规则,例如“将存储桶 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 镜像访问。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目