-
Notifications
You must be signed in to change notification settings - Fork 0
architecture local storage
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이다 |
| 항목 | 값 |
|---|---|
| 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'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를 같은 노드에 배치한다.
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는 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 |
- 시스템 아키텍처
- 제어 & 데이터 플레인
- Dashboard VPC 설계
- 하드웨어 배치
- Hub EKS 네임스페이스
- Tailscale Mesh VPN
- 데이터 생명주기
- 데이터 조회 모델
- 실시간 갱신 구조
- IoT 데이터 계약
- Reporting Pipeline
- 로컬 스토리지
- 클라우드 스토리지
- Edge Agent
- Edge AI 탐지
- Factory-A Log Adapter
- Dummy Sensor
- Edge IoT Publisher
- Lambda Data Processor
- Risk Normalizer
- Risk Score Engine
- Pipeline Status Aggregator
- Graph Aggregator 5m
- Cloud Infra Collector
- Daily Report Generator
- Risk Alert Dispatcher
- Image Snapshot Pipeline
- Dashboard Backend
- Dashboard Web
- AI 채팅 어시스턴트