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는 이를 하나의 서비스로 통합하여, 로봇이나 엣지 게이트웨이에서 제한된 로컬 기록을 유지하고, 클라우드로 전송하는 것은 훈련 또는 추론 파이프라인용으로 관련된 하위 집합만 전송하는 것을 쉽게 만듭니다.


핵심 기능

기능 ReductStore 일반적인 대안
임의의 바이너리 페이로드 ✅ 네이티브 레코드 (모든 파일 형식) MinIO (객체), TimescaleDB (BYTEA), MongoDB (BinData/GridFS)
내장 타임스탬프 인덱스 ✅ 모든 레코드는 시각 인덱싱됨 MinIO – 타임스탬프 인덱스 없음; TimescaleDB – 하이퍼테이블; MongoDB – 사용자 정의 스키마
라벨 기반 쿼리 ✅ 시간 범위 및 라벨 식으로 쿼리 가능 MinIO – 키 목록만; TimescaleDB/MongoDB – 사용자 정의 테이블/컬렉션 필요
링 버퍼 / 할당 기반 보관 ✅ 용량 기반 FIFO, 자동 제거 MinIO – 나이 기반 만료; TimescaleDB – 없음; MongoDB – 캡처드 컬렉션
선택적 복제 ✅ 라벨 조건을 충족하는 레코드만 복제 가능 MinIO – 접두사/태그만; TimescaleDB – 전체 복사 스트리밍; MongoDB – 없음
라이프사이클 정책 ✅ 버킷/라벨별 자동 압축 및 삭제 MinIO – put 시 티어링; TimescaleDB – 컬럼스토어 + 보관; MongoDB – TTL만
스트리밍 / 구독 ✅ 발행-구독 API (메시지 큐가 아니라 저장소 중심으로 설계됨)

일반적인 사용 사례

  1. 로봇 재생 – 카메라 프레임, LiDAR 스캔, 로그를 타임스탬프와 함께 저장; 나중에 "최근 1시간 동안 device_status=error일 때 카메라-1에서 모든 프레임"을 쿼리.
  2. 엣지 AI 데이터 파이프라인 – 로봇에 30일 분량의 로컬 버퍼를 유지하고, 오래된 데이터를 압축하며, 오류 관련 레코드만 클라우드 ReductStore로 복제하여 모델 재학습에 사용.
  3. 산업용 IoT 게이트웨이 – 여러 기계에서 센서 블롭을 수집하고, 각 기계별 라벨을 적용하며, 별도의 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) 외에도 커뮤니티 SDK로 Go, Rust, JavaScript 지원.
  • Docker 이미지 – reduct/store (공식, 각 릴리스마다 자동 빌드).
  • Protocol Buffers API – 서버는 번들된 protoc 바이너리 사용; 개발자는 HTTP 대신 바이너리 RPC를 선호할 경우 gRPC 스텁 생성 가능.
  • 커뮤니티 – Discourse 포럼, GitHub 이슈, 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 이미지를 통해 접근 가능합니다.

관련

  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트