Zum Hauptinhalt springen

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.

PostenWert
Modulplantpulse-datalake-cli
StandortIm Container unter /opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd (im PATH)
Auf dem Hostnicht vorhanden — unbedingt docker exec plantpulse-datalake pd …
docker exec plantpulse-datalake pd status # 하나만 칠 때
/opt/kopens/plantpulse-platform-docker/bin/shell.sh # 여러 개 칠 때 — 셸을 열고 pd … 만 친다
Hier ist der erste Einstiegspunkt für Betreiber nicht

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.

VerbEinzeilerStufe
pd status [서비스] [--wait]Porttabelle. Exit 0 nur, wenn alle Zeilen RUNNINGLesen
pd doctorUmgebung · Secrets · Vorlagen · Laufzeitbaum prüfen (PASS / FAIL / N/A)Lesen
pd envVerzeichnisse und Images dieses Knotens — nur Deklaration, keine MessungLesen
pd versionVersionsnummer aus installierten Artefakten — nicht aus Konstanten dieser Datei, sondern aus jar MANIFESTLesen
pd logs [--list] [--lines N] [서비스…]Dienst-Logs mitverfolgenLesen
pd storageVolumes · WAL · Replikations-Slots · Speichergröße · Kafka-AufbewahrungLesen
pd retentionTabellen-TTL · Topic-Aufbewahrung · Cold-Tier · Archiv-JobsLesen
pd flowKafka-Consumer-Group-LagLesen
pd downtimePlanmäßig tote Segmente — nur NeustartLesen
pd config list · diff · diff --templatesVorlagen → Pfad-Tabelle · Laufzeit vs. Rendering · Host-Vorlagen vs. Image-StandardwerteLesen
pd config show <대상>Rendering-Dateien, die der Dienst tatsächlich liest. Anmeldedaten werden ausgeblendetLesen
pd workflow status · list · historyZwei Workflow-Engines (Temporal · Kestra) — Engine und Poller, gehaltene Zeitpläne, letzte Ausführungen und Fehlerursachen. Nur LesenLesen
pd node status · info · cql · psql …Aster TSDB / PostgreSQL-Abfragen und ShellLesen
pd backup list · schedule · statusPhysische Backup-Sets · Zeitplan-Tabelle · Was gerade läuftLesen
pd backup restore … --dry-runNur WiederherstellungsplanLesen
pd start [서비스] · stop · restart [--clean]In Reihenfolge starten · In umgekehrter Reihenfolge stoppen (Stopp-Nachweis) · BeidesÄndern
pd config renderSchreibt tatsächlich KonfigurationsartefakteÄndern
pd secret rotate VAR=값Anmeldedaten-Rotation — wird vom passwd.sh des Hosts aufgerufen. Nicht direkt eingebenÄndern
pd secret probe-mqttVerbindet sich tatsächlich mit bereitgestellten Anmeldedaten zum MQTT-Broker (Validierung, die das Rotationsverfahren nutzt)Lesen
pd backup · pd backup run --engine E --type full|diffLogischer Dump · Einmaliges physisches BackupÄndern
pd backup schedule set|resetQuartz-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 cleanLogs angehaltener Module · Temporäre Dateien löschenDestruktiv (Logs)
pd kill [--dry-run]Alle Prozesse unter PP_HOME mit SIGKILL beendenDestruktiv
pd recover [파일]pp-DB DROPpen und aus logischem Dump wiederherstellenDestruktiv
pd backup restore … --yesDatenverzeichnis auf physisches Backup zurücksetzenDestruktiv
pd node cleanup · remove <host-id>Snapshots löschen · Knoten aus Ring entfernenDestruktiv

Die Optionsmenge hat für jedes Verb dieselbe Bedeutung.

OptionBedeutung
--jsonStatt 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-secretsNur config diff. Passwörter werden nicht mit *** ausgeblendet. Nicht zusammen mit --json verwendbar
PD_DEBUG=1DEBUG-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.

ReihenfolgeDienstMASTERWORKERKomponenten darinpd status-Zeile (Ports)
1storage○○valkey → postgres → cassandra → rustfs(nur MASTER)6379 · 5432 · 9042 · 9000
2analytics○○spark-master → hive → gravitino → kyuubi (WORKER: spark-worker · kyuubi)7077 · 4440 · 9083 · 19001 · 10000
3messaging○—kafka · mqtt(HiveMQ)9092 · 1883
4timeseries○—engine(TSE) · dashboard(PlantPulse Dashboard)7800 · 3000
5cep○—Tomcat7400
6workflow○—temporal → kestra7233 · 8233 · 8380
7data-gateway○—Tomcat5500
8admin-api○○Verwaltungskonsolen-Backend4949
  • 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).
  • storage und analytics sind Gatekeeper. Wenn sie nicht starten, wird der Rest nicht versucht und Exit 5 ausgegeben. Die übrigen warnen und fahren fort (am Ende Exit 6).
  • timeseries ist 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.

ZustandBedeutung
RUNNINGPort ist offen
STOPPEDPort ist geschlossen. Direkt nach dem Start gibt es ein Fenster von einigen zehn Sekunden; nach 1 Minute erneut prüfen
UNKNOWNNicht messbar — wenn kein Werkzeug zum Portmessen vorhanden ist. Nicht tot
DISABLEDMit PD_OPTIONS heruntergefahren. Exit-Code wird nicht geändert
Wenn pd stop mit Exit 7 endet, nicht sofort pd start ausführen

STILL 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 VerbStufeEinzeiler
pd node addÄndernReplikationsfaktor (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ÄndernSpeicher-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 cleanupDestruktivAlle Snapshots löschen + Daten löschen, die dieser Knoten nicht mehr besitzt
pd node remove <host-id>DestruktivToten Knoten aus dem Ring entfernen. Nicht auf lebenden Knoten anwenden. RF zuerst verringern — unten
pd node rf [--check] [<노드수>]ÄndernRing neu berechnen und Replikationsfaktor (RF) aller Keyspaces an die Anzahl anpassen
pd node upgrade · init-cms · train-zstd · cache-clearÄndernInstallationsverfahren · 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.

WannReihenfolge
Beim Erweiternpd node add → pd node rf → nodetool repair
Beim Verkleinernpd node rf <빠진 뒤의 노드수> → Knoten verlässt Ring → nodetool cleanup
Toter Knotenpd node rf → pd node remove <host-id>
RF «zuerst» verringern, dann Knoten entfernen — sonst scheitert sogar der Login

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.

RF zählt die «Mitgliederzahl», nicht «lebende Anzahl»

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 aus

pd 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​

CodeBedeutung
0Erfolg. status alle RUNNING, doctor FAIL 0, config diff keine Differenz
1Allgemeiner Fehler · «abweichend» · «Problem vorhanden»
2Verwendungsfehler — unbekanntes Verb · Dienst · Option, --json abgelehnt, PP_HOME nicht angegeben
3Erforderliche Secrets fehlen — alle Namen in der Meldung. Bei backup run · restore: «ein anderes Backup läuft»
4Rendering-Fehler — nicht ersetzte ${PP_*}, alle Namen aufgelistet
5Gatekeeper-Dienste (storage · analytics) nicht gestartet, Start abgebrochen
6Start abgeschlossen, aber einige Dienste nicht bereit
7Stopp nicht nachgewiesen (STILL RUNNING)
8Werbe-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

Suchen Sie das App-Neustart-Skript nicht im Container

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​