plantpulse-storage(存储层)
作用
这是永久存储 PlantPulse 所有数据的层。它根据数据类型,将 4 个专业化引擎整合为一个模块进行运营。在 pd 的启动顺序中是第一个,如果它不启动,后面的所有服务将不会尝试,它是守门人。
| 项目 | 值 |
|---|---|
| 模块名 | plantpulse-storage |
| 安装路径 | /opt/kopens/plantpulse-platform/plantpulse-storage/ |
| 数据位置 | /data1/pp-data/ (PP_DATA_DIR,卷 pp-data) |
| 备份位置 | /data1/pp-backup/ (PP_BACKUP_DIR,卷 pp-backup) |
pd 服务 | storage — MASTER · WORKER 两者(RustFS 仅 MASTER) |
| 在启动顺序中 | valkey → postgres → cassandra → rustfs |
组成
目录结构
plantpulse-storage/
├── cache/valkey/ # conf/valkey.conf (생성물) · 로그는 /data1/pp-data/valkey/logs
├── db/
│ ├── cassandra/ # bin/ (cqlsh · nodetool) · conf/cassandra.yaml · jvm-server.options (생성물) · logs/
│ └── postgres/ # bin/ (psql · pg_ctl) · conf/postgresql.conf · pg_hba.conf (생성물) · logs/
├── object/
│ ├── rustfs/ # bin/ · lib/(rustfs · rc) · logs/
├── graph/janusgraph/ # 그래프 DB — 이미지에 있지만 pd 가 기동하지 않습니다
└── tools/reaper/ # Cassandra Reaper — 이미지에 있지만 pd 가 기동하지 않습니다
conf/ 以下文件全部是生成物。修改的地方是主机的 /etc/kopens/conf/*.template → 更改设置的方法
各引擎
Aster TSDB — 时序 · 事件
| 项目 | 值 |
|---|---|
| 端口 | 9042 (CQL) · 7000/7001 (节点间) · 7099 (JMX) |
| 键空间 | pp (PP_KEYSPACE) |
| 账户 | cassandra (PP_CASSANDRA_USER) / PP_CASSANDRA_PASSWORD — PasswordAuthenticator |
| 设置 | cassandra.yaml.template · jvm-server.options.template (WORKER 是 cluster/ 版) |
| 广播地址 | broadcast_rpc_address — 如果是 127.0.0.1 则渲染器将拒绝 |
代表性表:pp.ts_data_points(时序引擎的数据点,每行 TTL)、pp.tm_tag_point · tm_tag_point_archive · tm_tag_point_snapshot(标签)、pp.tm_asset_data(资产)、pp.tw_*(移至冷层的记录)。各表的 TTL · 压缩策略 · 大小由 pd retention 显示。
docker exec plantpulse-datalake pd node status # 링 상태 — UN 이 정상
docker exec plantpulse-datalake pd node cql # cqlsh
docker exec plantpulse-datalake pd node errors # 최근 WARN/ERROR
docker exec plantpulse-datalake pd node compactionstats
docker exec plantpulse-datalake pd node repair # 무겁습니다
docker exec plantpulse-datalake pd node cleanup # 파괴적 — 스냅샷 삭제
| 调优点 | 模板 | 推荐 |
|---|---|---|
| 堆 | jvm-server.options.template | 主机内存的 1/4,最大 32GB |
compaction_throughput | cassandra.yaml.template | 128 MB/s (NVMe) / 16 MB/s (HDD) |
concurrent_compactors | cassandra.yaml.template | min(코어 수, 8) |
Aster TSDB Reaper 在镜像 tools/reaper/ 中,但它是 pd 不启动的手动工具。定期 repair 通过 pd node repair 进行。
PostgreSQL — 元数据
| 项目 | 值 |
|---|---|
| 端口 | 5432 |
| 数据库 | pp (PP_DB_NAME) — 除此之外 temporal · temporal_visibility · kestra · hive-metastore-230 |
| 账户 | plantpulse / PP_PG_PASSWORD. 角色 temporal · hive · gravitino · kestra · replica 也在此 |
| 认证 | scram-sha-256 (pg_hba.conf.template) |
| 设置 | postgresql.conf.template · pg_hba.conf.template |
首次启动时,模式与角色会无密码创建,pd 以 sidecar 值对齐角色密码(每次启动都ALTER ROLE — 幂等)。因此,像 PP_GRAVITINO_PASSWORD · PP_KESTRA_DB_PASSWORD 这样轮换工具不处理的 PostgreSQL 账户,只需修改 sidecar 并重新启动即可。
docker exec -it plantpulse-datalake pd node psql # postgres OS 사용자로 psql
docker exec plantpulse-datalake pd storage # WAL · 복제 슬롯 · max_slot_wal_keep_size
docker exec plantpulse-datalake pd backup # 논리 덤프
| 调优点 | 推荐 |
|---|---|
shared_buffers | 主机内存的 25% |
effective_cache_size | 50 ~ 75% |
max_connections | 200(大规模 500) |
max_slot_wal_keep_size | 设置上限 — 防止被移除的工作器的槽位无限占用 WAL(镜像默认 8GB) |
Valkey — 内存缓存
| 项目 | 值 |
|---|---|
| 端口 | 6379 (明文) · 6380 (TLS) |
| 账户 | redis (PP_REDIS_USER) / PP_REDIS_PASSWORD — requirepass |
| 设置 | valkey.conf.template (WORKER 是 cluster/ 版 — replicaof 主节点) |
| 日志 | /data1/pp-data/valkey/logs/system.log — 位于数据卷下 |
docker exec -it plantpulse-datalake bash -c '"$PP_HOME/tools/valkey/bin/valkey-cli" -h 127.0.0.1 -a "$PP_REDIS_PASSWORD"'
> INFO memory
> CONFIG GET maxmemory
RustFS — 对象存储
| 项目 | 值 |
|---|---|
| 端口 | 9000 (S3 API — pd 监控) · 9001 (控制台 — 人打开的界面) |
| 账户 | rustfs (PP_S3_USER) / PP_S3_PASSWORD — 通过启动环境变量 RUSTFS_ACCESS_KEY·RUSTFS_SECRET_KEY 注入 |
| 默认存储桶 | plantpulse (PP_S3_BUCKET). Iceberg 数据 · 备份 · 附件 |
| 控制台 | http://<server-ip>:9001/ — 登录使用与上述账户相同的值 |
RustFS 仅在主节点上启动。客户端 rc(rustfs/cli)在镜像中,启动脚本注册 pp-s3 别名后,如果没有存储桶则创建。
集成运营
docker exec plantpulse-datalake pd status storage # 넷의 UP/DOWN
docker exec plantpulse-datalake pd restart storage # 넷 전부 — 의존하는 모든 서비스가 연결을 잃습니다
docker exec plantpulse-datalake pd storage # 볼륨 · WAL · 슬롯 · 스냅샷 · 크기
storage 会中断以上所有内容如有可能,请通过主机的 restart-datalake.sh 重启整个数据湖。它还会评估依赖应用 → 启动 · 停止 · 重启
备份 / 恢复
| 引擎 | 工具 | 方式 |
|---|---|---|
| PostgreSQL | pgBackRest(物理) · pg_dump(逻辑) | full / diff · 时间点恢复 |
| Aster TSDB | Medusa | full / diff 快照 |
| RustFS | rc mirror | 外部 S3 复制 |
步骤见备份 · 恢复。
常见问题
| 症状 | 原因 | 措施 |
|---|---|---|
Aster TSDB WriteTimeout | 磁盘 I/O 饱和 | pd node compactionstats,调整吞吐量 |
| Aster TSDB 节点宕机 | 网络 · 磁盘 · OOM | pd logs storage 的 GC 暂停,主机 dmesg |
PostgreSQL Too many connections | 连接池泄漏 | max_connections 调高 + 检查应用程序连接池 |
| WAL 持续增长 | 已移除工作器的复制槽 | pd storage 的 slot.orphan → 主机 ops-check.sh --reclaim |
| Valkey 内存不足 | maxmemory-policy 未设置 | allkeys-lru 或 volatile-lru |
| RustFS 磁盘已满 | Iceberg · 备份累积 | 在控制台 9001 设置生命周期策略 |
| 重启后响应延迟 | Aster TSDB 预热 | 正常(3 ~ 5 分钟) |
磁盘布局推荐
/data1/
├── pp-data/ # 데이터 볼륨 (NVMe SSD)
│ ├── cassandra/ # SSTable · commitlog · saved_caches
│ ├── postgres/ # data · dump
│ ├── rustfs/
│ ├── valkey/
│ └── kafka/
├── pp-temp/
└── pp-backup/ # pgbackrest · medusa
如果将 Aster TSDB commitlog 与 data 分离到单独的磁盘(或单独的 LV),写入吞吐量会显著提升。