plantpulse-messaging (Messaging-Schicht)
Rolle
Die Message-Broker-Schicht, die als Nervensystem von PlantPulse fungiert. Sie erfasst Sensordaten aus der Industrieanlage und vermittelt Ereignisse zwischen Modulen. Es gibt zwei Broker — Kafka und HiveMQ (MQTT).
| Element | Wert |
|---|---|
| Modulname | plantpulse-messaging |
| Installationspfad | /opt/kopens/plantpulse-platform/plantpulse-messaging/ |
| Datenspeicherort | /data1/pp-data/kafka/kraft_combined_logs |
pd Service | messaging — nur auf MASTER-Knoten |
| Benutzerkonto | PP_MQ_USER / PP_MQ_PASSWORD — Kafka und HiveMQ teilen denselben Wert |
Mit der Umstellung von Browser-Echtzeit-Push auf SSE wurde der STOMP-Broker aus dem Image entfernt. Die Ports 61000 / 61004 und PP_STOMP_* werden nicht mehr bereitgestellt. Wenn sie noch in alten Firewall-Regeln vorhanden sind, sollten Sie diese bereinigen.
Architektur
Kafka
Ein einzelner Broker im KRaft-Modus (ohne ZooKeeper), der auch als Controller fungiert.
| Element | Wert |
|---|---|
| Port | 9092 (SASL_PLAINTEXT) · 9093 (Controller, intern) · 9094 (SASL_SSL) |
| Authentifizierung | SASL/PLAIN — statische JAAS (config/jaas.conf). Benutzerkonto PP_MQ_USER |
| Advertised Address | PP_KAFKA_ADVERTISED_HOST — wird beim Start durch die Host-Adresse ermittelt |
| Topic-Präfix | PP_TOPIC_PREFIX (Standard pp) |
Der Broker liest genau eine Datei
plantpulse-messaging/kafka/config/kafka.properties ist die Broker-Konfiguration und wird aus /etc/kopens/conf/kafka.properties.template auf dem Host rendert. Die Dateien broker.properties · server.properties · controller.properties im selben Verzeichnis sind Beispieldateien der Apache-Kafka-Distribution und werden von niemand gelesen. Wundern Sie sich nicht, wenn Sie in den Logs des Containers Werte wie advertised.listeners=PLAINTEXT://localhost:9092 sehen.
Die entscheidenden Zeilen der Vorlage (Platzhalter werden beim Rendern gefüllt):
process.roles=broker,controller
listeners=SASL_PLAINTEXT://0.0.0.0:${PP_KAFKA_PORT},CONTROLLER://0.0.0.0:${PP_KAFKA_CONTROLLER_PORT:9093},SASL_SSL://0.0.0.0:${PP_KAFKA_TLS_PORT}
advertised.listeners=SASL_PLAINTEXT://${PP_KAFKA_ADVERTISED_HOST}:${PP_KAFKA_PORT},…
sasl.enabled.mechanisms=PLAIN
allow.everyone.if.no.acl.found=false
log.dirs=${PP_DATA_DIR}/kafka/kraft_combined_logs
log.retention.ms=3600000 # 1시간 — 버퍼이지 보관소가 아닙니다
log.segment.bytes=10485760 # 10MB
num.partitions=4
default.replication.factor=1 # 단일 브로커
message.max.bytes=157286400
auto.create.topics.enable=true
Die Standard-Aufbewahrung des Brokers beträgt 1 Stunde. Die tatsächliche Datenspeicherung erfolgt in Cassandra · Zeitreihen-Engine · Iceberg; Kafka ist nur der Puffer dazwischen. Die Aufbewahrungsdauer pro Topic und «wer hat das festgelegt» zeigt pd retention.
Wichtige Topics
Der Präfix pp (PP_TOPIC_PREFIX) wird vorangestellt. Im Folgenden sind die repräsentativen Topics aufgeführt, die vom Plattform-Code verwendet werden.
| Topic | Zweck |
|---|---|
event · event-row | Server ↔ Engine Event Bus |
pp-tag-point | Tag-Wert-Stream — wird nur gefüllt, wenn «Kafka Publishing» pro Tag aktiviert ist |
pp-tag-alarm · pp-asset-alarm · pp-asset-event | Alarm · Asset-Ereignisse |
pp-asset-data · pp-asset-aggregation · pp-asset-health-status | Asset-Daten und Aggregationen |
pp-batch | Batch-Jobs |
pp-edge-status · pp-opc-status · pp-diagnostic | Edge · OPC · Diagnose-Status |
pp-domain-changed-event | Metadatenänderungen |
pp-production-oee · pp-production-ram · pp-production-ems | Produktionskennzahlen |
Operationsbefehle
docker exec plantpulse-datalake pd status messaging # UP (advertised <address>:9092 answered ApiVersions)
docker exec plantpulse-datalake pd flow # 컨슈머 그룹별 lag
docker exec plantpulse-datalake pd node topic # 토픽 "event" describe (비밀번호 자동 주입)
docker exec plantpulse-datalake pd retention # 토픽별 보존과 세그먼트 크기
docker exec plantpulse-datalake pd restart messaging
Um die Tools der Kafka-Distribution direkt zu verwenden, müssen SASL-Anmeldedaten als Client-Konfigurationsdatei übergeben werden. pd flow · pd node topic erledigen dies für Sie — verwenden Sie diese zuerst.
Der Broker öffnet Port 9092 etwa 10 Sekunden vor dem Aktivieren der Anfrageverarbeitung. Daher prüft der Healthcheck in pd nicht den Port, sondern «ob eine ApiVersions-Anfrage an die advertised Address eine Antwort erhält». Versuchen Sie DOWN (port 9092 is bound but … did not answer) 30 Sekunden nach dem Start erneut.
Tuning-Punkte
Alle Einstellungen befinden sich in /etc/kopens/conf/kafka.properties.template und werden mit restart-datalake.sh angewendet.
| Element | Standard | Hinweise |
|---|---|---|
log.retention.ms | 1 Stunde | Verlängern Sie dies, wenn Consumer längere Zeit pausieren können. Dies verbraucht entsprechend mehr Speicherplatz |
num.partitions | 4 | Anzahl der Partitionen für neue Topics. Passen Sie dies an die Anzahl der Consumer-Threads an |
num.io.threads · num.network.threads | 8 · 3 | Bei NVMe bis zu 16 für io |
message.max.bytes | 150 MB | Großzügig für große Nachrichten (Datei-Warteschlangen) |
HiveMQ (MQTT)
Ein Standard-MQTT-Broker (Community Edition), mit dem leichte IoT-Geräte · Sensoren und Edge-Agenten verbunden sind.
| Element | Wert |
|---|---|
| Port | 1883 (Klartext) · 1884 (TLS) — ein Proxy-Container macht diese auf dem Host verfügbar und leitet an den Datalake weiter |
| Authentifizierung | Benutzername / Passwort — die Security Extension liest conf/auth.properties |
| Benutzerkonto | PP_MQ_USER / PP_MQ_PASSWORD (gleicher Wert wie Kafka) |
| Konfiguration | mqtt/conf/config.xml ← /etc/kopens/conf/hivemq.xml.template |
Der TLS-Listener verwendet den öffentlichen Keystore der Plattform (/var/security/plantpulse/master/master.keystore.jks) und erfordert keine Client-Zertifikate (NONE).
# 외부에서 발행 · 구독 (디버깅)
mosquitto_pub -h <server-ip> -p 1883 -u mq -P '<PP_MQ_PASSWORD>' -t test/topic -m "hello"
mosquitto_sub -h <server-ip> -p 1883 -u mq -P '<PP_MQ_PASSWORD>' -t 'test/#'
Protokolle
docker exec plantpulse-datalake pd logs --lines 100 messaging
| Broker | Datei |
|---|---|
| Kafka | plantpulse-messaging/kafka/logs/ |
| HiveMQ | plantpulse-messaging/mqtt/logs/hivemq.log (event.log ist ein Audit-Log auf Nachrichtenebene, das pd logs absichtlich ausschließt) |
Häufig auftretende Probleme
| Symptom | Ursache | Maßnahme |
|---|---|---|
| Clients von anderen Hosts trennen sich nach Bootstrap | Advertised Address ist interne Container-Adresse | Knotendatei PP_MASTER_IP → Wie Sie die Einstellungen ändern |
pd status messaging ist DOWN (advertises 127.0.0.1…) | Knotendatei enthält keine Adresse | Gleiche Maßnahme. Gleiche Ursache wie Render Exit 8 |
| Consumer-Lag nimmt zu | Consumer ist langsam · pausiert | pd flow Tabelle MEMB · LAG, Consumer-Container-Protokolle |
| Speicherplatz voll | Aufbewahrung erhöht, aber Consumer stoppen | Tabelle Kafka in pd retention, log.retention.ms |
| MQTT TLS Handshake schlägt fehl | Zertifikat abgelaufen · SAN fehlt | Sicherheitseinstellungen — plantpulse-certs gibt neu aus |
| Nach Rotation nur Kafka-Authentifizierung fehlgeschlagen | PP_MQ_PASSWORD ist gemeinsam für beide Broker | Mit passwd.sh PP_MQ_PASSWORD beide zusammen aktualisieren → Passwörter |
Sicherheit / Externe Exposition
| Port | Empfehlung |
|---|---|
| 9092 (Kafka SASL Klartext) | Nur privates Netzwerk |
| 9094 (Kafka SASL_SSL) | Bei externer Exposition verwenden |
| 1883 (MQTT Klartext) | Nur privates Netzwerk |
| 1884 (MQTT TLS) | Bei externer Exposition verwenden |