pd — DataLake-CLI
pd(PlantPulse DataLake) ist das einzelne Einstiegspunkt-Kommando, um im DataLake-Container acht Dienste zu starten, zu stoppen, zu diagnostizieren, Konfigurationen zu rendern und Backups zu erstellen. Fast alles, was die Verwaltungskonsole anzeigt, ist die --json-Ausgabe dieses Befehls.
| Posten | Wert |
|---|---|
| Modul | plantpulse-datalake-cli |
| Standort | Im Container unter /opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd (im PATH) |
| Auf dem Host | nicht vorhanden — unbedingt docker exec plantpulse-datalake pd … |
docker exec plantpulse-datalake pd status # 하나만 칠 때
/opt/kopens/plantpulse-platform-docker/bin/shell.sh # 여러 개 칠 때 — 셸을 열고 pd … 만 친다
Der Start/Stopp/Neustart der gesamten Plattform erfolgt über /opt/kopens/plantpulse-platform-docker/bin/ auf dem Host — up.sh · down.sh · restart.sh · restart-datalake.sh · status.sh. pd ist eine Ebene darunter und behandelt die Dienste im Container. Da der Container selbst beim Start pd start und beim Stopp pd stop ausführt, muss der Bediener pd start nur selten manuell eingeben. Meistens sind es «Status anzeigen» und «einen Dienst neu starten».
30-Sekunden-Zusammenfassung
Sicherheitsstufe: Lesen = ändert nichts · Ändern = verändert den Zustand · Destruktiv = löscht Daten oder Prozesse.
| Verb | Einzeiler | Stufe |
|---|---|---|
pd status [서비스] [--wait] | Porttabelle. Exit 0 nur, wenn alle Zeilen RUNNING | Lesen |
pd doctor | Umgebung · Secrets · Vorlagen · Laufzeitbaum prüfen (PASS / FAIL / N/A) | Lesen |
pd env | Verzeichnisse und Images dieses Knotens — nur Deklaration, keine Messung | Lesen |
pd version | Versionsnummer aus installierten Artefakten — nicht aus Konstanten dieser Datei, sondern aus jar MANIFEST | Lesen |
pd logs [--list] [--lines N] [서비스…] | Dienst-Logs mitverfolgen | Lesen |
pd storage | Volumes · WAL · Replikations-Slots · Speichergröße · Kafka-Aufbewahrung | Lesen |
pd retention | Tabellen-TTL · Topic-Aufbewahrung · Cold-Tier · Archiv-Jobs | Lesen |
pd flow | Kafka-Consumer-Group-Lag | Lesen |
pd downtime | Planmäßig tote Segmente — nur Neustart | Lesen |
pd config list · diff · diff --templates | Vorlagen → Pfad-Tabelle · Laufzeit vs. Rendering · Host-Vorlagen vs. Image-Standardwerte | Lesen |
pd config show <대상> | Rendering-Dateien, die der Dienst tatsächlich liest. Anmeldedaten werden ausgeblendet | Lesen |
pd workflow status · list · history | Zwei Workflow-Engines (Temporal · Kestra) — Engine und Poller, gehaltene Zeitpläne, letzte Ausführungen und Fehlerursachen. Nur Lesen | Lesen |
pd node status · info · cql · psql … | Aster TSDB / PostgreSQL-Abfragen und Shell | Lesen |
pd backup list · schedule · status | Physische Backup-Sets · Zeitplan-Tabelle · Was gerade läuft | Lesen |
pd backup restore … --dry-run | Nur Wiederherstellungsplan | Lesen |
pd start [서비스] · stop · restart [--clean] | In Reihenfolge starten · In umgekehrter Reihenfolge stoppen (Stopp-Nachweis) · Beides | Ändern |
pd config render | Schreibt tatsächlich Konfigurationsartefakte | Ändern |
pd secret rotate VAR=값 | Anmeldedaten-Rotation — wird vom passwd.sh des Hosts aufgerufen. Nicht direkt eingeben | Ändern |
pd secret probe-mqtt | Verbindet sich tatsächlich mit bereitgestellten Anmeldedaten zum MQTT-Broker (Validierung, die das Rotationsverfahren nutzt) | Lesen |
pd backup · pd backup run --engine E --type full|diff | Logischer Dump · Einmaliges physisches Backup | Ändern |
pd backup schedule set|reset | Quartz-Cron des Backup-Jobs und Einschalt-Schalter | Ändern |
pd node add · rf · repair · compact · flush · drain … | Aster TSDB-Wartung — beim Hinzufügen/Entfernen von Knoten die pd node rf-Reihenfolge beachten | Ändern |
pd clean | Logs angehaltener Module · Temporäre Dateien löschen | Destruktiv (Logs) |
pd kill [--dry-run] | Alle Prozesse unter PP_HOME mit SIGKILL beenden | Destruktiv |
pd recover [파일] | pp-DB DROPpen und aus logischem Dump wiederherstellen | Destruktiv |
pd backup restore … --yes | Datenverzeichnis auf physisches Backup zurücksetzen | Destruktiv |
pd node cleanup · remove <host-id> | Snapshots löschen · Knoten aus Ring entfernen | Destruktiv |
Die Optionsmenge hat für jedes Verb dieselbe Bedeutung.
| Option | Bedeutung |
|---|---|
--json | Statt Tabelle für Menschen ein JSON-Dokument. Format, das die Konsole liest. Nur bei bestimmten Verben zulässig; bei anderen führt es zu Exit 2 (abgelehnt) |
--show-secrets | Nur config diff. Passwörter werden nicht mit *** ausgeblendet. Nicht zusammen mit --json verwendbar |
PD_DEBUG=1 | DEBUG-Logs. Wie bei PD_DEBUG=1 pd start voranstellen |
Dienste und Startreihenfolge
Die acht Dienste starten in festgelegter Reihenfolge. Die verbindliche Quelle ist services/order.txt. pd start geht von oben nach unten, pd stop in umgekehrter Reihenfolge.
| Reihenfolge | Dienst | MASTER | WORKER | Komponenten darin | pd status-Zeile (Ports) |
|---|---|---|---|---|---|
| 1 | storage | ○ | ○ | valkey → postgres → cassandra → rustfs(nur MASTER) | 6379 · 5432 · 9042 · 9000 |
| 2 | analytics | ○ | ○ | spark-master → hive → gravitino → kyuubi (WORKER: spark-worker · kyuubi) | 7077 · 4440 · 9083 · 19001 · 10000 |
| 3 | messaging | ○ | — | kafka · mqtt(HiveMQ) | 9092 · 1883 |
| 4 | timeseries | ○ | — | engine(TSE) · dashboard(PlantPulse Dashboard) | 7800 · 3000 |
| 5 | cep | ○ | — | Tomcat | 7400 |
| 6 | workflow | ○ | — | temporal → kestra | 7233 · 8233 · 8380 |
| 7 | data-gateway | ○ | — | Tomcat | 5500 |
| 8 | admin-api | ○ | ○ | Verwaltungskonsolen-Backend | 4949 |
- Nach jedem Dienststart wird gewartet, bis der Healthcheck UP zurückgibt, bevor der nächste folgt (Obergrenze: storage 1800 s, analytics 600 s, übrige 300 s).
storageundanalyticssind Gatekeeper. Wenn sie nicht starten, wird der Rest nicht versucht und Exit 5 ausgegeben. Die übrigen warnen und fahren fort (am Ende Exit 6).timeseriesist ab 2026-09-05 nur noch für MASTER.
Lebenszyklus
pd status # 전체 표 — 마지막 줄 "0 STOPPED" 면 정상
pd status storage # 서비스 하나의 헬스체크
pd status storage --wait # UP 이 될 때까지 대기
pd start cep # 죽은 서비스 하나 다시 띄우기
pd stop cep # 서비스 하나 내리기 — «멈췄다» 를 증명한다 (30초 + SIGTERM 15초 + SIGKILL 10초)
pd restart cep # stop → (정지가 증명되면) 5초 → start
pd restart cep --clean # 사이에 pd clean
pd restart # 전부 — 몇 분 걸린다. storage 가 먼저 돌아온다
Der Zustand von pd status hat vier Werte.
| Zustand | Bedeutung |
|---|---|
RUNNING | Port ist offen |
STOPPED | Port ist geschlossen. Direkt nach dem Start gibt es ein Fenster von einigen zehn Sekunden; nach 1 Minute erneut prüfen |
UNKNOWN | Nicht messbar — wenn kein Werkzeug zum Portmessen vorhanden ist. Nicht tot |
DISABLED | Mit PD_OPTIONS heruntergefahren. Exit-Code wird nicht geändert |
pd stop mit Exit 7 endet, nicht sofort pd start ausführenSTILL RUNNING bedeutet, dass der Stopp nicht nachgewiesen wurde. Wenn man auf überlebenden Prozessen startet, kommt es zu Portkonflikten und Datenbeschädigung. Erst mit pd kill --dry-run prüfen, was noch übrig ist, dann pd kill und pd status verwenden, um zu bestätigen, dass alles leer ist, und dann pd start. FORCE=1 pd start nicht verwenden.
Der Docker-HEALTHCHECK des Containers selbst ruft pd status nicht auf (zu langsam und gelegentlich unzuverlässig). Stattdessen prüft er, ob postgres und cassandra auf echte Abfragen antworten und ob alle Ports offen sind. Daher ist «docker ps ist healthy, aber pd status ist STOPPED» ein Startfenster oder ein einmaliger Ausrutscher, und «unhealthy, aber pd status alle RUNNING» bedeutet, dass die Ports offen sind, aber keine Antwort auf Abfragen kommt (pd logs storage).
Diagnose
pd doctor # 여섯 절 검사. 마지막 줄 FAIL 0 이면 된다
pd env # 디렉터리 · 이미지 정체 (0.25초)
pd logs --list # 따라갈 파일 목록만
pd logs --lines 50 cep # cep 만, 마지막 50줄부터
pd storage # 볼륨 90% 이상이면 FAIL
pd retention # 왜 안 줄어드나 — TTL · 토픽 보존 · 콜드 티어
pd flow # 데이터가 안 들어온다 — 컨슈머 lag
pd downtime # 자꾸 죽는 것 같다 — 계획 밖 정지 기록
Die sechs Abschnitte von pd doctor: [1] inputs(Secrets · Knotendateien · Images) · [2] tools · [3] config templates(werden alle gerendert) · [4] runtime tree · [5] TLS material · [6] core ports. N/A bedeutet «hier nicht messbar», mit Begründung in Klammern. Dass im Container keine Sidecar-Datei vorhanden ist, ist normal — die Werte kommen über Umgebungsvariablen.
Bei pd flow bedeutet NA nicht «hinterherhinkt», sondern «nie gelesen». Wenn die MEMB-Spalte 0 ist, ist kein Consumer aktiv; ist sie größer als 0 und das Topic leer, ist das normal (nichts zu lesen); ist sie größer als 0 und im Topic liegen Daten, ist das ein echtes Verdachtssignal.
Konfiguration
pd config list # 이 모드의 템플릿 → 경로 표
pd config diff # 런타임 파일 vs 지금 렌더하면 나올 것 (0 같음 / 1 다름 / 3 시크릿 없음 / 4 렌더 실패)
pd config diff --templates # 호스트 템플릿 vs 이미지 기본값 (same / differs / local / missing)
pd config render # 실제로 쓴다 — 그 뒤 pd restart <서비스> 까지가 한 세트
Das Verfahren zum Ändern von Werten und «was muss geändert werden» steht unter Konfiguration ändern. Ändern Sie keine Artefakte im Container direkt — sie verschwinden beim nächsten pd start.
Aster TSDB · PostgreSQL-Knotenverwaltung
pd node status # nodetool status — UN 이 정상, DN 이면 죽은 노드
pd node status --json # + PostgreSQL 복제 · Valkey 복제 · 워커 명부
pd node info # 노드 상세
pd node cql # cqlsh (cassandra 계정)
pd node psql # psql (postgres OS 사용자)
pd node errors # cassandra debug.log 의 최근 WARN/ERROR
pd node topic # kafka 토픽 "event" describe
pd node tpstats | compactionstats | proxyhistograms | table-stats [ks] | table-histograms <ks> <tbl> | sstable-size <ks> <tbl> | disk
| Änderndes Verb | Stufe | Einzeiler |
|---|---|---|
pd node add | Ändern | Replikationsfaktor (RF) des Keyspace an die Anzahl lebender Knoten anpassen (max. 3) und repair. Nach dem Hinzufügen von Workern einmal auf dem Master ausführen |
pd node repair · repair-table <ks> <tbl> | Ändern (aufwendig) | Dateninkonsistenzen zwischen Knoten beheben |
pd node flush · drain | Ändern | Speicher-Schreibvorgänge auf Platte bringen. drain verweigert danach weitere Schreibvorgänge — daher nur unmittelbar vor dem Stopp |
pd node compact [ks] [tbl] | Ändern (aufwendig) | SSTable-Merge |
pd node cleanup | Destruktiv | Alle Snapshots löschen + Daten löschen, die dieser Knoten nicht mehr besitzt |
pd node remove <host-id> | Destruktiv | Toten Knoten aus dem Ring entfernen. Nicht auf lebenden Knoten anwenden. RF zuerst verringern — unten |
pd node rf [--check] [<노드수>] | Ändern | Ring neu berechnen und Replikationsfaktor (RF) aller Keyspaces an die Anzahl anpassen |
pd node upgrade · init-cms · train-zstd · cache-clear | Ändern | Installationsverfahren · Versionsupgrade · OS-Seitencache leeren |
pd node rf — Replikationsfaktor an den Ring anpassen
Beim Hinzufügen oder Entfernen von Knoten RF nicht manuell ändern. Dieses einzelne Verb berechnet den Ring neu, ermittelt den Ziel-RF und wendet ihn auf alle Keyspaces an. Je nach Richtung ist die Aufrufstelle festgelegt.
| Wann | Reihenfolge |
|---|---|
| Beim Erweitern | pd node add → pd node rf → nodetool repair |
| Beim Verkleinern | pd node rf <빠진 뒤의 노드수> → Knoten verlässt Ring → nodetool cleanup |
| Toter Knoten | pd node rf → pd node remove <host-id> |
Der defekte Zustand ist RF größer als Knotenanzahl. Wenn man zuerst verringert, gerät man nicht in diesen Zustand.
In umgekehrter Reihenfolge entsteht ein Fenster, in dem RF 3 auf einem 2-Knoten-Ring liegt, und wenn man in dieser Zeit nur einen weiteren Knoten verliert, sind QUORUM-Lese- und Schreibvorgänge vollständig kaputt. system_auth eingeschlossen — niemand kann sich mehr anmelden, um zu sehen, was passiert ist.
nodetool decommission·removenode verteilen die Bereiche des ausscheidenden Knotens auf Grundlage des aktuellen RF. Wenn man zuerst verringert, wird weniger Datenmaterial verteilt, und die verbleibenden Knoten besitzen genau so viel, wie der neue RF verlangt.
Deshalb gibt es den <노드수>-Parameter — beim Verringern des RF ist der ausscheidende Knoten noch im Ring, daher ist das Ziel «Anzahl nach dem Ausscheiden». Beim remove eines bereits toten, nicht mehr im Ring befindlichen Knotens lässt man den Parameter weg.
Ein vorübergehend ausgeschalteter Knoten senkt den RF nicht. Bei 3 Mitgliedern und 2 lebenden wird gewarnt, aber RF bleibt bei 3 — wenn der Knoten zurückkommt, ist es wie vorher.
Wenn weniger als drei Knoten vorhanden sind, ist der RF entsprechend (1 Knoten → RF 1). Wenn der dritte Knoten verbunden ist und pd node rf erneut ausgeführt wird, steigt er auf 3. Ein RF größer als die Knotenanzahl lässt alle QUORUM-Abfragen scheitern, daher wird das nicht belassen.
--check führt nur einen Neustart auspd node rf --check ändert nichts und prüft nur, ob der aktuelle RF zum Ring passt.
Wenn nicht messbar, endet es nicht mit «passt», sondern mit «nicht beurteilbar» (Exit-Code 2) — wenn der Datenzentrumsname nicht lesbar ist oder die Knotenanzahl nicht bestimmbar ist, wird nicht geraten. Denn bei falschem Namen verschwindet die Replikation unbemerkt.
Keyspaces mit einer pd unbekannten Replikationsstrategie werden nicht angefasst, sondern namentlich ausgegeben — kein stilles Übergehen.
Beim Hochskalieren repair, nach dem Herunterskalen cleanup — auch das hat Gründe. Neue Replikate starten leer, müssen also gefüllt werden (repair); nach dem Herunterskalen müssen nicht mehr besessene Bereiche verworfen werden (cleanup).
Backup · Wiederherstellung
pd backup # PostgreSQL 논리 덤프 → /data1/pp-data/postgres/dump/
pd backup list | schedule | status
pd backup run --engine postgres --type diff
pd backup restore --engine postgres --set <세트> --dry-run # 계획 먼저
pd recover [덤프파일] # pp DB 하나를 논리 덤프로 되돌림 (파괴적)
Das Verfahren steht unter Backup · Wiederherstellung.
Exit-Codes
| Code | Bedeutung |
|---|---|
| 0 | Erfolg. status alle RUNNING, doctor FAIL 0, config diff keine Differenz |
| 1 | Allgemeiner Fehler · «abweichend» · «Problem vorhanden» |
| 2 | Verwendungsfehler — unbekanntes Verb · Dienst · Option, --json abgelehnt, PP_HOME nicht angegeben |
| 3 | Erforderliche Secrets fehlen — alle Namen in der Meldung. Bei backup run · restore: «ein anderes Backup läuft» |
| 4 | Rendering-Fehler — nicht ersetzte ${PP_*}, alle Namen aufgelistet |
| 5 | Gatekeeper-Dienste (storage · analytics) nicht gestartet, Start abgebrochen |
| 6 | Start abgeschlossen, aber einige Dienste nicht bereit |
| 7 | Stopp nicht nachgewiesen (STILL RUNNING) |
| 8 | Werbe-Adresse ist Loopback (127.0.0.1) — Rendering abgelehnt |
Log-Format und Journal
Jede Zeile, die pd ausgibt, hat ein festes Format — [시각] [DATALAKE-CLI] [레벨] [동사] 메시지. INFO geht nach stdout, der Rest nach stderr.
pd start · stop · restart · backup schreiben jeweils eine JSON-Zeile in das Ereignis-Journal plantpulse-datalake-admin-api/logs/pd-events.jsonl, und die Konsole zeigt sie als Ereignis-Zeitleiste. Von der Konsole ausgeführte Befehle werden von actor als operator:<name> aufgezeichnet.
PD_OPTIONS — Komponenten gezielt ausschalten
Die Variable existiert, aber das aktuelle Compose-Stack übergibt diesen Wert nicht an die Container. Daher ist das gezielte Ausschalten von Komponenten derzeit nicht unterstützt → FAQ
Server · Batch · Warehouse · OPC-UA · AASX laufen in eigenen Containern. Im DataLake-Container sind diese Module nicht vorhanden. Apps auf dem Host neu starten.
cd /opt/kopens/plantpulse-platform-docker/bin
./restart-server.sh # 또는 restart-batch.sh · restart-warehouse.sh · restart-one.sh <서비스>
Verwandte Dokumentation
- Start · Stopp · Neustart — Beziehung zwischen Host-Verben und
pd - Logs und Health
- Konfiguration ändern