plantpulse-storage (Speicherebene)
Aufgabe
Speicherebene für die dauerhafte Speicherung aller Daten in PlantPulse. 4 spezialisierte Engines für verschiedene Datentypen werden als einzelnes Modul zusammengefasst. Sie ist die erste in der Startsequenz von pd und fungiert als Gatekeeper – wenn sie nicht startet, werden alle nachfolgenden Dienste nicht gestartet.
| Element | Wert |
|---|---|
| Modulname | plantpulse-storage |
| Installationspfad | /opt/kopens/plantpulse-platform/plantpulse-storage/ |
| Datenspeicher | /data1/pp-data/ (PP_DATA_DIR, Volume pp-data) |
| Sicherungspfad | /data1/pp-backup/ (PP_BACKUP_DIR, Volume pp-backup) |
pd Service | storage — sowohl MASTER als auch WORKER (MinIO nur auf MASTER) |
| In der Startsequenz | valkey → postgres → cassandra → minio |
Architektur
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/
│ ├── minio/ # bin/ · logs/
│ ├── rustfs/ weedfs/ # 대안 오브젝트 스토어 — 이미지에 있지만 pd 가 기동하지 않습니다
├── graph/janusgraph/ # 그래프 DB — 이미지에 있지만 pd 가 기동하지 않습니다
└── tools/reaper/ # Cassandra Reaper — 이미지에 있지만 pd 가 기동하지 않습니다
conf/ Alle Dateien darunter sind generiert. Die einzige Stelle zum Bearbeiten ist /etc/kopens/conf/*.template auf dem Host → Konfiguration ändern
Jede Engine
Cassandra – Zeitreihen · Ereignisse
| Element | Wert |
|---|---|
| Port | 9042 (CQL) · 7000/7001 (zwischen Knoten) · 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 cluster/ Variante) |
| Advertised Address | broadcast_rpc_address — wenn 127.0.0.1 wird das Rendering abgelehnt |
Wichtigste Tabellen: pp.ts_data_points (Datenpunkte der Zeitreihen-Engine, TTL pro Zeile), pp.tm_tag_point · tm_tag_point_archive · tm_tag_point_snapshot (Tags), pp.tm_asset_data (Anlagen), pp.tw_* (Datensätze der ins Cold Tier verschobenen Daten). TTL, Kompressierungsstrategie und Größe pro Tabelle werden in pd retention angezeigt.
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 | Template | Empfehlung |
|---|---|---|
| Heap | jvm-server.options.template | 1/4 des Host-Speichers, max. 32 GB |
compaction_throughput | cassandra.yaml.template | 128 MB/s (NVMe) / 16 MB/s (HDD) |
concurrent_compactors | cassandra.yaml.template | min(코어 수, 8) |
Cassandra Reaper ist im Image tools/reaper/ enthalten, aber pd startet es nicht — es ist ein manuelles Werkzeug. Regelmäßige Repairs erfolgen über pd node repair.
PostgreSQL – Metadaten
| Element | Wert |
|---|---|
| Port | 5432 |
| Datenbank | pp (PP_DB_NAME) – daneben auch temporal · temporal_visibility · kestra · hive-metastore-230 |
| Konto | plantpulse / PP_PG_PASSWORD. Rollen temporal · hive · gravitino · kestra · replica auch 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 erstellt, und pd stimmt die Rollenkennwörter als Sidecar-Wert ab (bei jedem Start ALTER ROLE – idempotent). Daher können PostgreSQL-Konten, die nicht von Rotation-Tools verwaltet werden, wie PP_GRAVITINO_PASSWORD · PP_KESTRA_DB_PASSWORD, durch Änderung des Sidecars und Neustart geändert werden.
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 (große Installationen 500) |
max_slot_wal_keep_size | Legen Sie eine Obergrenze fest – verhindert, dass Replikations-Slots von gelöschten Workern WAL unbegrenzt halten (Image-Standard 8 GB) |
Valkey – In-Memory-Cache
| Element | Wert |
|---|---|
| Port | 6379 (Klartext) · 6380 (TLS) |
| Konto | redis (PP_REDIS_USER) / PP_REDIS_PASSWORD — requirepass |
| Konfiguration | valkey.conf.template (WORKER nutzt cluster/ Variante – replicaof als Master) |
| Protokolle | /data1/pp-data/valkey/logs/system.log – liegt unter dem Daten-Volume |
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 – Objektspeicher
| Element | Wert |
|---|---|
| Port | 9000 (S3 API – überwacht durch pd) · 9001 (Konsole – für Menschen) |
| Konto | minio (PP_MINIO_USER) / PP_MINIO_PASSWORD – injiziert via Startup env MINIO_ROOT_* |
| Standard-Bucket | plantpulse (PP_MINIO_BUCKET). Iceberg-Daten · Sicherungen · Anhänge |
| Konsole | http://<server-ip>:9001/ – Anmeldung mit den gleichen Kontowerten wie oben |
MinIO läuft nur auf dem MASTER-Knoten. Der mc Client ist im Image vorhanden, und das Startup-Skript registriert den Alias pp-minio.
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 allein unterbricht alles oben GenannteStarten Sie das gesamte Datalake über restart-datalake.sh auf dem Host neu, wenn möglich. Dies ermittelt auch abhängige Anwendungen → Starten · Beenden · Neustarten
Sicherung / Wiederherstellung
| Engine | Werkzeug | Methode |
|---|---|---|
| PostgreSQL | pgBackRest (physisch) · pg_dump (logisch) | vollständig / differenziell · Point-in-Time-Wiederherstellung |
| Cassandra | Medusa | vollständige / differentielle Snapshots |
| MinIO | mc mirror | externe S3-Replikation |
Verfahren finden Sie unter Sicherung · Wiederherstellung.
Häufig auftretende Probleme
| Symptom | Ursache | Maßnahme |
|---|---|---|
Cassandra WriteTimeout | Festplatten-I/O-Sättigung | pd node compactionstats, Durchsatz anpassen |
| Cassandra-Knoten down | Netzwerk · Festplatte · OOM | GC Pause in pd logs storage, Host dmesg |
PostgreSQL Too many connections | Connection Pool Leak | max_connections erhöhen + Anwendungs-Pool prüfen |
| WAL wächst weiter | Replikations-Slot von gelöschtem Worker | pd storage des slot.orphan → Host ops-check.sh --reclaim |
| Valkey Speicher voll | maxmemory-policy nicht gesetzt | allkeys-lru oder volatile-lru |
| MinIO Festplatte voll | Iceberg · Sicherungs-Ansammlung | Lifecycle-Richtlinie in Konsole 9001 |
| Verzögerung nach Neustart | Cassandra Warmup | Normal (3 – 5 Minuten) |
Empfohlenes Datenträger-Layout
/data1/
├── pp-data/ # 데이터 볼륨 (NVMe SSD)
│ ├── cassandra/ # SSTable · commitlog · saved_caches
│ ├── postgres/ # data · dump
│ ├── minio/
│ ├── valkey/
│ └── kafka/
├── pp-temp/
└── pp-backup/ # pgbackrest · medusa
Durch Trennung von Cassandra commitlog und data auf separate Festplatte (oder separate LV) steigt der Schreibdurchsatz erheblich.