pd — データレイク CLI
pd(PlantPulse DataLake)は、データレイクコンテナ内で8つのサービスを起動・停止・診断し、設定をレンダリングし、バックアップを取るための単一エントリポイントコマンドです。管理コンソールが表示するほぼすべてのものが、このコマンドの --json 出力です。
| 項目 | 値 |
|---|---|
| モジュール | plantpulse-datalake-cli |
| 場所 | コンテナ内の /opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd (PATH にあり) |
| ホストには | ありません — 必ず docker exec plantpulse-datalake pd … を使用 |
docker exec plantpulse-datalake pd status # 하나만 칠 때
/opt/kopens/plantpulse-platform-docker/bin/shell.sh # 여러 개 칠 때 — 셸을 열고 pd … 만 친다
プラットフォーム全体の起動・停止・再起動は、ホストの /opt/kopens/plantpulse-platform-docker/bin/ で行います — up.sh · down.sh · restart.sh · restart-datalake.sh · status.sh です。pd はその一段下、コンテナ内のサービスを扱うツールです。コンテナ自体も起動時に pd start、停止時に pd stop を実行するため、オペレーターが pd start を手動で実行することはまれです。 大半は「状態表示」と「サービス1つの再起動」です。
30秒要約
安全レベル: 読み取り = 何も変更しない · 変更 = 状態を変更する · 破壊的 = データやプロセスを削除する。
| 動詞 | 一言説明 | レベル |
|---|---|---|
pd status [서비스] [--wait] | ポート表。全行が RUNNING のときのみ exit 0 | 読み取り |
pd doctor | 環境・シークレット・テンプレート・ランタイムツリーを検査 (PASS / FAIL / N/A) | 読み取り |
pd env | このノードのディレクトリ・イメージの正体 — 宣言のみ、測定なし | 読み取り |
pd version | インストール済みのものから読み取ったバージョン番号 — このファイルの定数ではなく jar の MANIFEST から | 読み取り |
pd logs [--list] [--lines N] [서비스…] | サービスのログを追跡 | 読み取り |
pd storage | ボリューム・WAL・レプリケーションスロット・ストレージサイズ・Kafka 保持期間 | 読み取り |
pd retention | テーブルの TTL・トピック保持期間・コールドティア・アーカイブジョブ | 読み取り |
pd flow | Kafka コンシューマーグループの lag | 読み取り |
pd downtime | 計画外で停止していた区間 — 再起動のみ | 読み取り |
pd config list · diff · diff --templates | テンプレート → パス表・ランタイム vs レンダリング・ホストテンプレート vs イメージデフォルト | 読み取り |
pd config show <대상> | サービスが実際に読むレンダリング済みファイル。資格情報は伏せられます | 読み取り |
pd workflow status · list · history | ワークフローエンジン2つ (Temporal · Kestra) — エンジンとポーラー、保持しているスケジュール、最近の実行と失敗理由。読み取り専用 | 読み取り |
pd node status · info · cql · psql … | Aster TSDB / PostgreSQL のクエリとシェル | 読み取り |
pd backup list · schedule · status | 物理バックアップセット・スケジュール表・現在実行中のもの | 読み取り |
pd backup restore … --dry-run | 復元計画のみ | 読み取り |
pd start [서비스] · stop · restart [--clean] | 順番に起動・逆順に停止 (停止証明)・両方 | 変更 |
pd config render | 設定生成物を実際に書き込む | 変更 |
pd secret rotate VAR=값 | 資格情報のローテーション — ホストの passwd.sh が呼び出します。 直接実行しないでください | 変更 |
pd secret probe-mqtt | 与えられた資格情報で MQTT ブローカーに実際に接続してみる (ローテーション手順が使用する検証) | 読み取り |
pd backup · pd backup run --engine E --type full|diff | 論理ダンプ・物理バックアップを1回実行 | 変更 |
pd backup schedule set|reset | バックアップジョブの Quartz cron と有効スイッチ | 変更 |
pd node add · rf · repair · compact · flush · drain … | Aster TSDB メンテナンス — ノードを追加・削除する際は pd node rf の順序を守ってください | 変更 |
pd clean | 停止したモジュールのログ・一時ファイルの削除 | 破壊的 (ログ) |
pd kill [--dry-run] | PP_HOME 配下のプロセスすべてに SIGKILL | 破壊的 |
pd recover [파일] | pp DB を DROP し、論理ダンプで復元 | 破壊的 |
pd backup restore … --yes | データディレクトリを物理バックアップで復元 | 破壊的 |
pd node cleanup · remove <host-id> | スナップショット削除・リンクからのノード削除 | 破壊的 |
オプションセットはどの動詞でも同じ意味です。
| オプション | 意味 |
|---|---|
--json | 人間向けの表の代わりに JSON ドキュメント1つ。コンソールが読む形式。受け取る動詞が決まっており、他の動詞に付けると exit 2 で拒否 |
--show-secrets | config diff のみ。パスワードを *** で隠さない。--json と併用不可 |
PD_DEBUG=1 | DEBUG ログ。PD_DEBUG=1 pd start のように前置する |
サービスと起動順序
8つのサービスは決められた順序で起動します。正本は services/order.txt 1つです。pd start は上から下へ、pd stop は逆順です。
| 順序 | サービス | MASTER | WORKER | 内部コンポーネント | pd status 行 (ポート) |
|---|---|---|---|---|---|
| 1 | storage | ○ | ○ | valkey → postgres → cassandra → rustfs (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 | ○ | ○ | 管理コンソールバックエンド | 4949 |
- 各サービスを起動した後、ヘルスチェックが UP を返すまで待ってから次に進みます (上限: storage 1800秒、analytics 600秒、その他 300秒)。
storageとanalyticsはゲートキーパーです。起動しない場合は後続を試みず exit 5。それ以外は警告して続行 (最後に exit 6)。timeseriesは 2026-09-05 から MASTER 専用です。
ライフサイクル
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 가 먼저 돌아온다
pd status の状態は4つです。
| 状態 | 意味 |
|---|---|
RUNNING | ポートが開いている |
STOPPED | ポートが閉じている。起動直後の数十秒はウィンドウなので、1分後に再確認する |
UNKNOWN | 測定できなかった — ポートを測定するツールがない場合。停止しているわけではない |
DISABLED | PD_OPTIONS で停止した。終了コードは変更しない |
pd stop が exit 7 の場合、すぐに pd start しないでくださいSTILL RUNNING は停止を証明できなかったという意味です。生き残ったプロセスの上に起動すると、ポート競合・データ破損が発生します。pd kill --dry-run で何が残っているかを確認し、pd kill、pd status で空になったことを確認してから pd start を実行してください。FORCE=1 pd start は使用しないでください。
コンテナ自体の Docker HEALTHCHECK は pd status を呼び出しません (遅く、時々不安定なため)。代わりに postgres・cassandra が実際のクエリに応答するかと、全ポートが開いているかを確認します。したがって、「docker ps は healthy だが pd status は STOPPED」は起動ウィンドウか一時的なずれであり、「unhealthy だが pd status はすべて RUNNING」の場合はポートは開いているがクエリに応答できない状態です (pd logs storage)。
診断
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 # 자꾸 죽는 것 같다 — 계획 밖 정지 기록
pd doctor の6つのセクション: [1] inputs (シークレット・ノードファイル・イメージ) · [2] tools · [3] config templates (すべてレンダリングされるか) · [4] runtime tree · [5] TLS material · [6] core ports。N/A は「ここでは測定できない」で、括弧に理由が付きます。コンテナ内でサイドカーファイルがないのは正常です — 値は環境変数で渡されます。
pd flow の NA は「遅れている」ではなく**「一度も読み取ったことがない」です。MEMB 列が 0 の場合はコンシューマーが起動していないこと、0 より大きくトピックが空の場合は正常 (読むものがない)、0 より大きくトピックにデータがある場合は本当の疑わしいシグナル**です。
設定
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 <서비스> 까지가 한 세트
値を変更する手順と「どこを修正すべきか」は設定変更方法にあります。コンテナ内の生成物を直接編集しないでください — 次の pd start で消えます。
Aster TSDB · PostgreSQL ノード操作
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
| 変更する動詞 | レベル | 一言説明 |
|---|---|---|
pd node add | 変更 | 生存ノード数に合わせてキースペースの RF を上げ (最大3)、 repair を実行。ワーカーを接続した後、マスターで1回実行 |
pd node repair · repair-table <ks> <tbl> | 変更 (重い) | ノード間のデータ不整合を修正 |
pd node flush · drain | 変更 | メモリ内の書き込みをディスクへフラッシュ。drain はその後の書き込みを拒否するため、停止直前のみ |
pd node compact [ks] [tbl] | 変更 (重い) | SSTable のマージ |
pd node cleanup | 破壊的 | 全スナップショット削除 + このノードがもはや所有しないデータの削除 |
pd node remove <host-id> | 破壊的 | 死んだノードをリンクから削除。生存ノードに対して実行してはいけない。RF を先に下げる — 下記参照 |
pd node rf [--check] [<노드수>] | 変更 | リンクを再計算し、全キースペースの複製係数 (RF) をその数に合わせる |
pd node upgrade · init-cms · train-zstd · cache-clear | 変更 | インストール手順・バージョンアップ・OS ページキャッシュのクリア |
pd node rf — 複製係数をリンクに合わせる
ノードを追加・削除する際に RF を手動で修正しないでください。 この1つの動詞がリンクを再計算し、目標 RF を算出し、すべてのキースペースに適用します。方向ごとに呼び出す場所が決まっています。
| タイミング | 順序 |
|---|---|
| 増やすとき | pd node add → pd node rf → nodetool repair |
| 減らすとき | pd node rf <빠진 뒤의 노드수> → ノードが離脱 → nodetool cleanup |
| 死んだノード | pd node rf → pd node remove <host-id> |
壊れた状態は RF がノード数より大きいことです。先に下げればその状態には入りません。
逆の順序で行うと RF 3 が2ノードリンクに載る窓が生じ、その間にノードを1つでも失うと
QUORUM 読み取り・書き込みがすべて壊れます。system_auth も含まれるため — 誰もログインして
何が起きたのか見ることすらできません。
nodetool decommission·removenode は離脱ノードのレンジを現在の RF 基準でストリームします。
先に下げればストリームするデータが減り、残ったノードが新しい RF が示す量だけを
所有するようになります。
<노드수> 引数がある理由がこの順序です — RF を減らすとき 離脱ノードがまだリンク内に
いるため、目標は「そのノードが離脱した後の数」です。すでに死んでリンク外のノードを remove
する場合は、引数なしで構いません。
一時的に停止しているノードが原因で RF は下がりません。メンバー3で生存が2の場合、 警告を出力しつつ RF は3のままにします — ノードが戻れば元通りだからです。
ノードが3未満の場合、RF もその数になります (1ノード → RF 1)。3番目のノードが接続し pd node rf
を再実行すると3に上がります。 ノード数より大きい RF はすべての QUORUM クエリを失敗させるため、
そのままにはしません。
--check は再確認のみ行いますpd node rf --check は何も変更せず、現在の RF がリンクに合っているかだけを確認します。
測定できない場合は「合っている」ではなく「判定不能」で終了します (終了コード 2) — データセンター名を
読み取れない、またはノード数を数えられない場合は推測しません。 名前を誤って指定すると複製が
静かに消えるためです。
pd が知らない複製戦略を使用するキースペースは触らずに名前を表示します —
静かにスキップしません。
増やすときに repair、減らした後に cleanup であるのも理由があります。新しい複製は空の状態で
開始するため、満たす必要があり (repair)、減らした後はもはや所有しないレンジを破棄する必要が
あります (cleanup)。
バックアップ・復元
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 하나를 논리 덤프로 되돌림 (파괴적)
手順はバックアップ・復元にあります。
終了コード
| コード | 意味 |
|---|---|
| 0 | 成功。status はすべて RUNNING、doctor は FAIL 0、config diff は差分なし |
| 1 | 一般的な失敗・「異なる」・「問題がある」 |
| 2 | 使用法エラー — 不明な動詞・サービス・オプション、--json 拒否、PP_HOME 未指定 |
| 3 | 必須シークレットの欠落 — メッセージに名前をすべて記載。backup run · restore では「別のバックアップが実行中」 |
| 4 | レンダリング失敗 — 置換されていない ${PP_*}、名前をすべて列挙 |
| 5 | ゲートキーパーサービス (storage · analytics) が起動しないため起動中止 |
| 6 | 起動は完了したが、一部サービスが準備完了でない |
| 7 | 停止を証明できなかった (STILL RUNNING) |
| 8 | 広告アドレスがループバック (127.0.0.1) — レンダリング拒否 |
ログ形式とジャーナル
pd が出力するすべての行は同じ形式です — [시각] [DATALAKE-CLI] [레벨] [동사] 메시지。INFO は stdout、それ以外は stderr に出力されます。
pd start · stop · restart · backup は JSON を1行ずつイベントジャーナル plantpulse-datalake-admin-api/logs/pd-events.jsonl に記録し、コンソールがそれをイベントタイムラインとして表示します。コンソールで実行したコマンドは actor が operator:<name> として記録します。
PD_OPTIONS — コンポーネントを選択して停止
変数はありますが、現在の compose スタックはこの値をコンテナに渡しません。 したがって、現時点では コンポーネントを選択して停止する構成はサポートされていません → FAQ
サーバー・バッチ・ウェアハウス・OPC-UA・AASX はそれぞれのコンテナで実行されます。データレイクコンテナにはそのモジュールがありません。アプリはホストで再起動してください。
cd /opt/kopens/plantpulse-platform-docker/bin
./restart-server.sh # 또는 restart-batch.sh · restart-warehouse.sh · restart-one.sh <서비스>