스토어 (키-값)
스토어 (키-값)
섹션 제목: “스토어 (키-값)”TTL 지원이 있는 키-값 스토어: 인메모리, SQL 기반, 클러스터 복제(Raft 및 CRDT).
엔트리 종류
섹션 제목: “엔트리 종류”| Kind | 설명 |
|---|---|
store.memory | 자동 정리가 있는 인메모리 스토어 |
store.sql | 지속성이 있는 SQL 기반 스토어 |
store.kv.raft | 공유 Raft 기반의 클러스터 복제, 강한 일관성 KV |
store.kv.crdt | gossip(CRDT) 기반의 클러스터 복제, 최종 일관성 KV |
메모리 스토어
섹션 제목: “메모리 스토어”- name: sessions kind: store.memory max_size: 10000 cleanup_interval: "5m" lifecycle: auto_start: true| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
max_size | int | 10000 | 최대 항목 수 (0 = 무제한) |
cleanup_interval | duration | 5m | 만료된 항목 정리 간격 |
max_size에 도달하면 새 항목이 거부됩니다. 재시작 시 데이터가 손실됩니다.
SQL 스토어
섹션 제목: “SQL 스토어”- name: cache kind: store.sql database: app:postgres table_name: kv_store cleanup_interval: "10m" lifecycle: auto_start: true| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
database | reference | 필수 | 데이터베이스 엔트리 참조 |
table_name | string | 필수 | 스토리지용 테이블 이름 |
id_column_name | string | key | 키용 컬럼 |
payload_column_name | string | value | 값용 컬럼 |
expire_column_name | string | expires_at | 만료용 컬럼 |
cleanup_interval | duration | 0 | 만료된 항목 정리 간격 |
컬럼 이름은 SQL 인젝션에 대해 검증됩니다. 사용 전에 테이블을 생성하세요:
CREATE TABLE kv_store ( key VARCHAR(255) PRIMARY KEY, value BYTEA NOT NULL, expires_at BIGINT);
CREATE INDEX idx_expires_at ON kv_store(expires_at) WHERE expires_at IS NOT NULL;Cluster KV Stores {id=cluster-kv-stores}
섹션 제목: “Cluster KV Stores {id=cluster-kv-stores}”store.kv.raft와 store.kv.crdt는 클러스터 노드 간에 키-값 데이터를 복제합니다. 둘 다 클러스터링이 활성화되어 있어야 하며 동일한 Store 모듈 Lua API를 재사용합니다. 각 엔트리는 노드 전체 엔진 하나에 대한 네임스페이스 뷰입니다. namespace는 이 엔트리의 키를 격리하며 ^[a-z][a-z0-9._-]*$와 일치해야 합니다(_로 시작할 수 없음).
Raft (강한 일관성)
섹션 제목: “Raft (강한 일관성)”- name: deployments kind: store.kv.raft namespace: deploy| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
namespace | string | 예 | 공유 엔진 내 키 네임스페이스 |
쓰기는 공유 Raft를 통해 제안되며(팔로워는 리더로 전달), 읽기는 선형화 가능합니다. 조건부 쓰기(only_if_absent/if_version과 함께하는 put)가 지원됩니다. Raft 상태는 기본적으로 cluster.raft.data_dir(기본값 ~/.wippy/store) 아래에 fs-durable입니다. 구성을 참조하세요.
CRDT (최종 일관성)
섹션 제목: “CRDT (최종 일관성)”- name: sessions kind: store.kv.crdt namespace: sess durable: false| 필드 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
namespace | string | 예 | - | 키 네임스페이스 |
durable | bool | 아니오 | false | fs 스냅샷을 유지하여 전체 클러스터 재시작에도 네임스페이스가 보존되도록 함 |
쓰기는 로컬 상태를 변경하고 gossip을 통해 전파됩니다. 충돌하는 동시 쓰기는 last-writer-wins로 수렴합니다. 읽기는 로컬입니다. 조건부 쓰기는 지원되지 않습니다. durable: false이면 스토어는 인메모리이며 피어로부터 재구성됩니다. durable: true이면 <data_dir>/_sys/kvcrdt에 스냅샷을 기록합니다.
data_dir은 노드 레벨(cluster.raft.data_dir)이며 엔트리별이 아닙니다. 공유 Raft 상태와 durable CRDT 스냅샷은 <data_dir>/_sys/ 아래에 위치합니다.
TTL 동작
섹션 제목: “TTL 동작”두 스토어 모두 TTL(Time-to-live)을 지원합니다. 만료된 항목은 cleanup_interval에서 정리가 실행될 때까지 잠시 유지됩니다. 자동 정리를 비활성화하려면 0으로 설정하세요.
Lua API
섹션 제목: “Lua API”작업은 Store 모듈을 참조하세요: get, set, has, delete, 그리고 버전 관리 및 조건부 접근을 위한 put, entry, list, info.