ストア(キーバリュー)
Wippy は、メモリ、SQL、Raft、または CRDT をバックエンドとする、TTL 対応のキーバリューストアを提供します。
このページはエントリ設定のリファレンスです。YAML のコードブロックは既存のエントリリストに配置する断片であり、SQL のコードブロックは store.sql エントリを起動する前に実行する必要があるスキーマ設定です。
エントリ種別
| 種別 | 説明 |
|---|---|
store.memory |
自動クリーンアップ付きのインメモリストア |
store.sql |
永続化される SQL バックエンドのストア |
store.kv.raft |
共有 Raft 上でクラスターレプリケーションされる、強整合性 KV |
store.kv.crdt |
ゴシップを介してクラスターレプリケーションされる、結果整合性 KV(CRDT) |
メモリストア
- name: sessions
kind: store.memory
max_size: 10000
cleanup_interval: "5m"
lifecycle:
auto_start: true
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
max_size |
int | 10000 | 最大エントリ数。0 はデフォルト値(10000)に置き換えられる |
cleanup_interval |
duration | 5m | 期限切れエントリのクリーンアップ間隔 |
max_size に達すると、新しいエントリは拒否されます。データは再起動時に失われます。
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 インジェクションを防ぐために検証されます。次の前提スキーマは PostgreSQL の DDL です。MySQL または SQLite では、同等のバイナリ/BLOB 型とタイムスタンプ型を使用してください。
CREATE TABLE kv_store (
key VARCHAR(255) PRIMARY KEY,
value BYTEA NOT NULL,
expires_at TIMESTAMPTZ NULL
);
CREATE INDEX idx_expires_at ON kv_store(expires_at) WHERE expires_at IS NOT NULL;
クラスター KV ストア {id="cluster-kv-stores"}
store.kv.raft と store.kv.crdt は、クラスターノード間でキーバリューデータをレプリケーションします。どちらもクラスタリングを有効にする必要があり、同じストアモジュールの Lua API を再利用します。各エントリは、ノード全体で共有される単一のエンジンに対する名前空間付きのビューです。namespace はこのエントリのキーを分離し、^[a-z][a-z0-9._-]*$ に一致する必要があります(_ で始めることはできません)。
Raft(強整合性)
- name: deployments
kind: store.kv.raft
namespace: deploy
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
namespace |
string | はい | 共有エンジン内のキー名前空間 |
書き込みは共有 Raft を通じて提案され(フォロワーはリーダーに転送)、読み取りは線形化可能です。条件付き書き込み(put で only_if_absent/if_version を指定)もサポートされます。Raft の状態はデフォルトで cluster.raft.data_dir(デフォルト: ~/.wippy/store)の下にファイルシステムへ永続化されます。設定を参照してください。
CRDT(結果整合性)
- name: sessions
kind: store.kv.crdt
namespace: sess
durable: false
| フィールド | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
namespace |
string | はい | - | キー名前空間 |
durable |
bool | いいえ | false | ファイルシステムにスナップショットを永続化し、クラスター全体の再起動後も名前空間を維持 |
書き込みはローカル状態を変更し、ゴシップを介して伝播します。競合する同時書き込みは last-writer-wins で収束します。読み取りはローカルです。条件付き書き込みはサポートされません。durable: false の場合、ストアはインメモリでピアから再構築されます。durable: true の場合は <data_dir>/_sys/kvcrdt にスナップショットを保存します。
data_dir はエントリごとではなく、ノードレベル(cluster.raft.data_dir)の設定です。共有 Raft の状態と永続 CRDT スナップショットは <data_dir>/_sys/ の下に保存されます。
TTL の動作
4 種類すべてのストアで time-to-live 値を指定できますが、有効期限の見え方はバックエンドによって異なります。
store.memoryは、期限切れのキーを読み取り時に存在しないものとして扱い、cleanup_interval(デフォルト5m)で期限切れエントリを削除します。設定値が 0 の場合は、このデフォルト値に置き換えられます。store.sqlは読み取り時に期限切れの行を除外し、cleanup_intervalで削除します。デフォルトの0はバックグラウンドクリーンアップを無効にしますが、期限切れの行が読み取り可能になるわけではありません。store.kv.raftは、期限付きキーをリーダー駆動のリースに関連付けます。約 1 秒ごとのリーススイープが Raft を通じて削除を提案するため、その合意済みの削除が適用されるまでキーを読み取れる場合があります。store.kv.crdtも約 1 秒ごとのリーススイープで期限切れのキーを削除し、その結果のトゥームストーンをゴシップします。リース期限は書き込みを受け付けたノードにのみ存在します。その発生元が期限切れ前に停止した場合、別のノードは独自に期限を再現しないため、後続の状態更新や管理者によるクリーンアップで削除されるまでキーが残ることがあります。
Lua API
操作については、ストアモジュールを参照してください。get、set、has、delete に加え、バージョン付きおよび条件付きアクセス用の put、entry、list、info を提供します。