v1.3.9 hatte auf dem PG-Primary (Prio 200) nopreempt durch preempt_delay ersetzt, damit die VIP zum Primary heimwandert. Das reaktivierte GENAU den Fehlermodus, den nopreempt verhindert: der Prio-200-Node holt die VIP zurück, sobald keepalived ihn für gesund hält — aber die Track-Scripts können "gesund" melden, während der Dienst kaputt ist. Am 2026-08-03 entriss so ein halb-kaputtes utm-1 dem funktionierenden utm-2 die VIP (Log: "Master received advert from .6 with higher priority 200 → Entering BACKUP") und hielt sie fest → Ausfall, bis utm-1 hart abgeschaltet wurde. Zurück auf nopreempt (beide Nodes, wie vor v1.3.9). VIP-Affinität zum Primary erst wieder, wenn der Health-Check "Prozess up aber Dienst kaputt" als FAULT erkennt. Bis dahin: Stabilität > Affinität. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
86 lines
2.5 KiB
Smarty
86 lines
2.5 KiB
Smarty
global_defs {
|
|
router_id {{ .RouterID }}
|
|
script_user root
|
|
enable_script_security
|
|
# GARP: beim Master-Wechsel Gratuitous-ARP forciert senden (repeat) UND
|
|
# periodisch auffrischen (master_refresh) — sonst lässt der Upstream-Switch
|
|
# die VIP-MAC altern und die Failover-IP wird nach Minuten unerreichbar.
|
|
# Ergänzt durch den Priming-Ping in keepalived-master.sh (Traffic AUS der VIP).
|
|
# (vrrp_garp_interval/gna NICHT setzen: keepalived 2.3.x lehnt 0 ab, Default passt.)
|
|
vrrp_garp_master_repeat 5
|
|
vrrp_garp_master_refresh 60
|
|
}
|
|
|
|
{{/* KEIN weight: in einer vrrp_sync_group ignoriert keepalived gewichtete
|
|
Track-Scripts ("ignoring tracked script ... with weights due to SYNC
|
|
group") → die Health-Checks wären wirkungslos. Ohne weight wirken sie
|
|
als binäre FAULT-Trigger: schlägt ein Check fall-mal in Folge fehl,
|
|
geht die Instanz (und via Sync-Group der ganze Node) in FAULT → der
|
|
gesunde Peer übernimmt. Für einen 2-Node-Cluster die saubere Semantik. */}}
|
|
vrrp_script chk_edgeguard {
|
|
script "/usr/lib/edgeguard/keepalived-check.sh"
|
|
interval 2
|
|
fall 8
|
|
rise 2
|
|
}
|
|
{{ if .GWCheckIP }}
|
|
vrrp_script chk_gateway {
|
|
script "/usr/lib/edgeguard/keepalived-gw-check.sh {{ .GWCheckIP }}"
|
|
interval 5
|
|
fall 5
|
|
rise 2
|
|
}
|
|
{{ end }}
|
|
{{ if .HBInterface }}
|
|
vrrp_sync_group VG_1 {
|
|
group {
|
|
VI_1
|
|
VI_HB
|
|
}
|
|
}
|
|
{{ end }}
|
|
vrrp_instance VI_1 {
|
|
state {{ .State }}
|
|
interface {{ .Interface }}
|
|
virtual_router_id {{ .RouterID }}
|
|
priority {{ .Priority }}
|
|
advert_int 2
|
|
nopreempt
|
|
{{ if .SrcIP }} unicast_src_ip {{ .SrcIP }}
|
|
unicast_peer {
|
|
{{ .PeerIP }}
|
|
}
|
|
{{ end }} authentication {
|
|
auth_type PASS
|
|
auth_pass {{ .AuthPass }}
|
|
}
|
|
virtual_ipaddress {
|
|
{{ range .VIPs }} {{ .Address }}/{{ .Prefix }} dev {{ .Device }}
|
|
{{ end }} }
|
|
track_script {
|
|
chk_edgeguard
|
|
{{ if .GWCheckIP }} chk_gateway
|
|
{{ end }} }
|
|
notify_master "/usr/lib/edgeguard/keepalived-master.sh"
|
|
notify_backup "/usr/lib/edgeguard/keepalived-backup.sh"
|
|
notify_fault "/usr/lib/edgeguard/keepalived-backup.sh"
|
|
}
|
|
{{ if .HBInterface }}
|
|
vrrp_instance VI_HB {
|
|
state {{ .State }}
|
|
interface {{ .HBInterface }}
|
|
virtual_router_id {{ .HBRouterID }}
|
|
priority {{ .Priority }}
|
|
advert_int 2
|
|
nopreempt
|
|
{{ if .HBSrcIP }} unicast_src_ip {{ .HBSrcIP }}
|
|
unicast_peer {
|
|
{{ .HBPeerIP }}
|
|
}
|
|
{{ end }} authentication {
|
|
auth_type PASS
|
|
auth_pass {{ .AuthPass }}
|
|
}
|
|
}
|
|
{{ end }}
|