plantpulse-storage (Speicherschicht)
Rolle
Dies ist die Schicht, die alle Daten von PlantPulse dauerhaft speichert. 4 spezialisierte Engines je nach Datenart werden als einzelnes Modul betrieben. In der Startreihenfolge von pd steht es an erster Stelle — der Türhüter, ohne den kein nachfolgender Dienst überhaupt versucht wird zu starten.
| Punkt | Wert |
|---|---|
| Modulname | plantpulse-storage |
| Installationspfad | /opt/kopens/plantpulse-platform/plantpulse-storage/ |
| Datenspeicherort | /data1/pp-data/ (PP_DATA_DIR, Volume pp-data) |
| Backup-Speicherort | /data1/pp-backup/ (PP_BACKUP_DIR, Volume pp-backup) |
pd Dienst | storage — sowohl MASTER als auch WORKER (RustFS nur auf MASTER) |
| In der Startreihenfolge | valkey → postgres → cassandra → rustfs |
Aufbau
Verzeichnisstruktur
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/
│ ├── rustfs/ # bin/ · lib/(rustfs · rc) · logs/
├── graph/janusgraph/ # 그래프 DB — 이미지에 있지만 pd 가 기동하지 않습니다
└── tools/reaper/ # Cassandra Reaper — 이미지에 있지만 pd 가 기동하지 않습니다
Die Dateien unter conf/ sind allesamt generierte Artefakte. Der Ort, an dem Änderungen vorgenommen werden, ist /etc/kopens/conf/*.template auf dem Host → So ändern Sie die Konfiguration
Die einzelnen Engines
Aster TSDB — Zeitreihe · Ereignisse
| Punkt | Wert |
|---|---|
| Port | 9042 (CQL) · 7000/7001 (Inter-Node) · 7099 (JMX) |
| Keyspace | pp (PP_KEYSPACE) |
| Konto | cassandra (PP_CASSANDRA_USER) / PP_CASSANDRA_PASSWORD — PasswordAuthenticator |
| Konfiguration | cassandra.yaml.template · jvm-server.options.template (WORKER nutzt die cluster/-Version) |
| Advertised Address | broadcast_rpc_address — wenn 127.0.0.1, verweigert das Rendering |
Repräsentative Tabellen: pp.ts_data_points (Datenpunkte der Zeitreihen-Engine, TTL pro Zeile), pp.tm_tag_point · tm_tag_point_archive · tm_tag_point_snapshot (Tag), pp.tm_asset_data (Anlage), pp.tw_* (Aufzeichnung der in die Cold-Tier verschobenen Daten). TTL, Kompressionsstrategie und Größe je Tabelle zeigt 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 # 파괴적 — 스냅샷 삭제
| Tuning-Punkt | Vorlage | Empfehlung |
|---|---|---|
| Heap | jvm-server.options.template | 1/4 des Host-Speichers, maximal 32GB |
compaction_throughput | cassandra.yaml.template | 128 MB/s (NVMe) / 16 MB/s (HDD) |
concurrent_compactors | cassandra.yaml.template | min(코어 수, 8) |
Aster TSDB Reaper ist im Image tools/reaper/ enthalten, wird aber nicht von pd gestartet — ein manuelles Werkzeug. Regelmäßiges Repair erfolgt über pd node repair.
PostgreSQL — Metadaten
| Punkt | Wert |
|---|---|
| Port | 5432 |
| Datenbank | pp (PP_DB_NAME) — daneben temporal · temporal_visibility · kestra · hive-metastore-230 |
| Konto | plantpulse / PP_PG_PASSWORD. Auch die Rollen temporal · hive · gravitino · kestra · replica hier |
| Authentifizierung | scram-sha-256 (pg_hba.conf.template) |
| Konfiguration | postgresql.conf.template · pg_hba.conf.template |
Beim ersten Start werden Schema und Rollen ohne Passwort angelegt, und pd gleicht die Rollen-Passwörter mit den Sidecar-Werten ab (bei jedem Start ALTER ROLE — idempotent). Deshalb genügt es bei PostgreSQL-Konten, die von Rotationswerkzeugen wie PP_GRAVITINO_PASSWORD · PP_KESTRA_DB_PASSWORD nicht verwaltet werden, den Sidecar anzupassen und neu zu starten.
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 # 논리 덤프
| Tuning-Punkt | Empfehlung |
|---|---|
shared_buffers | 25% des Host-Speichers |
effective_cache_size | 50 ~ 75% |
max_connections | 200 (bei großen Umgebungen 500) |
max_slot_wal_keep_size | Setzen Sie eine Obergrenze — verhindert, dass der Slot eines entfernten Workers das WAL unbegrenzt festhält (Image-Standard 8GB) |
Valkey — In-Memory-Cache
| Punkt | Wert |
|---|---|
| Port | 6379 (Klartext) · 6380 (TLS) |
| Konto | redis (PP_REDIS_USER) / PP_REDIS_PASSWORD — requirepass |
| Konfiguration | valkey.conf.template (WORKER nutzt die cluster/-Version — replicaof Master) |
| Log | /data1/pp-data/valkey/logs/system.log — unterhalb des Daten-Volumes |
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
RustFS — Objektspeicher
| Punkt | Wert |
|---|---|
| Port | 9000 (S3 API — überwacht durch pd) · 9001 (Konsole — vom Menschen geöffnete Oberfläche) |
| Konto | rustfs (PP_S3_USER) / PP_S3_PASSWORD — beim Start über env RUSTFS_ACCESS_KEY·RUSTFS_SECRET_KEY injiziert |
| Standard-Bucket | plantpulse (PP_S3_BUCKET). Iceberg-Daten · Backups · Anhänge |
| Konsole | http://<server-ip>:9001/ — Anmeldung mit denselben Werten wie oben |
RustFS läuft nur auf dem MASTER-Knoten. Der Client rc (rustfs/cli) ist im Image enthalten, und das Startskript registriert den Alias pp-s3 und legt den Bucket an, falls er nicht existiert.
Integrierter Betrieb
docker exec plantpulse-datalake pd status storage # 넷의 UP/DOWN
docker exec plantpulse-datalake pd restart storage # 넷 전부 — 의존하는 모든 서비스가 연결을 잃습니다
docker exec plantpulse-datalake pd storage # 볼륨 · WAL · 슬롯 · 스냅샷 · 크기
storage unterbricht alles ObigeStarten Sie nach Möglichkeit das gesamte Data Lake über restart-datalake.sh auf dem Host neu. Das berücksichtigt auch die abhängigen Anwendungen → Start · Stopp · Neustart
Backup / Wiederherstellung
| Engine | Werkzeug | Methode |
|---|---|---|
| PostgreSQL | pgBackRest (physisch) · pg_dump (logisch) | full / diff · Point-in-Time-Recovery |
| Aster TSDB | Medusa | full / diff Snapshot |
| RustFS | rc mirror | externe S3-Replikation |
Das Verfahren finden Sie unter Backup · Wiederherstellung.
Häufig auftretende Probleme
| Symptom | Ursache | Maßnahme |
|---|---|---|
Aster TSDB WriteTimeout | Disk-I/O-Sättigung | pd node compactionstats, Durchsatz anpassen |
| Aster TSDB-Knoten down | Netzwerk · Disk · OOM | GC-Pause in pd logs storage, Host dmesg |
PostgreSQL Too many connections | Connection-Pool-Leck | max_connections erhöhen + Anwendungs-Pool prüfen |
| WAL wächst kontinuierlich | Replikations-Slot eines entfernten Workers | pd storage von slot.orphan → Host ops-check.sh --reclaim |
| Valkey Speichermangel | maxmemory-policy nicht konfiguriert | allkeys-lru oder volatile-lru |
| RustFS-Disk voll | Ansammlung von Iceberg-Daten · Backups | Lifecycle-Policy in Konsole 9001 |
| Verzögerte Antwort nach Neustart | Aster TSDB Warmup | normal (3 ~ 5 Minuten) |
Empfohlenes Disk-Layout
/data1/
├── pp-data/ # 데이터 볼륨 (NVMe SSD)
│ ├── cassandra/ # SSTable · commitlog · saved_caches
│ ├── postgres/ # data · dump
│ ├── rustfs/
│ ├── valkey/
│ └── kafka/
├── pp-temp/
└── pp-backup/ # pgbackrest · medusa
Wenn Aster TSDB commitlog und data auf separaten Disks (oder separaten LVs) getrennt werden, steigt der Schreibdurchsatz deutlich.