fix(cluster): ensure only VIP holder pushes sync and prevent deadlocks with flock and strict VIP check
This commit is contained in:
1 parent
0b740da87e
commit
0b654c885c
3 files changed
+14
-9
No files matched your search
@@ -14,6 +14,12 @@ use App\Database;
|
||||
use App\ClusterManager;
|
||||
|
||||
try {
|
||||
// 0. Verrou d'exécution exclusif pour éviter les chevauchements
|
||||
$lockFp = @fopen('/tmp/nexus_cluster_cron.lock', 'c+');
|
||||
if (!$lockFp || !@flock($lockFp, LOCK_EX | LOCK_NB)) {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
$db = Database::getConnection();
|
||||
$cm = new ClusterManager($db);
|
||||
$st = $cm->getSettings();
|
||||
@@ -23,13 +29,10 @@ try {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// 2. Seul le nœud MASTER actif émet la synchronisation vers le nœud BACKUP
|
||||
// 2. Règle d'or HA : SEUL le nœud qui détient l'IP Virtuelle active (VIP) émet la réplication
|
||||
// Un nœud passif/standby ne doit JAMAIS écraser le nœud actif ni émettre en boucle croisée
|
||||
$vip = $st['virtual_ip'] ?? '';
|
||||
$isVipActive = $cm->isVirtualIpActive($vip);
|
||||
$configuredRole = $st['role'] ?? 'master';
|
||||
|
||||
// Un esclave (backup) ne doit jamais écraser le maître
|
||||
if ($configuredRole !== 'master' && !$isVipActive) {
|
||||
if (empty($vip) || !$cm->isVirtualIpActive($vip)) {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user