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

معاملات Raft

العنصرالقيمة
فاصل النبضة500 مللي ثانية (cluster_heartbeat_ms)
مهلة اعتبار القائد غير مستجيب2000 مللي ثانية (cluster_election_timeout_ms) — انقطاع النبضة بهذا القدر يعني أن القائد قد مات
نافذة بدء الانتخاب الفعلية1750-2000 مللي ثانية — موزَّعة عشوائيًا لكل عقدة لمنع الترشح المتزامن (split vote). القيمة القصوى هي بالضبط مهلة عدم الاستجابة المضبوطة
توقف العميل عند عطل القائدمقيسًا: مهلة عدم الاستجابة + 0.3-0.5 ثانية (نحو 2.3-2.5 ثانية بالقيم الافتراضية) — الاكتشاف ثم إعادة توجيه واحدة
عدد العُقد3 أو 5 (يُفرض عند تحميل الإعداد — أي عدد آخر يرفض الإقلاع)
معرّف العقدةموضعها (cluster_self) في قائمة cluster_peers — لذا يجب أن يكون ترتيب القائمة متطابقًا في كل عقدة
الإقلاع (Bootstrap)بعد 500 مللي ثانية من البدء، تُهيَّأ كل عقدة بنفس تشكيل العضوية — يُتجاهل عند الانضمام إلى عنقود مُهيَّأ بالفعل
تخزين السجلفي الذاكرة (متطاير) — تستعيد العقدة المُعاد تشغيلها حالتها عبر التكرار أو اللقطة
اكتشاف انتهاء leaseيفحص القائد كل 100 مللي ثانية ويثبّت Expire عبر الإجماع
دقة مهلة waitتُحسم مهلة الانتظار (T) أيضًا عند نفس النبضة كل 100 مللي ثانية — قد تصل متأخرة حتى 100 مللي ثانية
إشعار تغيّر القائدعند تغيّر القائد يُرسَل L فورًا إلى كل العملاء المتصلين

اختيار النبضة ومهلة عدم الاستجابة

تُضبط القيمتان عبر cluster_heartbeat_ms وcluster_election_timeout_ms في الإعداد. مهلة عدم الاستجابة (T) هي نفسها مدة توقف الخدمة عند عطل القائد، وفي المقابل، إن كانت قصيرة أكثر مما ينبغي فقد يُحكم خطأً على قائد حي بأنه ميت فتقع انتخابات لا لزوم لها.

النبضة / Tنافذة الاكتشافأسوأ تأخير عند قتل القائد (مقيس)البيئة المستحسنة
100 / 600 مللي ثانية450-600 مللي ثانيةنحو 0.9 ثانيةنفس الرف/نفس AZ، زمن استجابة مستقر جدًا
100 / 1000 مللي ثانية750-1000 مللي ثانيةنحو 1.2 ثانيةنفس AZ
250 / 2500 مللي ثانية1875-2500 مللي ثانيةنحو 2.8 ثانيةمتعدد AZ
500 / 2000 مللي ثانية1750-2000 مللي ثانيةنحو 2.4 ثانيةالافتراضي — توازن في بيئة متعددة AZ
500 / 5000 مللي ثانية3750-5000 مللي ثانيةنحو 5.3 ثانيةعبر المناطق، أو بيئة شديدة التذبذب
  • زمن المعالجة في الظروف العادية لا يتأثر بهاتين القيمتين (لم يتغير p50 المقيس) — إنما تحكمان زمن التعافي عند الأعطال فقط.
  • عطل تابع لا يؤثر على العميل مهما كانت القيم. لا يقع التأخير أعلاه إلا عند موت القائد.
  • القيود: يجب ألا يقل cluster_election_timeout_ms عن 600 مللي ثانية، وأن يكون 4 أضعاف النبضة على الأقل. (قِيس أن تأخيرًا واحدًا في الجدولة تحت الحِمل يبتلع نبضتين كاملتين.)

لماذا 3 أو 5 عُقد

يتطلب التثبيت أغلبية. التشكيل الزوجي يزيد التكلفة فقط دون تحسين تحمّل الأعطال، لذا يرفضه الخادم.

عدد العُقدالأغلبيةالأعطال المتزامنة المحتملة
220 — عطل واحد يوقف العنقود. لا أفضل من الوضع المفرد
321
431 — كـ 3 عُقد تمامًا، بتكلفة أعلى فقط
532

ملخص سلوك الأعطال

الحالةالسلوك
طلب عميل إلى عقدة غير قائدةM (عنوان القائد)، أو E no_leader إذا كان القائد غير معروف
عطل القائديُنتخب قائد جديد خلال 500-1000 مللي ثانية. الطلبات خلال تلك الفترة تُرجع E no_leader ← يعيد العميل المحاولة
أثناء تغيير القائدتُلغى طلبات الحصول المعلَّقة بـ M/E no_leader، ويعيد العميل المحاولة مع القائد الجديد
إعادة تشغيل عقدةتقلع بحالة فارغة ← تلحق عبر تكرار سجل قرين أو اللقطة
فقدان الأغلبيةيستحيل التثبيت ← تتوقف الكتابة (الأمان أولًا)، وتُستأنف تلقائيًا عند استعادة الأغلبية

المصطلحات

  • الأغلبية (quorum) — أكثر من نصف كل العُقد (2 من 3، أو 3 من 5). بما أن أي قرار يتطلب موافقة الأغلبية، لا يمكن لمجموعتين منقسمتين أبدًا تثبيت قرارين متعارضين في آن واحد.
  • مهلة الانتخاب (election timeout) — المدة التي ينتظرها التابع دون نبضة قبل أن يستنتج أن القائد قد مات ويبدأ انتخابًا. عشوائية لكل عقدة لتقليل الترشح المتزامن.