قيد الاختبار حاليًا: سيتم فتح كود GitHub عند الاكتمال.

إجراء إعادة التشغيل المتدرّج (Rolling Restart)

هناك مبدأ أساسي واحد: يجب أن تبقى الأغلبية حية دائمًا. مع 3 عُقد، يمكنك إنزال عقدة واحدة فقط في كل مرة؛ ومع 5 عُقد، حتى عقدتين.

  1. أعد تشغيل الأتباع (العُقد غير القائدة) أولًا، واحدة تلو الأخرى — يواصل القائد الخدمة طوال ذلك. تأكد من أن كل عقدة أُعيد تشغيلها قد لحقت عبر تكرار سجل القرين أو اللقطة قبل الانتقال إلى التالية.
  2. أخيرًا، أنزل القائد. تكتشف العُقد المتبقية انقطاع النبضة وتنتخب قائدًا جديدًا خلال 0.5-1 ثانية. تصل طلبات العملاء خلال تلك النافذة بـ E no_leader، لكن العملاء الرسميين يعيدون المحاولة بشفافية، فلا يرى التطبيق سوى تأخير قصير.
  3. أعد تشغيل القائد القديم — ينضم كتابع ويلحق بالركب (لا يستعيد القيادة تلقائيًا).

تبقى حالة القفل محفوظة طوال الوقت ما دامت الأغلبية حية — فحتى الأقفال الممنوحة أو المحررة أثناء إعادة التشغيل تمر بالتثبيت، فلا يضيع شيء.

التدفق (على أساس 3 عُقد)

القائد
التابع 1
التابع 2
① إعادة تشغيل التابع 1 — يواصل القائد الخدمة
يلحق عبر تكرار السجل/اللقطة
② بعد التأكد من اللحاق، إعادة تشغيل التابع 2
يلحق عبر تكرار السجل
③ إعادة تشغيل القائد أخيرًا
Vote ← يُنتخب قائد جديد خلال 0.5-1 ثانية
ينضم القائد القديم كتابع ويلحق بالركب
استدعاء إجماع (RPC) عبر Raft

خلال النافذة القصيرة التي يكون فيها القائد معطلًا، قد يستلم العملاء E no_leader، لكن العملاء الرسميين يعيدون المحاولة بشفافية، فلا يبدو للتطبيق سوى تأخير قصير.