Zum Hauptinhalt springen

pd — DataLake CLI

pd(PlantPulse DataLake) ist ein Einzeleinstiegspunkt-Befehl zum Starten · Stoppen · Diagnostizieren von acht Diensten im DataLake-Container, zum Rendern von Konfigurationen und zum Erstellen von Sicherungen. Nahezu alles, was die Verwaltungskonsole anzeigt, ist die --json-Ausgabe dieses Befehls.

ElementWert
Modulplantpulse-datalake-cli
SpeicherortIm Container /opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd (in PATH)
Auf dem Hostnicht vorhanden — muss docker exec plantpulse-datalake pd …
docker exec plantpulse-datalake pd status # 하나만 칠 때
/opt/kopens/plantpulse-platform-docker/bin/shell.sh # 여러 개 칠 때 — 셸을 열고 pd … 만 친다
Der erste Einstiegspunkt für Operatoren ist hier nicht

Das Starten/Stoppen/Neustarten der gesamten Plattform erfolgt über /opt/kopens/plantpulse-platform-docker/bin/ auf dem Hostup.sh · down.sh · restart.sh · restart-datalake.sh · status.sh. pd ist ein Werkzeug eine Ebene darunter, das die Dienste im Container verwaltet. Da der Container selbst beim Hochfahren pd start und beim Herunterfahren pd stop ausführt, müssen Operatoren pd start selten von Hand aufrufen. Meistens geht es um »Status anzeigen« und »einen Dienst neu starten«.

30-Sekunden-Zusammenfassung

Sicherheitsgrad: Lesen = ändert nichts · Ändern = ändert Status · Destruktiv = löscht Daten oder Prozesse.

VerbEine ZeileGrad
pd status [서비스] [--wait]Porttabelle. Exit 0 nur wenn alle Zeilen RUNNINGLesen
pd doctorUmgebung · Secrets · Templates · Runtime-Baum prüfen (PASS / FAIL / N/A)Lesen
pd envVerzeichnis · Image-Identität dieses Knotens — nur Deklaration, keine MessungLesen
pd logs [--list] [--lines N] [서비스…]Service-Logs verfolgenLesen
pd storageVolumen · WAL · Replikationslots · Speichergröße · Kafka-AufbewahrungLesen
pd retentionTabellen-TTL · Topic-Aufbewahrung · Cold Tier · Archive-JobsLesen
pd flowKafka Consumer Group LagLesen
pd downtimeUngeplante Ausfallzeiten — nur NeustartLesen
pd config list · diff · diff --templatesTemplate → Pfadtabelle · Runtime vs. Render · Host-Template vs. Image-DefaultsLesen
pd node status · info · cql · psqlCassandra / PostgreSQL Abfragen und ShellLesen
pd backup list · schedule · statusPhysische Backup-Sets · Timer · Aktuell laufendLesen
pd backup restore … --dry-runNur Restore-PlanLesen
pd start [서비스] · stop · restart [--clean]Nacheinander starten · in umgekehrter Reihenfolge stoppen (mit Stopp-Beweis) · beidesÄndern
pd config renderKonfigurationsartefakte tatsächlich schreibenÄndern
pd secret rotate VAR=값Credential-Rotation — vom Host aus passwd.sh aufgerufen. Nicht manuell aufrufenÄndern
pd backup · pd backup run --engine E --type full|diffLogisches Dump · physisches Backup einmaligÄndern
pd backup schedule set|resetBackup-Timer planenÄndern
pd node add · repair · compact · flush · drainCassandra-WartungÄndern
pd cleanLogs gestoppter Module · temporäre Dateien löschenDestruktiv (Logs)
pd kill [--dry-run]Alle Prozesse unter PP_HOME mit SIGKILLDestruktiv
pd recover [파일]DROP der pp Datenbank und Restore mit logischem DumpDestruktiv
pd backup restore … --yesDatenverzeichnis auf physisches Backup zurücksetzenDestruktiv
pd node cleanup · remove <host-id>Snapshots löschen · Knoten aus Ring entfernenDestruktiv

Optionssätze haben bei jedem Verb die gleiche Bedeutung.

OptionBedeutung
--jsonEin JSON-Dokument statt Tabelle für Menschen. Das Format, das die Konsole liest. Nur bestimmte Verben akzeptieren dies; wenn an andere angehängt, exit 2 ablehnen
--show-secretsNur config diff. Passwörter nicht mit *** maskieren. Kann nicht mit --json verwendet werden
PD_DEBUG=1DEBUG-Logs. Prefix wie PD_DEBUG=1 pd start

Services und Startreihenfolge

Die acht Services starten in festgelegter Reihenfolge. Die Quelle ist ein einziges services/order.txt. pd start geht von oben nach unten, pd stop in umgekehrter Reihenfolge.

ReihenfolgeServiceMASTERWORKERKomponenten darinpd status Zeile (Ports)
1storagevalkey → postgres → cassandra → minio (nur MASTER)6379 · 5432 · 9042 · 9000
2analyticsspark-master → hive → gravitino → kyuubi (WORKER: spark-worker · kyuubi)7077 · 4440 · 9083 · 19001 · 10000
3messagingkafka · mqtt (HiveMQ)9092 · 1883
4timeseriesengine (TSE) · dashboard (Grafana)7800 · 3000
5cepTomcat7400
6workflowtemporal → kestra7233 · 8233 · 8380
7data-gatewayTomcat5500
8admin-apiAdmin Console Backend4949
  • Nach dem Start jedes Service wird gewartet, bis die Healthcheck UP zurückgibt, bevor zum nächsten übergegangen wird (Limits: storage 1800 Sekunden, analytics 600 Sekunden, Rest 300 Sekunden).
  • storage und analytics sind Gatekeeper. Falls sie nicht starten, wird nicht versucht, die nachfolgenden zu starten, und exit 5. Die restlichen geben eine Warnung aus und fahren fort (am Ende exit 6).
  • timeseries ist ab 2026-09-05 nur noch MASTER. plantpulse-sql wird am 2026-09-07 eingestellt und fehlt in der Liste.

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 Status von pd status hat vier Zustände.

StatusBedeutung
RUNNINGPort ist offen
STOPPEDPort ist geschlossen. Kurz nach dem Start ist dies ein Fenster — nach 1 Minute neu prüfen
UNKNOWNnicht gemessen — Meßwerkzeug nicht vorhanden. Bedeutet nicht »tot«
DISABLEDMit PD_OPTIONS beendet. Exit-Code nicht geändert
Wenn pd stop exit 7 ist, nicht sofort pd start ausführen

STILL RUNNING bedeutet, dass der Stop nicht nachgewiesen werden konnte. Das Starten auf überlebende Prozesse führt zu Portkonflikten und Datenbeschädigung. Mit pd kill --dry-run prüfen, was noch läuft, dann mit pd kill, pd status Leerstand bestätigen, dann pd start. FORCE=1 pd start nicht verwenden.

Die Docker HEALTHCHECK des Containers selbst ruft nicht pd status auf (zu langsam und manchmal instabil). Stattdessen prüft er, ob postgres · cassandra auf echte Abfragen antworten und ob alle Ports offen sind. Deshalb ist »docker ps ist healthy, aber pd status ist STOPPED« ein Startfenster oder eine verpasste Messung, und »unhealthy, aber pd status alle RUNNING« bedeutet, dass Ports offen sind, aber auf Abfragen nicht antworten (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 · Image) · [2] tools · [3] config templates (alles gerendert?) · [4] runtime tree · [5] TLS material · [6] core ports. N/A ist »hier nicht messbar«, und der Grund steht in Klammern. Fehlende Sidecar-Dateien im Container sind normal — Werte kommen über Umgebungsvariablen.

pd flow von NA bedeutet nicht »hinterhängig«, sondern »nie gelesen«. Wenn die Spalte MEMB 0 ist, läuft der Consumer nicht. Wenn sie größer als 0 ist und das Topic leer ist, ist das normal (nichts zum Lesen). Wenn sie größer als 0 ist und das Topic Daten enthält, ist das ein echtes Warnsignal.

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 ich anpassen« befindet sich unter Konfiguration ändern. Artefakte im Container nicht direkt bearbeiten — sie verschwinden beim nächsten pd start.

Cassandra · PostgreSQL Knoten manipulieren

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
Verb (ändert)GradEine Zeile
pd node addÄndernRF des Keyspace an Anzahl lebender Knoten anpassen (max. 3) und repair durchführen. Nach Hinzufügen eines Workers einmal auf dem Master ausführen
pd node repair · repair-table <ks> <tbl>Ändern (intensiv)Datenunsicherheiten zwischen Knoten abstimmen
pd node flush · drainÄndernSchreibvorgänge aus dem Speicher auf die Festplatte. drain lehnt dann Schreibvorgänge ab, also nur vor dem Stopp
pd node compact [ks] [tbl]Ändern (intensiv)SSTable-Verdichtung
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 schreiben
pd node upgrade · init-cms · train-zstd · cache-clearÄndernInstallationsprozess · Upgrade · OS-Seiten-Cache leeren

Backup · Restore

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 befindet sich unter Backup · Restore.

Exit-Codes

CodeBedeutung
0Erfolg. status alle RUNNING, doctor FAIL count 0, config diff keine Unterschiede
1Allgemeiner Fehler · »unterscheidet sich« · »Problem vorhanden«
2Nutzungsfehler — unbekanntes Verb · Service · Option, --json abgelehnt, PP_HOME nicht angegeben
3Erforderliche Secrets fehlen — Nachricht mit allen Namen. In backup run · restore: »anderes Backup läuft bereits«
4Render-Fehler — unersetzte ${PP_*}, alle Namen aufgelistet
5Gatekeeper-Service (storage · analytics) konnte nicht starten; Start abgebrochen
6Start abgeschlossen, aber einige Services nicht bereit
7Stop nicht nachgewiesen (STILL RUNNING)
8Advertise-Adresse ist Loopback (127.0.0.1) — Render abgelehnt

Log-Format und Journal

Jede Zeile, die pd schreibt, hat ein Format — [시각] [DATALAKE-CLI] [레벨] [동사] 메시지. INFO geht zu stdout, der Rest zu stderr.

pd start · stop · restart · backup schreiben jeweils eine JSON-Zeile als Event ins Journal plantpulse-datalake-admin-api/logs/pd-events.jsonl, das die Konsole als Event-Timeline anzeigt. Von der Konsole ausgeführte Befehle werden von actor als operator:<name> protokolliert.

Altes Namen-Mapping

Die Skriptsammlung plantpulse-startup wurde am 2026-09-03 in pd zusammengeführt, und das alte Verzeichnis existiert im Image nicht mehr.

Altes SkriptJetzt
start-daemon.sh · start.shpd start
stop.shpd stop
restart.sh · restart-<module>.shpd restart [서비스]
restart-monitor.shpd restart admin-api
status.shpd status
kill.sh · clean.shpd kill · pd clean
configure.shpd config render
log-viewer.shpd logs
node-<동사>.sh · node-added.sh · node-error.shpd node <동사> · pd node add · pd node errors
secrets/rotate.shpd secret rotate (vom Host aus durch passwd.sh aufgerufen)
env.sh · env-reset.sh · env-validate.shEntfernt — Werte werden durch Host-Sidecar · Knotendateien und Compose abgestimmt
prepare-ssl.shContainer plantpulse-certs behandelt das → Sicherheitskonfiguration
PP_OPTIONSPD_OPTIONS (2026-09-07). Der alte Name wird nicht gelesen
Suchen Sie App-Neustarts-Skripte nicht im DataLake-Container

Server · Batch · Warehouse · OPC-UA · AASX werden in ihren eigenen Containern verwaltet. Der DataLake-Container hat diese Module nicht. Starten Sie Apps vom Host aus neu.

cd /opt/kopens/plantpulse-platform-docker/bin
./restart-server.sh # 또는 restart-batch.sh · restart-warehouse.sh · restart-one.sh <서비스>

Verwandte Dokumentation