跳到主要内容

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 version从已安装内容读取的版本号 — 不是此文件的常量,而是 jar MANIFEST 中的读取
pd logs [--list] [--lines N] [서비스…]跟随服务日志读取
pd storage卷、WAL、复制槽、存储大小、Kafka 保留读取
pd retention表 TTL、主题保留、冷层、归档作业读取
pd flowKafka 消费者组延迟读取
pd downtime超出计划而宕机的区间 — 仅重新启动读取
pd config list、diff、diff --templates模板 → 路径表 · 运行时 vs 渲染 · 主机模板 vs 镜像默认值读取
pd config show <대상>服务实际读取的渲染文件。凭据会被隐藏读取
pd workflow status、list、history两个工作流引擎(Temporal、Kestra)— 引擎与轮询器,持有的调度,最近的运行与失败原因。只读读取
pd node status、info、cql、psql …Aster TSDB / 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 secret probe-mqtt使用提供的凭据实际连接 MQTT 代理(轮换过程使用的验证)读取
pd backup、pd backup run --engine E --type full|diff逻辑转储 · 一次性物理备份修改
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 [파일]DROP 掉 pp 数据库并用逻辑转储恢复破坏性
pd backup restore … --yes用物理备份将数据目录恢复破坏性
pd node cleanup、remove <host-id>删除快照、从集群中移除节点破坏性

选项集与任何动词的意义相同。

选项含义
--json生成单个 JSON 文档而非表格。控制台读取的格式。接受此选项的动词是确定的;若添加到其他动词则退出码为 2,拒绝执行
--show-secrets仅 config diff。不将密码隐藏为 ***。不能与 --json 一起使用
PD_DEBUG=1DEBUG 日志。前缀如 PD_DEBUG=1 pd start

服务与启动顺序​

八个服务按既定顺序启动。权威来源是独立的 services/order.txt。pd start 从上到下,pd stop 相反。

顺序服务MASTERWORKER内部组件pd status 行(端口)
1storage○○valkey → postgres → cassandra → rustfs(仅 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○○管理控制台后端4949
  • 每个服务启动后,等待健康检查返回 UP 再进入下一个(上限:storage 1800 秒,analytics 600 秒,其余 300 秒)。
  • storage 和 analytics 是门卫。如果它们未启动,则不再尝试后续步骤,退出码为 5。其余服务则将发出警告并继续(最后退出码为 6)。
  • 自 2026-09-05 起,timeseries 仅限 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 有四种状态。

状态含义
RUNNING端口已打开
STOPPED端口已关闭。启动后最初的几十秒是窗口期,请 1 分钟后再次查看
UNKNOWN未能测量 — 当没有端口测量工具时。不是已停止
DISABLED通过 PD_OPTIONS 关闭。不改变退出码
如果 pd stop 退出码为 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 包含六个部分:[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 时就会消失。

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修改根据存活节点数提高 keyspace RF(最大 3)并 repair。在添加 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>破坏性从集群中移除宕机节点。不要对存活节点执行。先降低 RF — 见下文
pd node rf [--check] [<노드수>]修改重新评估集群,并将**所有键空间的复制系数(RF)**调整为该数量
pd node upgrade、init-cms、train-zstd、cache-clear修改安装过程、版本升级、清除 OS 页面缓存

pd node rf — 将复制系数调整至集群​

添加或移除节点时,请勿手动修改 RF。 这一个动词会重新评估集群,计算目标 RF, 并将其应用到所有键空间。每个方向都有指定的调用位置。

时机顺序
增加时pd node add → pd node rf → nodetool repair
减少时pd node rf <빠진 뒤의 노드수> → 节点离开 → nodetool cleanup
宕机节点pd node rf → pd node remove <host-id>
先“降低” RF,再移除节点 — 顺序颠倒会导致甚至无法登录

损坏状态是 RF 大于节点数。先降低则不会进入该状态。

如果按相反顺序操作,会形成 RF 3 落在 2 节点集群的窗口,在此期间若再丢失一个节点, QUORUM 读·写将全部失败。包括 system_auth 在内 —— 任何人都无法登录查看 发生了什么。

nodetool decommission、removenode 会根据当前 RF 来转移离开节点的范围。 先降低则需转移的数据减少,剩余节点将按新 RF 所要求的那样拥有数据。

<노드수> 参数的存在正是为了此顺序 —— 降低 RF 时离开节点仍在集群中, 因此目标是“该节点移除后的数量”。对于已宕机且不在集群中的节点进行 remove 时,可以不使用参数。

RF 依据的是“成员数”而非“存活数”

因短暂关闭的节点,RF 不会降低。如果成员为 3,存活为 2,则发出警告,但 RF 保持为 3 —— 因为节点恢复后会回到原状。

如果节点少于三个,则 RF 也相应减少(1 节点 → RF 1)。当第三个节点加入并重新运行 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,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>。

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 <서비스>

相关文档​