Die self-Registrierung in ha_nodes uebergab beim API-Start hart "primary" — fuer JEDEN Node. Da ha_nodes node-lokal ist (nicht repliziert), trug sich damit auch ein per Join dazugekommener Standby bei sich selbst als Primary ein. In der Cluster-Ansicht DIESES Nodes erschienen beide Knoten als Primary, und eine Korrektur direkt in der DB hielt nur bis zum naechsten Neustart. Nicht kosmetisch: keepalived.go nimmt `role` als Fallback, wenn pg_role nicht 'standby' ist. Ein Standby, der sich selbst "primary" nennt, ist damit genau der Zustand, der 2026-05 schon einmal einen Split-Brain ausgeloest hat (beide Knoten Prioritaet 200, hoehere IP gewinnt). Aktuell deckt pg_role='standby' das ab — aber als alleinige Absicherung ist das duenn. Die Rolle wird jetzt aus der Replikations-Topologie abgeleitet, also der in cluster_repair.go dokumentierten verlaesslichen Quelle: nur der Primary hat die PUBLICATION, nur der Standby die SUBSCRIPTION (beide Kataloge darf der edgeguard-DB-User lesen, verifiziert). Das ist selbstheilend und ueberlebt `edgeguard-ctl promote` korrekt — eine Ableitung aus setup.json wuerde den Promote dagegen bei jedem Neustart wieder ueberschreiben. Ohne eingerichtete Replikation entscheidet IsClusterNode. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
41 KiB
41 KiB