Compare commits
4 Commits
95f2238588
...
v1.3.29
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb19562bc1 | ||
|
|
a31c94f9b8 | ||
|
|
2c72a82a91 | ||
|
|
ed419c1f5f |
@@ -416,7 +416,10 @@
|
|||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"degraded": "degraded",
|
"degraded": "degraded",
|
||||||
"split-brain": "split-brain"
|
"split-brain": "split-brain"
|
||||||
}
|
},
|
||||||
|
"roleDbPrimary": "DB-Primary",
|
||||||
|
"rolePeer": "Peer",
|
||||||
|
"roleHint": "DB-/Cluster-Rolle: bestimmt, wohin Schreibzugriffe gehen. Sie wandert NICHT mit der VIP — ein Node kann DB-Primary sein und trotzdem gerade keepalived-BACKUP (siehe VIP/VRRP-Karte). Sie aendert sich nur durch „edgeguard-ctl promote“."
|
||||||
},
|
},
|
||||||
"routingCard": {
|
"routingCard": {
|
||||||
"title": "Routing",
|
"title": "Routing",
|
||||||
|
|||||||
@@ -416,7 +416,10 @@
|
|||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"degraded": "degraded",
|
"degraded": "degraded",
|
||||||
"split-brain": "split-brain"
|
"split-brain": "split-brain"
|
||||||
}
|
},
|
||||||
|
"roleDbPrimary": "DB primary",
|
||||||
|
"rolePeer": "Peer",
|
||||||
|
"roleHint": "Database/cluster role: decides where writes go. It does NOT follow the VIP — a node can be DB primary while currently being keepalived BACKUP (see the VIP/VRRP card). It only changes via \"edgeguard-ctl promote\"."
|
||||||
},
|
},
|
||||||
"routingCard": {
|
"routingCard": {
|
||||||
"title": "Routing",
|
"title": "Routing",
|
||||||
|
|||||||
@@ -677,7 +677,18 @@ function ClusterStatusCard({ nodes, status }: ClusterStatusCardProps) {
|
|||||||
padding: '4px 0', borderBottom: '1px solid #F1F5F9', fontSize: 12,
|
padding: '4px 0', borderBottom: '1px solid #F1F5F9', fontSize: 12,
|
||||||
}}>
|
}}>
|
||||||
<code style={{ color: '#334155' }}>{n.fqdn}</code>
|
<code style={{ color: '#334155' }}>{n.fqdn}</code>
|
||||||
<Tag color={n.role === 'primary' ? 'green' : 'default'} style={{ margin: 0 }}>{n.role}</Tag>
|
{/* ha_nodes.role ist die DB-/Cluster-Rolle (wohin Schreibzugriffe
|
||||||
|
gehen) und wandert bewusst NICHT mit der VIP — sie aendert
|
||||||
|
sich nur durch `edgeguard-ctl promote`. Ein nacktes "primary"
|
||||||
|
hier las sich neben der VIP-Karte ("BACKUP") wie ein
|
||||||
|
Widerspruch, deshalb explizit als DB-Rolle beschriftet. */}
|
||||||
|
<Tooltip title={t('dashboard.clusterCard.roleHint')}>
|
||||||
|
<Tag color={n.role === 'primary' ? 'green' : 'default'} style={{ margin: 0 }}>
|
||||||
|
{n.role === 'primary'
|
||||||
|
? t('dashboard.clusterCard.roleDbPrimary')
|
||||||
|
: t('dashboard.clusterCard.rolePeer')}
|
||||||
|
</Tag>
|
||||||
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</Space>
|
</Space>
|
||||||
|
|||||||
@@ -346,6 +346,19 @@ net.ipv6.conf.all.accept_source_route = 0
|
|||||||
net.ipv4.conf.all.rp_filter = 2
|
net.ipv4.conf.all.rp_filter = 2
|
||||||
net.ipv4.conf.default.rp_filter = 2
|
net.ipv4.conf.default.rp_filter = 2
|
||||||
|
|
||||||
|
# ─── Nonlocal-Bind (HA/VIP) ───────────────────────────────────────
|
||||||
|
# squid und unbound lauschen auf den VLAN-Gateway-VIPs. Ohne diese
|
||||||
|
# Option kann ein Node sie nur binden, WÄHREND er die VIP haelt — auf
|
||||||
|
# dem Standby scheitert der Start mit "FATAL: Unable to open HTTP
|
||||||
|
# Socket" und die Unit steht dauerhaft auf `failed`. Das ist nicht von
|
||||||
|
# einem echten Ausfall zu unterscheiden und kostet beim Failover
|
||||||
|
# zusätzlich einen Kaltstart. Mit nonlocal_bind laufen beide Dienste auf
|
||||||
|
# beiden Nodes durch und sind im Umschaltmoment sofort bereit; Traffic
|
||||||
|
# bekommt weiterhin nur der Node, der die VIP per ARP wirklich haelt.
|
||||||
|
# Standard-Pattern für keepalived-Setups.
|
||||||
|
net.ipv4.ip_nonlocal_bind = 1
|
||||||
|
net.ipv6.ip_nonlocal_bind = 1
|
||||||
|
|
||||||
# ─── Conntrack — Edge-Box trackt viele parallele Sessions ─────────
|
# ─── Conntrack — Edge-Box trackt viele parallele Sessions ─────────
|
||||||
net.netfilter.nf_conntrack_max = 524288
|
net.netfilter.nf_conntrack_max = 524288
|
||||||
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
|
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
|
||||||
@@ -400,6 +413,21 @@ vm.dirty_background_ratio = 5
|
|||||||
SYSCTL
|
SYSCTL
|
||||||
sysctl --system >/dev/null 2>&1 || true
|
sysctl --system >/dev/null 2>&1 || true
|
||||||
|
|
||||||
|
# Ein Node, der als Standby gebootet hat, kann squid/unbound vor
|
||||||
|
# dem nonlocal_bind oben nicht gestartet haben — die Unit steht
|
||||||
|
# dann auf `failed` und systemd versucht es von sich aus nicht
|
||||||
|
# erneut. Gezielt nur solche Units anfassen: enabled UND failed.
|
||||||
|
# Laeuft der Dienst bereits oder ist er bewusst disabled (Forward-
|
||||||
|
# Proxy/DNS optional), passiert hier nichts.
|
||||||
|
for svc in squid unbound; do
|
||||||
|
if systemctl is-enabled --quiet "$svc" 2>/dev/null \
|
||||||
|
&& systemctl is-failed --quiet "$svc" 2>/dev/null; then
|
||||||
|
systemctl reset-failed "$svc" 2>/dev/null || true
|
||||||
|
systemctl start "$svc" 2>/dev/null || \
|
||||||
|
echo "postinst: $svc start after nonlocal_bind failed" >&2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
# ── Firewall-Logging via ulogd2 (NFLOG group 0) ──────────────
|
# ── Firewall-Logging via ulogd2 (NFLOG group 0) ──────────────
|
||||||
# nft-Renderer emittiert `log prefix "edgeguard:<rule-id>" group 0`
|
# nft-Renderer emittiert `log prefix "edgeguard:<rule-id>" group 0`
|
||||||
# für jede Rule mit log=true. ulogd2 subscribed auf netlink-group
|
# für jede Rule mit log=true. ulogd2 subscribed auf netlink-group
|
||||||
|
|||||||
Reference in New Issue
Block a user