plantpulse-messaging (Messaging-Ebene)
Rolle
Dies ist die Message-Broker-Ebene, die als Nervensystem von PlantPulse fungiert. Sie erfasst Sensordaten aus der industriellen Vor-Ort-Umgebung und leitet Ereignisse zwischen den Modulen weiter. Es gibt zwei Broker: Kafka und HiveMQ (MQTT).
| Punkt | Wert |
|---|---|
| Modulname | plantpulse-messaging |
| Installationspfad | /opt/kopens/plantpulse-platform/plantpulse-messaging/ |
| Datenverzeichnis | /data1/pp-data/kafka/kraft_combined_logs |
pd-Dienst | messaging — nur auf dem MASTER-Knoten |
| Konto | PP_MQ_USER / PP_MQ_PASSWORD — Kafka und HiveMQ teilen sich denselben Wert |
Mit dem Wechsel des Browser-Echtzeit-Pushs auf SSE wurde der STOMP-Broker aus dem Image entfernt. Die Ports 61000 / 61004 und PP_STOMP_* werden nicht mehr bedient. Entfernen Sie veraltete Firewall-Regeln, falls diese noch vorhanden sind.
Aufbau
Kafka
Ein einzelner Broker im KRaft-Modus (ohne ZooKeeper) fungiert gleichzeitig als Controller.
| Punkt | Wert |
|---|---|
| Port | 9092 (SASL_PLAINTEXT) · 9093 (Controller, intern) · 9094 (SASL_SSL) |
| Authentifizierung | SASL/PLAIN — statisches JAAS (config/jaas.conf). Konto PP_MQ_USER |
| Werbeadresse | PP_KAFKA_ADVERTISED_HOST — wird beim Start auf die Host-Adresse abgeleitet |
| 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 in /etc/kopens/conf/kafka.properties.template des Hosts gerendert. Die broker.properties · server.properties · controller.properties im selben Verzeichnis sind Beispieldateien, die mit der Apache-Kafka-Distribution ausgeliefert werden und von niemandem gelesen werden. Wundern Sie sich nicht über Werte wie advertised.listeners=PLAINTEXT://localhost:9092 im Container.
Kernzeilen 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. Der Datenspeicher für Daten sind Aster TSDB · Zeitreihen-Engine · Iceberg; Kafka ist nur der Puffer dazwischen. Die Aufbewahrung pro Topic und «wer hat den Wert festgelegt» zeigt pd retention.
Wichtige Topics
Das Präfix pp (PP_TOPIC_PREFIX) wird vorangestellt. Dies sind die wichtigsten Topics, die vom Plattformcode verwendet werden.
| Topic | Zweck |
|---|---|
event · event-row | Ereignisbus Server ↔ Engine |
pp-tag-point | Tag-Wertstrom — muss pro Tag die Option «Kafka-Veröffentlichung» aktiviert haben, um befüllt zu werden |
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 · Diagnosestatus |
pp-domain-changed-event | Metadatenänderungen |
pp-production-oee · pp-production-ram · pp-production-ems | Produktionskennzahlen |
Betriebsbefehle
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 Werkzeuge der Kafka-Distribution direkt zu verwenden, müssen SASL-Anmeldedaten als Client-Konfigurationsdatei übergeben werden. pd flow · pd node topic übernehmen das, verwenden Sie also zuerst diese.
Der Broker öffnet Port 9092 etwa 10 Sekunden bevor er die Verarbeitung von Anfragen aktiviert. Deshalb prüft der Health-Check von pd nicht den Port, sondern ob eine ApiVersions-Anfrage an die Werbeadresse gesendet und beantwortet wird. Führen Sie DOWN (port 9092 is bound but … did not answer) direkt nach dem Start erneut nach 30 Sekunden aus.
Tuning-Punkte
Alles wird in /etc/kopens/conf/kafka.properties.template geändert und mit restart-datalake.sh angewendet.
| Punkt | Standard | Anmerkung |
|---|---|---|
log.retention.ms | 1 Stunde | Erhöhen, wenn Konsumenten längere Zeit ausfallen können. Belegt entsprechend mehr Plattenplatz |
num.partitions | 4 | Anzahl der Partitionen für neue Topics. Auf Anzahl der Consumer-Threads abstimmen |
num.io.threads · num.network.threads | 8 · 3 | Bei NVMe kann io auf 16 erhöht werden |
message.max.bytes | 150 MB | Großzügig dimensioniert für große Nachrichten (Datei-Warteschlangen) |
HiveMQ (MQTT)
Dies ist der Standard-MQTT-Broker für leichte IoT-Geräte · Sensoren und den Edge-Agenten (Community Edition).
| Punkt | Wert |
|---|---|
| Port | 1883 (Klartext) · 1884 (TLS) — der Proxy-Container veröffentlicht diese auf dem Host und leitet an das Data Lake weiter |
| Authentifizierung | Benutzername / Passwort — die Sicherheitserweiterung liest conf/auth.properties |
| Konto | PP_MQ_USER / PP_MQ_PASSWORD (gleicher Wert wie bei Kafka) |
| Konfiguration | mqtt/conf/config.xml ← /etc/kopens/conf/hivemq.xml.template |
Der TLS-Listener verwendet den plattformweiten Keystore (/var/security/plantpulse/master/master.keystore.jks) und verlangt 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 nachrichtenweises Audit-Protokoll, daher wird pd logs bewusst ausgelassen) |
Häufig auftretende Probleme
| Symptom | Ursache | Maßnahme |
|---|---|---|
| Client von anderem Gerät wird nach Bootstrap getrennt | Werbeadresse ist die Container-interne Adresse | Knotendatei PP_MASTER_IP → Konfiguration ändern |
pd status messaging ist DOWN (advertises 127.0.0.1…) | Keine Adresse in der Knotendatei | Gleiche Maßnahme. Gleiche Ursache wie Render-Exit-Code 8 |
| Consumer-Lag steigt | Konsument langsam · gestoppt | pd flow von MEMB · LAG, Consumer-Container-Logs |
| Festplatte voll | Aufbewahrung erhöht, aber Konsument gestoppt | kafka-Tabelle in pd retention, log.retention.ms |
| MQTT-TLS-Handshake fehlgeschlagen | Zertifikat abgelaufen · SAN fehlt | Sicherheitseinstellungen — plantpulse-certs stellt neu aus |
| Nur Kafka schlägt nach Rotation fehl | PP_MQ_PASSWORD ist für beide Broker gemeinsam | passwd.sh PP_MQ_PASSWORD für beide zusammen → 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 |