跳到主要内容

故障排查

本文档介绍在通过一键式安装 / Docker 安装方式运行的 PlantPulse 平台中经常出现的问题及其解决方法。大部分问题按照下列步骤依次排查即可解决。

容器共有九个

本平台以 Docker Compose 堆栈的形式运行 —— 一个证书一次性容器(plantpulse-certsExited (0) 属正常),一个数据湖,六个应用,一个代理。不存在名为 plantpulse-platform 的容器。

请先缩小「到底是哪里出了故障」。./status.sh 会按服务分别回答 → 安装后的形态

第一步:无论遇到什么问题,请先确认以下 3 项。

cd /opt/kopens/plantpulse-platform-docker/bin
./status.sh # 容器 / health / 卷 概要
./ops-check.sh # 运行 health + critical log
./logs.sh -n 200 # 最近的容器日志(全部)

如果仍未解决,请用 ./doctor.sh 生成诊断 tarball 并转交给技术支持团队。

容器启动问题

症状:容器停留在 unhealthy 状态无法恢复

原因解决方法
Cassandra 模式迁移失败./logs.sh cassandra -n 300 确认错误后重试 ./restart.sh。反复失败时 ./doctor.sh
数据目录权限问题确认主机上的 /data1/pp-data 权限。sudo chown -R root:root /data1/pp-data && sudo chmod -R 755 /data1/pp-data
内存不足(OOMKilled)docker inspect <컨테이너> --format '{{.State.OOMKilled}}' 确认。每个容器的限制值不同 —— 数据湖为 DOCKER_DATALAKE_MEMORY,应用为 DOCKER_SERVER_MEMORY 等(环境变量
JVM warm-up 未完成启动需要 3~5 分钟。若 unhealthy 持续超过 5 分钟,请进行下一步诊断
# 어떤 서비스가 비정상인가 (0 = 정상 / 2 = 비정상)
./status.sh

# 스택 전체 준비 판정
./stack-verify-boot.sh

# 컨테이너별 메모리 / CPU
docker stats --no-stream

# 헬스체크 엔드포인트 응답 확인
curl -kfsS https://<server-ip>:4950/api/health | jq
一次性容器不是「已死的容器」

plantpulse-certs 会生成证书后自行结束,因此 Exited (0) 才是成功状态。由于 compose 明确关闭了该容器的健康检查(healthcheck: disable),health 一栏为空,正常运行的容器也不会被误判为 unhealthy。status.shops-check.sh 唯独对这个容器以退出码来判断,手动查看时也请这样判断。

症状:显示 no such service · 找不到容器

说明最初的安装尚未完成,或容器已被 ./remove.sh 删除。

如果您是按照旧版运维手册在寻找 plantpulse-platform不存在该名称的容器 —— 请以 ./status.sh./logs.sh --list 确认名称。

cd /opt/kopens/plantpulse-platform-docker/bin
./install.sh # 최초 설치
# 또는 OS 설정이 이미 끝났다면
./up.sh # 컨테이너 생성 + 기동

症状:address already in use(端口冲突)

主机上以前版本的 plantpulse 仍以 native 方式运行,或其他服务占用了该端口。

# 호스트 native plantpulse 정지
pkill -ef plantpulse

# 특정 포트 점유 프로세스 확인 (예: 7500)
ss -tlnp | grep :7500

# 충돌 프로세스를 종료한 후 재시도
./restart.sh

详细端口列表请参见端口及服务管理页面。

镜像 / 仓库问题

症状:docker pullunauthorized: authentication required

镜像仓库认证已过期或缺少凭据。

docker login docker.kopens.io
# Username/Password 입력 후
./update.sh

症状:镜像下载失败(网络)

# 1. 레지스트리 접근 가능 여부 확인
curl -fsSL https://docker.kopens.io/v2/

# 2. DNS 확인
nslookup docker.kopens.io

# 3. 회사 방화벽 / 프록시 차단 가능성 — 네트워크 관리자에게 다음 도메인 허용 요청
# docker.kopens.io, download.kopens.io

如果处于隔离网络环境,请按照 Docker 安装 页面中的隔离网络(Airgap)安装步骤操作。

数据库问题

数据库组件在容器内部运行。请通过 ./shell.sh 进入容器后再进行巡检。

PostgreSQL(元数据 DB)

作用:保存用户信息、站点设置、资产设置等平台元数据。

./shell.sh # 컨테이너 진입

# 컨테이너 내부에서
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node psql # PostgreSQL 셸 접속
psql=# SELECT 1;
psql=# SHOW max_connections;
psql=# SELECT count(*) FROM pg_stat_activity;
症状原因解决方法
Connection refusedPostgreSQL 组件宕机在容器内部执行 pd restart storage。在主机上执行 ./restart.sh
Too many connections连接池超限检查 properties 中的 connection pool 设置。若为暂时性问题,重启 storage
Authentication failed密码不一致确认 /etc/kopens/plantpulse-platform.env 中的 PP_PG_PASSWORD 与应用 properties 是否一致

路径确认 —— 密钥 sidecar 的正本只有一份 /etc/kopens/plantpulse-platform.env(权限 0600)。旧版安装中 /opt/kopens/ 下可能仍留有同名文件,但不会被读取,安装脚本会将其恢复为正本 → 环境变量参考

Cassandra(时序 DB)

作用:保存传感器时序数据、报警历史等大量数据。

./shell.sh

# 컨테이너 내부에서
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node status # 클러스터 상태
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node compactionstats # 컴팩션 진행 상태
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node cql # CQL 셸 접속
症状原因解决方法
Connection timeout节点宕机pd node status 确认节点状态后 pd restart storage
WriteTimeout写入延迟(磁盘 I/O 饱和)确认 pd node compactionstats,用 pd node compact 手动 compaction
ReadTimeout读取延迟(分区过大)pd node table-histograms 确认分区大小
磁盘空间不足SSTable 累积执行 pd node cleanup 后用 df -h /data1 确认

Valkey(Redis 缓存)

./shell.sh

# 컨테이너 내부에서
redis-cli -a "$PP_REDIS_PASSWORD" ping
redis-cli -a "$PP_REDIS_PASSWORD" INFO memory

登录 / 控制台访问问题

症状:浏览器无法访问控制台

# 1. 컨테이너 health 확인
./status.sh

# 2. 외부 노출 IP 설정 확인
grep DOCKER_PP_EXTERNAL_IP env.sh

# 3. 호스트 방화벽 확인
sudo firewall-cmd --list-ports # RHEL/Rocky/Oracle
sudo ufw status # Ubuntu

# 4. 포트 점유 확인 — 프록시가 80/443 을, 데이터레이크가 7443 을 엽니다
ss -tlnp | grep -E ':(80|443|7443)\s'
症状原因解决方法
页面无法打开plantpulse-proxy 异常./status.sh 确认代理状态。代理是接收 80/443 的唯一入口
页面无法打开防火墙拦截请求企业/云端防火墙放行 80、443、7443、4950
登录失败密码不一致确认默认 admin / admin123!。若已更改,请联系管理员重置
403 Forbidden用户权限不足请管理员确认角色(role)
会话过期30 分钟无操作自动登出重新登录

数据采集问题

数据采集路径:OPC 服务器 → 消息代理(Kafka/MQTT)→ 引擎流水线 → Cassandra。该路径中任一环节受阻,数据都无法进入。

症状:未采集到数据

检查项确认方法
OPC 连接状态在网页控制台 > 连接管理 > 状态中确认 CONNECTED
引擎状态在控制台 > 监控 > 系统状态中确认 RUNNING
流水线MPS(每秒消息数)为 0 表示接收中断
消息代理进入 ./shell.sh 后用 /opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node topic 确认 Kafka 主题
网络从 OPC 服务器向平台主机 IP 执行 ping / telnet

症状:数据延迟

原因解决方法
流水线队列积压上调 properties 中的 engine.pipeline.threads
Cassandra 写入延迟确认 pd node compactionstats,监控磁盘 I/O
Kafka lagpd node topic 确认 consumer lag
网络延迟测量 OPC 服务器 ↔ 平台主机的 RTT

性能问题

症状:控制台 / API 响应缓慢

# 호스트에서 컨테이너 자원 사용량
docker stats --no-stream

# 앱 컨테이너의 JVM 메모리 (그 앱이 도는 컨테이너 안에서)
./shell.sh plantpulse-server-web
jmap -heap $(pgrep -f plantpulse-server)
请先确定是哪个容器

六个应用分别在各自的容器中运行,因此在数据湖内查找应用进程是找不到的。请先用 ./status.sh 确认目标容器,再进入 ./shell.sh <컨테이너>

原因解决方法
容器内存不足上调该容器的限制值后 ./restart.sh —— 数据湖为 DOCKER_DATALAKE_MEMORY,应用为 DOCKER_SERVER_MEMORY 等(环境变量
JVM 内存不足调整容器内部 setenv 的堆大小(详情参见性能调优
GC 频繁分析 GC 日志,调优 G1GC 选项
DB 慢查询确认 PostgreSQL slow query 日志
主机 CPU 饱和确认 top / htop 后考虑上调 DOCKER_PP_CPUS

症状:OutOfMemoryError

# 컨테이너 내부에서 heap dump 활성화
./shell.sh
# setenv 또는 JAVA_TOOL_OPTIONS 에 -XX:+HeapDumpOnOutOfMemoryError 추가

# 생성된 hprof 를 호스트로 복사
docker cp plantpulse-datalake:/path/to/heap.hprof /tmp/

用 Eclipse MAT / VisualVM 进行分析。

报警问题

症状原因解决方法
未产生报警报警设置未部署在报警设置界面点击“部署”
报警重复产生重复检查未启用在报警设置中启用重复检查
邮件通知未发送SMTP 设置错误确认 mail.properties(容器内部 /opt/kopens/plantpulse-platform/plantpulse-server/config/
通知声音不响浏览器自动播放策略在浏览器设置中允许该网站自动播放

UI 问题

症状解决方法
界面显示异常清除浏览器缓存(Ctrl+Shift+Delete)
图表未显示在浏览器开发者工具(F12)> Console 中确认 JS 错误
实时刷新中断确认代理/防火墙的 SSE(HTTP 流式传输)缓冲、超时设置
仪表盘加载失败确认是否存在已连接的标签 / 数据源
韩文乱码确认 env.shPP_LANG=koPP_TZ=Asia/Seoul./restart.sh

磁盘 / 卷问题

症状:磁盘空间不足

# 호스트 디스크 사용량
df -h
df -h /data1 # 데이터 디스크

# Docker 사용량 (이미지 / 볼륨 / 빌드 캐시)
docker system df

# 컨테이너 내부 사용량
./shell.sh
df -h
du -sh /opt/kopens/plantpulse-platform/plantpulse-storage/db/cassandra/data
原因解决方法
旧备份累积清理 /data1/pp-backup/docker-volume 中的旧 tar.gz
Docker 未使用镜像docker system prune 清理(镜像/网络/缓存)
Cassandra SSTable 累积在容器内部执行 pd node cleanuppd node compact
日志目录膨胀清理 /opt/kopens/plantpulse-platform-docker/logs

注意docker volume prune 会删除所有未使用中的卷。为避免误删 pp-* 卷,请勿让容器处于停止状态。

症状:需要恢复卷数据

请参见运营管理 - 备份与恢复页面中的恢复步骤。

更新 / 回滚问题

症状:更新后容器无法正常运行

./update.sh 在 health 验证失败时会自动 rollback 到之前的镜像。如需手动 rollback:

# 1. 이전 버전 태그를 env.sh 에 지정
vi env.sh
# PP_IMAGE_TAG="2026.04" ← 이전 안정 버전

# 2. 업데이트 재실행
./update.sh

症状:更新过程中出现 NOT FOUND CONTAINER

说明尚未完成最初安装(./install.sh)。请先执行安装。

网络 / 集群问题

症状:worker 未能 join 到 master

# 1. 워커 컨테이너 진입 (워커는 기본 스택의 서비스가 아니라 shell.sh 로는 잡히지 않습니다)
docker exec -ti plantpulse-worker-1 /bin/bash
# 워커 내부에서 마스터 IP 로 연결 테스트
ping ${PP_MASTER_IP}

# 2. 마스터에서 링 확인 — 이것이 조인의 «유일한» 증거입니다
cd /opt/kopens/plantpulse-platform-docker/bin
./shell.sh
/opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin/pd node status

# 3. JGroups / Cassandra 포트 (7000, 7001, 7800, 7801, 9042) 방화벽 허용 확인
容器处于运行状态并不代表已加入集群

join 失败的 worker 和成功的 worker 一样会报告为正常 —— 因为容器自身的检查只确认「是否能连通 master」。2026-08-31 的实测中,一个因 Cassandra 被 OOMKilled 的 worker,其 ring 仍只有 1 个节点,却持续保持 health: starting

必须以 pd node status 的 ring 列表为准进行判定。新增 worker 时 bin/worker-add.sh 会替你完成这项确认 → 集群安装

症状:MQTT / Kafka 外部客户端连接失败

请确认主机防火墙及企业/云端防火墙已放行 1883/1884(MQTT)、9092/9093/9094(Kafka)。详细端口列表请参见端口配置信息

  • MQTT 由 plantpulse-proxy 接收。 设备只需知道这个主机名即可,即使代理迁移或改名,也无需修改设备设置。1884 为 TLS passthrough,由代理来终结 TLS。
  • Kafka 不经过代理。 因为客户端在 bootstrap 之后会用 advertised.listeners 地址重新连接 —— 如果只有 bootstrap 成功而之后悄然失败,请优先怀疑这个地址。

紧急应对

容器无响应时

cd /opt/kopens/plantpulse-platform-docker/bin

# 1. 상태 확인
docker ps -a
./status.sh

# 2. 로그에서 마지막 에러 확인
./logs.sh -n 200

# 3. 안전 재시작
./restart.sh

# 4. 위 단계로 회복 안 될 경우 진단 tarball 생성
./doctor.sh
# 생성된 tarball 을 webmaster@kopens.com 으로 전달

疑似数据损坏时

# 1. 즉시 정지 (추가 손상 방지)
./down.sh

# 2. 최신 백업 확인
ls -lh /data1/pp-backup/docker-volume/

# 3. 진단 tarball 생성 (절대 데이터를 임의로 수정하지 마세요)
./doctor.sh

# 4. 기술 지원팀 연락

数据损坏时的禁止事项:请勿自行执行 pd node repairpd node cleanup、删除 SSTable 等操作。错误的恢复操作可能扩大损坏范围。请务必与技术支持团队协商后再进行处理。

请求支持时所需的信息

若上述方法仍无法解决,请附带以下信息一并发送,以便快速分析。

项目收集方法
诊断 tarball执行 ./doctor.sh 后生成的文件
容器日志./logs.sh -n 500 > /tmp/container.log 2>&1(全部八个容器)
各模块日志./tools/copy-log-to-local.sh 的结果(/tmp/plantpulse-log/
镜像版本./stack-version.sh 输出
环境变量env.sh(密码需打码)
系统信息OS、CPU、内存、磁盘(uname -afree -hdf -h
错误信息准确的错误信息 / 浏览器控制台(F12)截图
复现步骤问题发生前所执行的操作顺序

技术支持webmaster@kopens.com

相关文档