pd — 数据湖 CLI
pd(PlantPulse DataLake)是数据湖容器内启动、停止、诊断八个服务,渲染配置和执行备份的单一入口命令。管理控制台显示的几乎所有内容都来自该命令的--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。大多数情况是查看状态和重启单个服务。
30秒速览
安全级别:读取 = 不改变任何状态 · 变更 = 改变状态 · 破坏性 = 删除数据或进程。
| 动作 | 单行说明 | 级别 |
|---|---|---|
pd status [서비스] [--wait] | 端口表。仅当所有行都为RUNNING时才退出0 | 读取 |
pd doctor | 检查环境、密钥、模板、运行时树(PASS / FAIL / N/A) | 读取 |
pd env | 该节点的目录、镜像身份 — 仅声明,无测量 | 读取 |
pd logs [--list] [--lines N] [서비스…] | 跟踪服务日志 | 读取 |
pd storage | 卷、WAL、复制槽、存储大小、Kafka保留 | 读取 |
pd retention | 表TTL、主题保留、冷存储、归档任务 | 读取 |
pd flow | Kafka消费者组延迟 | 读取 |
pd downtime | 计划外宕机期间 — 仅重启 | 读取 |
pd config list · diff · diff --templates | 模板→路径表 · 运行时vs渲染 · 主机模板vs镜像默认值 | 读取 |
pd node status · info · cql · psql … | Cassandra / PostgreSQL查询和shell | 读取 |
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 backup · pd backup run --engine E --type full|diff | 逻辑转储 · 物理备份一次 | 变更 |
pd backup schedule set|reset | 备份定时器计划 | 变更 |
pd node add · repair · compact · flush · drain … | Cassandra维护 | 变更 |
pd clean | 已停止模块的日志 · 临时文件删除 | 破坏性(日志) |
pd kill [--dry-run] | 给PP_HOME下的所有进程发送SIGKILL | 破坏性 |
pd recover [파일] | DROP pp数据库并用逻辑转储恢复 | 破坏性 |
pd backup restore … --yes | 将数据目录恢复到物理备份 | 破坏性 |
pd node cleanup · remove <host-id> | 删除快照 · 从环中移除节点 | 破坏性 |
选项集对任何动作都有相同的含义。
| 选项 | 含义 |
|---|---|
--json | 输出JSON文档而非人类可读表。这是控制台读取的格式。仅限特定动作接收,其他动作会以exit 2拒绝 |
--show-secrets | 仅config diff。不用***隐藏密码。不能与--json一起使用 |
PD_DEBUG=1 | DEBUG日志。像PD_DEBUG=1 pd start一样添加到前缀 |
服务和启动顺序
八个服务以定义的顺序启动。权威源是services/order.txt一个。pd start从上到下,pd stop为反向顺序。
| 顺序 | 服务 | MASTER | WORKER | 内部组件 | pd status行(端口) |
|---|---|---|---|---|---|
| 1 | storage | ○ | ○ | valkey → postgres → cassandra → minio(仅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(Grafana) | 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。plantpulse-sql在2026-09-07弃用,已从列表中删除。
生命周期
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有四种状态。
| 状态 | 含义 |
|---|---|
RUNNING | 端口已打开 |
STOPPED | 端口已关闭。启动后数十秒是窗口期,1分钟后重新检查 |
UNKNOWN | 无法测量 — 测量端口的工具不可用。不代表已死亡 |
DISABLED | 由PD_OPTIONS关闭。不改变退出代码 |
pd stop是exit 7,请勿立即pd startSTILL 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的六个部分:[1] inputs(密钥·节点文件·镜像)·[2] tools·[3] config templates(全部渲染)·[4] runtime tree·[5] TLS material·[6] core ports。N/A是「无法在此测量」,括号中注明原因。容器内的sidecar文件不存在是正常的 — 值通过环境变量来获取。
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时会消失。
Cassandra·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),然后修复。连接worker后在master上执行一次 |
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> | 破坏性 | 从环中移除已死亡的节点。不要在活动节点上执行 |
pd node upgrade · init-cms · train-zstd · cache-clear | 变更 | 安装步骤·版本升级·OS页缓存清除 |
备份·恢复
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,doctorFAIL计数为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事件到事件日志plantpulse-datalake-admin-api/logs/pd-events.jsonl,控制台将其显示为事件时间线。从控制台执行的命令由actor记录为operator:<name>。
旧名称对应表
plantpulse-startup的脚本集合于2026-09-03合并到pd,旧目录已不在镜像中。
| 旧脚本 | 现在 |
|---|---|
start-daemon.sh · start.sh | pd start |
stop.sh | pd stop |
restart.sh · restart-<module>.sh | pd restart [서비스] |
restart-monitor.sh | pd restart admin-api |
status.sh | pd status |
kill.sh · clean.sh | pd kill · pd clean |
configure.sh | pd config render |
log-viewer.sh | pd logs |
node-<동사>.sh · node-added.sh · node-error.sh | pd node <동사> · pd node add · pd node errors |
secrets/rotate.sh | pd secret rotate(由主机的passwd.sh调用) |
env.sh · env-reset.sh · env-validate.sh | 已移除 — 值由主机sidecar·节点文件和compose协调 |
prepare-ssl.sh | 由plantpulse-certs容器处理 → 安全配置 |
PP_OPTIONS | PD_OPTIONS(2026-09-07)。旧名称不被读取 |
服务器·批处理·仓库·OPC-UA·AASX分别在各自的容器中处理。数据湖容器内没有这些模块。从主机重启应用。
cd /opt/kopens/plantpulse-platform-docker/bin
./restart-server.sh # 또는 restart-batch.sh · restart-warehouse.sh · restart-one.sh <서비스>