plantpulse-storage (ストレージ層)
役割
PlantPulse のすべてのデータを永続保存する層です。データ種別に応じた4つの専門化されたエンジンを単一モジュールとして運用します。pd の起動順序における最初であり、起動しない場合は後続のすべてのサービスは試行されません。このゲートキーパーです。
| 項目 | 値 |
|---|---|
| モジュール名 | plantpulse-storage |
| インストール経路 | /opt/kopens/plantpulse-platform/plantpulse-storage/ |
| データ位置 | /data1/pp-data/ (PP_DATA_DIR、ボリューム pp-data) |
| バックアップ位置 | /data1/pp-backup/ (PP_BACKUP_DIR、ボリューム pp-backup) |
pd サービス | storage — MASTER · WORKER 両方 (MinIO は MASTER のみ) |
| 起動順序内での実行順 | valkey → postgres → cassandra → minio |
構成
ディレクトリ構造
plantpulse-storage/
├── cache/valkey/ # conf/valkey.conf (생성물) · 로그는 /data1/pp-data/valkey/logs
├── db/
│ ├── cassandra/ # bin/ (cqlsh · nodetool) · conf/cassandra.yaml · jvm-server.options (생성물) · logs/
│ └── postgres/ # bin/ (psql · pg_ctl) · conf/postgresql.conf · pg_hba.conf (생성물) · logs/
├── object/
│ ├── minio/ # bin/ · logs/
│ ├── rustfs/ weedfs/ # 대안 오브젝트 스토어 — 이미지에 있지만 pd 가 기동하지 않습니다
├── graph/janusgraph/ # 그래프 DB — 이미지에 있지만 pd 가 기동하지 않습니다
└── tools/reaper/ # Cassandra Reaper — 이미지에 있지만 pd 가 기동하지 않습니다
conf/ 以下のファイルはすべて生成物です。変更箇所はホストの /etc/kopens/conf/*.template です → 設定の変更方法
各エンジン
Cassandra — 時系列 · イベント
| 項目 | 値 |
|---|---|
| ポート | 9042 (CQL) · 7000/7001 (ノード間) · 7099 (JMX) |
| キースペース | pp (PP_KEYSPACE) |
| アカウント | cassandra (PP_CASSANDRA_USER) / PP_CASSANDRA_PASSWORD — PasswordAuthenticator |
| 設定 | cassandra.yaml.template · jvm-server.options.template (WORKER は cluster/ バージョン) |
| アドバタイズアドレス | broadcast_rpc_address — 127.0.0.1 の場合はレンダリングが拒否されます |
代表的なテーブル: pp.ts_data_points(時系列エンジンのデータポイント、行ごとにTTL)、pp.tm_tag_point · tm_tag_point_archive · tm_tag_point_snapshot(タグ)、pp.tm_asset_data(アセット)、pp.tw_*(コールドティアへ移動したもの記録)。テーブル別TTL · 圧縮戦略 · サイズは pd retention に表示されます。
docker exec plantpulse-datalake pd node status # 링 상태 — UN 이 정상
docker exec plantpulse-datalake pd node cql # cqlsh
docker exec plantpulse-datalake pd node errors # 최근 WARN/ERROR
docker exec plantpulse-datalake pd node compactionstats
docker exec plantpulse-datalake pd node repair # 무겁습니다
docker exec plantpulse-datalake pd node cleanup # 파괴적 — 스냅샷 삭제
| チューニング項目 | テンプレート | 推奨値 |
|---|---|---|
| ヒープ | jvm-server.options.template | ホストメモリの1/4、最大32GB |
compaction_throughput | cassandra.yaml.template | 128 MB/s (NVMe) / 16 MB/s (HDD) |
concurrent_compactors | cassandra.yaml.template | min(코어 수, 8) |
Cassandra Reaper はイメージ tools/reaper/ に含まれていますが、pd が起動しない手動ツールです。定期的な repair は pd node repair で実施します。
PostgreSQL — メタデータ
| 項目 | 値 |
|---|---|
| ポート | 5432 |
| データベース | pp (PP_DB_NAME) — その他 temporal · temporal_visibility · kestra · hive-metastore-230 |
| アカウント | plantpulse / PP_PG_PASSWORD。ロール temporal · hive · gravitino · kestra · replica もここに |
| 認証 | scram-sha-256 (pg_hba.conf.template) |
| 設定 | postgresql.conf.template · pg_hba.conf.template |
初回起動時にスキーマとロールがパスワードなしで作成され、pd がサイドカー値としてロールパスワードを同期します(起動ごとに ALTER ROLE — べき等)。したがって PP_GRAVITINO_PASSWORD · PP_KESTRA_DB_PASSWORD のようにローテーションツールが扱わない PostgreSQL アカウントはサイドカーを修正して再起動すれば対応できます。
docker exec -it plantpulse-datalake pd node psql # postgres OS 사용자로 psql
docker exec plantpulse-datalake pd storage # WAL · 복제 슬롯 · max_slot_wal_keep_size
docker exec plantpulse-datalake pd backup # 논리 덤프
| チューニング項目 | 推奨値 |
|---|---|
shared_buffers | ホストメモリの25% |
effective_cache_size | 50 ~ 75% |
max_connections | 200 (大規模環境では500) |
max_slot_wal_keep_size | 上限を設定してください — 削除されたワーカーのスロットが WAL を無限に保持することを防ぎます(イメージデフォルト8GB) |
Valkey — インメモリキャッシュ
| 項目 | 値 |
|---|---|
| ポート | 6379 (平文) · 6380 (TLS) |
| アカウント | redis (PP_REDIS_USER) / PP_REDIS_PASSWORD — requirepass |
| 設定 | valkey.conf.template (WORKER は cluster/ バージョン — replicaof マスター) |
| ログ | /data1/pp-data/valkey/logs/system.log — データボリューム配下です |
docker exec -it plantpulse-datalake bash -c '"$PP_HOME/tools/valkey/bin/valkey-cli" -h 127.0.0.1 -a "$PP_REDIS_PASSWORD"'
> INFO memory
> CONFIG GET maxmemory
MinIO — オブジェクトストレージ
| 項目 | 値 |
|---|---|
| ポート | 9000 (S3 API — pd が監視) · 9001 (コンソール — ユーザーが開く画面) |
| アカウント | minio (PP_MINIO_USER) / PP_MINIO_PASSWORD — 起動 env MINIO_ROOT_* で注入 |
| デフォルトバケット | plantpulse (PP_MINIO_BUCKET)。Icebergデータ · バックアップ · 添付ファイル |
| コンソール | http://<server-ip>:9001/ — ログインは上記アカウントと同じ値 |
MinIO は MASTER ノードでのみ起動します。mc クライアントはイメージに含まれ、起動スクリプトが pp-minio エイリアスを登録します。
統合運用
docker exec plantpulse-datalake pd status storage # 넷의 UP/DOWN
docker exec plantpulse-datalake pd restart storage # 넷 전부 — 의존하는 모든 서비스가 연결을 잃습니다
docker exec plantpulse-datalake pd storage # 볼륨 · WAL · 슬롯 · 스냅샷 · 크기
storage のみ再起動すると上記すべてが切断されます可能な限りホストの restart-datalake.sh でデータレイク全体を再起動してください。依存アプリ判定も実施します → 起動 · 停止 · 再起動
バックアップ / 復旧
| エンジン | ツール | 方式 |
|---|---|---|
| PostgreSQL | pgBackRest (物理) · pg_dump (論理) | full / diff · ポイントインタイムリカバリ |
| Cassandra | Medusa | full / diff スナップショット |
| MinIO | mc mirror | 外部 S3 レプリケーション |
手順は バックアップ · リストア にあります。
よくある問題
| 症状 | 原因 | 対処 |
|---|---|---|
Cassandra WriteTimeout | ディスク I/O 飽和 | pd node compactionstats、throughput 調整 |
| Cassandra ノードダウン | ネットワーク · ディスク · OOM | pd logs storage の GC pause、ホスト dmesg |
PostgreSQL Too many connections | 接続プール漏洩 | max_connections を上げる + アプリケーションプール点検 |
| WAL が継続増加 | 削除されたワーカーのレプリケーションスロット | pd storage の slot.orphan → ホスト ops-check.sh --reclaim |
| Valkey メモリ不足 | maxmemory-policy 未設定 | allkeys-lru または volatile-lru |
| MinIO ディスク満杯 | Iceberg · バックアップ蓄積 | コンソール9001でライフサイクルポリシー |
| 再起動後応答遅延 | Cassandra ウォームアップ | 正常 (3 ~ 5分) |
ディスクレイアウト推奨
/data1/
├── pp-data/ # 데이터 볼륨 (NVMe SSD)
│ ├── cassandra/ # SSTable · commitlog · saved_caches
│ ├── postgres/ # data · dump
│ ├── minio/
│ ├── valkey/
│ └── kafka/
├── pp-temp/
└── pp-backup/ # pgbackrest · medusa
Cassandra commitlog と data を別ディスク(または別 LV)に分離するとライト処理量が大幅に向上します。