reductstore/reductstore
High-performance, time-indexed object storage for robotics and industrial IoT
ReductStore – ロボティクスおよび産業用IoT向けの時刻インデックス付きオブジェクトストレージ
何であるか – ReductStoreはRustで書かれたオープンソースのサーバーで、任意のバイナリペイロード(画像、動画、ROSバッグ、ログ、センサー読み取り値など)をタイムスタンプとオプションのラベルとともに保存します。データはローカルディスク上に保存され、リングバッファとして設定可能で、高速なインジェスト、時刻範囲+ラベルクエリ、選択的レプリケーション、ライフサイクルポリシー(圧縮、保持)をHTTP API(およびPythonクライアント)で提供します。ロボティクスおよび産業用IoTエッジAIパイプライン向けに設計されており、従来の時系列DB+オブジェクトストア+カスタムスクリプトのスタックを単一の高性能ストレージシステムに統合します。
AI/ロボティクスにとってなぜ重要か – エッジAIシステムは、後でデバッグ、モデル評価、さらなる分析のために再再生が必要なマルチモーダルデータを継続的に生成します。従来のスタックでは、時系列DB + オブジェクトストア + 保持およびレプリケーション用のカスタムスクリプトが必要です。ReductStoreはそれらをすべて1つのサービスに統合し、ロボットやエッジゲートウェイ上で限定的なローカル履歴を維持し、クラウドに送信するのは訓練や推論パイプライン用の関連するサブセットのみにするのを容易にします。
コア機能
| 機能 | 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スキャン、ログをタイムスタンプとともに保存;後で「過去1時間の
device_status=errorの間、カメラ1からのすべてのフレーム」をクエリ。 - エッジAIデータパイプライン – ロボットに30日分のローカルバッファを保持し、古いデータを圧縮し、クラウドのReductStoreにエラー関連のレコードのみレプリケートしてモデル再トレーニングに使用。
- 産業用IoTゲートウェイ – 複数の機械からのセンサーデータを収集し、各機械にラベルを適用し、別途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バイナリを使用;開発者はHTTPではなくバイナリRPCを好む場合、gRPCスタブを生成可能。 - コミュニティ – Discourseフォーラム、GitHub Issues、
good-first-issuesラベル、貢献ガイド。
ReductStoreを使わないべき場合
- クラシックなTSDBに適した純粋な数値時系列データ(例:Prometheus、InfluxDB)。
- 時刻ベースのクエリが不要な単純なブロブストレージ(S3やファイルシステムの方が安価)。
- 専用のメッセージキュー要件がある場合 – ReductStoreのパブリッシュ/サブスクライブはストレージ指向であり、高スループットのブローカーではない。
ライセンスと活動状況
- ライセンス – Apache-2.0(各リポジトリごと)。
- 成熟度 – 4年以上の活動的開発、350+スター、60k+ダウンロード、100+本番環境導入、1PB以上の管理データ。
- CI/テスト – GitHub Actions CI、コードカバレッジバッジ、Dockerプルバッジ。
TL;DR
ReductStoreは、ロボティクスおよび産業用エッジAIワークロード向けに特化した高性能ストレージエンジンで、時刻インデックス付きバイナリデータを扱います。時系列DB+オブジェクトストアを別々に必要とせず、ネイティブのタイムスタンプインデックス、ラベルベースのクエリ、リングバッファ保持、選択的レプリケーションを提供。すべてがシンプルなHTTP APIと即時実行可能なDockerイメージで利用可能。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト