Skip to content

architecture local storage

minsoo edited this page Jun 9, 2026 · 3 revisions

아키텍처 — 로컬 스토리지

Edge 로컬 저장소는 장기 분석 저장소가 아니라 cloud publish 전 임시 저장, failover 안전성, 짧은 로컬 조회를 담당한다. 현재 구현에서는 InfluxDB, Longhorn/outbox, snapshot hostPath의 책임을 분리한다.


구성 요약

factory-a K3s

InfluxDB: safe_edge_db
  <- sensor / AI / audio workloads
  -> factory-a-log-adapter query

Longhorn PVC: /var/lib/aegis/outbox
  <- factory-a-log-adapter canonical JSON
  <- snapshot-uploader image_snapshot metadata
  -> edge-iot-publisher MQTT publish

snapshot hostPath: /var/lib/safe-edge/snapshots
  <- safe-edge-integrated-ai image files
  -> snapshot-uploader presigned S3 PUT

factory-b/c는 실제 설비 수집 대신 dummy generator가 canonical JSON을 만든다. 공통 목표는 edge-iot-publisher가 읽을 outbox 파일을 만드는 것이다.


책임 분리

저장소 책임 장기 보존 여부 cloud 전송과의 관계
InfluxDB 센서/AI/audio 결과의 로컬 시계열 저장 아님. retention 1일 factory-a-log-adapter가 최근 window를 읽어 factory_state, infra_state payload를 만든다
Longhorn outbox publish 전 canonical JSON spool, 재시도 버퍼, atomic handoff 아님. publish 성공 후 삭제 edge-iot-publisher가 outbox 파일을 MQTT로 전송한다
snapshot hostPath AI event 이미지 파일의 노드 로컬 임시 저장 아님. 24시간 cleanup + 매일 purge snapshot-uploader가 파일 bytes를 S3 image_snapshot/에 올리고 metadata만 outbox에 쓴다
Longhorn PVC InfluxDB/outbox의 RWO volume 복제와 failover 지원 저장소 자체의 장기 archive가 아님 cloud source of truth는 S3 raw/processed와 DynamoDB read model이다

InfluxDB

항목
Database safe_edge_db
Retention 1d
저장 내용 온도, 습도, 기압, AI score, 오디오 감지 결과
쓰기 주체 sensor/AI/audio workloads
읽기 주체 factory-a-log-adapter, 운영자
PVC Longhorn RWO PVC

InfluxDB는 factory-a 로컬 관측값의 짧은 시계열 buffer다. factory-a-log-adapter는 최근 3초 window를 평균해 factory_state payload를 만들고, 인프라 상태는 Kubernetes/노드 상태와 결합해 infra_state payload를 만든다.

Longhorn은 InfluxDB PVC의 현재 블록 상태를 복제한다. InfluxDB retention으로 삭제된 데이터가 Longhorn에 장기 archive로 남는 구조는 아니다.

확인 기준:

kubectl -n monitoring exec deploy/influxdb -- \
  influx -execute 'SHOW RETENTION POLICIES ON safe_edge_db'

Longhorn / outbox

outbox는 cloud publish 전 파일 기반 handoff 지점이다.

/var/lib/aegis/outbox/
/var/lib/aegis/outbox/tmp/
/var/lib/aegis/outbox/quarantine/

쓰기 흐름:

1. tmp/{message_id}.json.tmp 생성
2. fsync
3. {message_id}.json 으로 atomic rename
4. edge-iot-publisher가 .json만 pickup
5. IoT Core publish 성공 후 파일 삭제
6. schema 오류 등은 quarantine으로 이동

message_id는 outbox 파일명, MQTT payload, S3 raw key, DataProcessor의 source_message_id를 연결하는 idempotency key다.

factory-a Helm chart 기준:

항목
PVC template charts/aegis-spoke/templates/outbox-pvc.yaml
mount path /var/lib/aegis/outbox
access mode values의 outbox.storage.accessModes
storageClassName values의 outbox.storage.storageClassName

factory-a MVP에서는 Longhorn RWO outbox 때문에 factory-a-log-adapter, edge-iot-publisher, snapshot-uploader를 같은 노드에 배치한다.


snapshot hostPath

AI event snapshot 이미지는 Longhorn PVC가 아니라 node-local hostPath에 저장한다.

hostPath: /var/lib/safe-edge/snapshots
pod mount: /var/lib/safe-edge/snapshots
Safe-Edge legacy mount: /app/snapshots

역할:

항목
생성 주체 safe-edge-integrated-ai
업로드 주체 snapshot-uploader
local cleanup 1시간마다 24시간 초과 jpg/jpeg/png 삭제
daily purge 매일 03:00 KST worker별 snapshot directory purge
S3 binary target image_snapshot/factory_id={factory_id}/yyyy=YYYY/mm=MM/dd=DD/hh=HH/{filename}
IoT payload 이미지 bytes가 아니라 S3 bucket/key/content metadata

hostPath를 쓰는 이유는 Longhorn RWO PVC Multi-Attach로 AI Pod failover가 막히는 문제를 피하기 위해서다. 이미지 파일은 임시 이벤트 증거이고, 장기 공유 경로는 S3 image_snapshot/ prefix다.


snapshot-uploader와 outbox

snapshot-uploader는 hostPath를 polling하고, 업로드 완료 후 metadata JSON을 outbox에 기록한다.

scan dir: /var/lib/safe-edge/snapshots
scan interval: 10 seconds
state file: /var/lib/aegis/outbox/.snapshot-uploader-state.json

전송 흐름:

snapshot file
  -> SnapshotPresigner API
  -> S3 image_snapshot/ binary PUT
  -> outbox image_snapshot metadata JSON
  -> edge-iot-publisher
  -> IoT Core aegis/factory-a/image_snapshot
  -> S3 raw metadata + DataProcessor
  -> S3 processed metadata + DynamoDB LATEST.latest_image_snapshot

snapshot-uploader는 원본 로컬 파일을 삭제하지 않는다. 로컬 삭제는 snapshot cleanup 정책이 담당한다.

State file은 outbox PVC에 있지만 snapshot binary의 복제본은 아니다. 로컬 절대 경로별 size_bytes, mtime_ns, SHA-256, S3 key를 기록해 같은 파일의 재업로드를 막는다. State가 없는 최초 scan에서는 hostPath의 기존 이미지도 backlog로 업로드한다.

책임 경계:

항목 snapshot hostPath outbox PVC
저장 내용 JPEG/PNG 원본 binary publish 대기 canonical metadata와 uploader state
writer Safe-Edge AI snapshot-uploader, factory-a adapter
reader snapshot-uploader edge-iot-publisher, snapshot-uploader state 처리
publish 성공 후 원본 유지, cleanup 정책이 별도 삭제 metadata JSON 삭제, state file 유지
노드 간 가시성 node-local Longhorn RWO volume이 attach된 단일 노드

Factory A MVP는 safe-edge-integrated-ai, snapshot-uploader, edge-iot-publisher를 worker2 중심으로 운영한다. Worker2의 snapshot hostPath는 worker1에서 보이지 않고 outbox도 RWO이므로, worker1 snapshot upload failover와 worker2 backlog 인계는 현재 지원하지 않는다. AI Pod failover와 snapshot upload failover를 같은 기능으로 해석하면 안 된다.


로컬 저장소와 클라우드 정본

데이터 로컬 위치 클라우드 정본 / read model
sensor/AI/audio 시계열 InfluxDB safe_edge_db S3 raw, S3 processed, DynamoDB LATEST/HISTORY/GRAPH
publish 대기 JSON outbox PVC S3 raw와 DataProcessor 결과
AI 이미지 파일 snapshot hostPath S3 image_snapshot/ binary, DynamoDB latest_image_snapshot metadata

관련 문서

Aegis-Pi Wiki

· 대표 문서 목록은 홈의 문서 탐색 표 참조

시작하기

요구사항

핵심 개념

아키텍처

컴포넌트 (Edge → Cloud → Dashboard)

Dashboard & 운영

시나리오 · 사례 · 참조

Clone this wiki locally