مشروع: دليل تشغيل منصة المراسلة
مشروع: دليل تشغيل منصة المراسلة
دليل التشغيل ليس وثيقة لذاتها — بل هو المعرفة القابلة للتنفيذ التي تمكّن أي مهندس في حالة الاستعداد، في الثالثة صباحاً، من إعادة المنصة إلى وضعها الطبيعي دون الحاجة إلى التصعيد. يجمع هذا الدرس كل ما تناولناه في هذا الدرس التعليمي في دليل تشغيل متكامل على مستوى الإنتاج لمنصة يخدم فيها Redis Cluster طبقة الجلسات والحد من المعدّل، بينما يخدم Apache Kafka طبقة بث الأحداث. تنطبق هذه الأنماط سواء كنت تعمل على معدات مادية أو على AWS MSK مع ElastiCache أو على Kubernetes operators المُدارة ذاتياً.
لقطة معمارية للمنصة
قبل أن تتمكن من تشغيل منصة، يجب أن يتشارك كل فرد في الفريق نموذجاً ذهنياً واحداً لتوپولوجيتها. يبدأ دليل التشغيل بمخطط معماري موثوق به، مُثبَّت في ويكي الفريق الداخلي ويُراجَع عند كل تغيير جوهري.
القسم الأول: قرارات تصميم التوافر العالي
عقد Redis للتوافر العالي: شغّل ثلاثة عقد Sentinel كحد أدنى (ليس اثنتين — فالانقسام بين نودتي Sentinel لا يمكن حلّه بنصاب). لمجموعة Redis Cluster، استخدم 3 أجزاء بنسخة واحدة لكل جزء، موزَّعة على 3 مناطق توافر، مع min-replicas-to-write 1 وmin-replicas-max-lag 10 على كل Primary. اضبط cluster-require-full-coverage no حتى يؤدي فقدان جزء إلى تدهور المجموعة لا إسقاطها كلياً. وقت التعافي عند استخدام Sentinel هو 30-60 ثانية افتراضياً؛ اضبط down-after-milliseconds 5000 وfailover-timeout 10000 للحصول على تعافٍ أقل من 30 ثانية في البيئات الحساسة للكمون، مع قبول أن القيم العدوانية تزيد من احتمال التعافيات الكاذبة عند اضطراب الشبكة.
عقد Kafka للتوافر العالي: استخدم معامل نسخ 3 (RF=3) لجميع المواضيع، مع min.insync.replicas=2. هذا يتحمل فقدان بروكر واحد دون فقدان بيانات أو خطأ في المنتج. لنصاب متحكمات KRaft، يكفي 3 متحكمات مخصصة للإنتاج — إذ تتطلب نصاباً من 2/3 لانتخاب متحكم نشط جديد، فالفقدان المتزامن لمتحكمَين يوقف عمليات البيانات الوصفية. احرص على وضع المتحكمات على مضيفين منفصلين عن البروكرات.
القسم الثاني: مكدس المراقبة والإشارات الذهبية
طبقة المراقبة لهذه المنصة مبنية على Prometheus مع Grafana، وتُغذَّى بمقاييس redis_exporter من oliver006 ومصدر JMX (أو منتج Prometheus الأصلي لـ Kafka). قواعد التنبيه التالية غير قابلة للتفاوض للإنتاج:
القسم الثالث: دليل الاستجابة للحوادث
خطوات دليل التشغيل التالية مرتبة حسب السرعة. كل قسم يرتبط بقاعدة تنبيه في PagerDuty. يجب أن يتمكن مهندس الاستعداد من نسخ هذه الأوامر ولصقها مباشرة.
فشل Redis Primary (إدارة Sentinel)
- تأكيد التنبيه:
redis-cli -h sentinel1 -p 26379 SENTINEL masters— تحقق من حقلflags؛ القيمةs_downأوo_downتؤكد شك Sentinel. - فحص النصاب:
redis-cli -h sentinel1 -p 26379 SENTINEL ckquorum mymaster— يجب أن تُرجعOK. - إذا كان Sentinel سليماً ولم يبدأ التعافي بعد، شغّله يدوياً:
redis-cli -h sentinel1 -p 26379 SENTINEL failover mymaster. - تأكيد الـ Primary الجديد:
redis-cli -h sentinel1 -p 26379 SENTINEL get-master-addr-by-name mymaster. - التحقق من إعادة اتصال التطبيق — معظم مكتبات عملاء Redis (ioredis وjedis وlettuce) تتعامل مع تعافي Sentinel تلقائياً خلال 1-3 ثوانٍ بعد نشر Sentinel لعنوان الـ Master الجديد.
- تقديم تذكرة ما بعد الحادثة: السبب الجذري (OOM أو OOM-killer للنواة أو عطل معدّي)، حالة إعادة ربط النسخ، نافذة فقدان البيانات (قارن
master_repl_offsetمنINFO replicationقبل وبعد).
فقدان Kafka Broker وإعادة انتخاب الأقسام
ارتفاع تأخر مجموعة المستهلكين (غير ناجم عن فقدان بروكر)
- عزل السبب الجذري: بطء معالجة المستهلك، أو ارتفاع مفاجئ في إنتاجية المنتج، أو رسالة مسمومة تسبب أخطاء تسلسل متكررة.
- تحقق من سجلات المستهلك بحثاً عن
DeserializationExceptionأو إعادات توازن متكررة. إعادات التوازن المتكررة تعني تجاوز المستهلكين لـmax.poll.interval.ms(5 دقائق افتراضياً) — زده أو قلل حجم الدفعة. - للرسالة المسمومة: حدد الإزاحة بـ
kafka-get-offsets.sh، ثم استخدم مستهلكاً مؤقتاً معauto.offset.reset=noneوأمرseekللتخطي. لا تحذف الرسالة أبداً — وجّهها إلى موضوع الرسائل الميتة. - زد المستهلكين أفقياً حتى عدد الأقسام. ما وراء ذلك العدد، يظل كل مستهلك إضافي خاملاً ويهدر الموارد.
القسم الرابع: شجرة قرار السعة والتوسع
يتضمن دليل التشغيل شجرة قرار للتوسع يتبعها مهندسو الاستعداد قبل تشغيل بنية تحتية جديدة. يمنع ذلك نقص التوفير (تدهور المنصة) والتوفير الزائد (هدر الميزانية).
مشغّلات توسع Redis:
- الذاكرة فوق 75% لمدة 30 دقيقة: افحص أولاً TTL للمفاتيح وسياسة الإخلاء. إذا كان النمو مشروعاً، أضف جزءاً:
redis-cli --cluster add-node new_host:6379 existing_host:6379ثم--cluster rebalance. - CPU فوق 70% على الـ Primary: Redis أحادي الخيط لمستوى البيانات. وسّع أفقياً (أجزاء أكثر) لا عمودياً. حدد المفاتيح الساخنة أولاً بـ
redis-cli --hotkeysأوredis-cli OBJECT FREQ key(يتطلبmaxmemory-policy allkeys-lfu). - كمون القراءة فوق 5 ms p99: وجّه القراءات إلى النسخ. تأكد من أن العميل مهيأ بـ
READONLYعلى اتصالات النسخ.
مشغّلات توسع Kafka:
- قرص البروكر فوق 70%: قلل
log.retention.hoursأو زد عدد البروكرات. أعد توزيع الأقسام بـkafka-reassign-partitions.shلنشر البيانات. - إنتاجية الشبكة فوق 80% من سعة الشبكة: أضف بروكرات وأعد توازن قادة الأقسام. في AWS MSK، غيّر نوع النسخة للبروكر.
- كمون المنتج فوق 50 ms: افحص
request.required.acks. إذا كانتacks=all، افحص حجم ISR — إذا تقلص إلى 1، فنسخة بطيئة واحدة تحجب كل acks. حدد النسخة المتأخرة بـkafka-topics.sh --under-min-isr-partitions.
القسم الخامس: صيانة دليل التشغيل وجدول التدريبات
دليل التشغيل الذي لا يُختبر أبداً هو التزام لا أصل، لا عائد منه. ادمج ما يلي في التقويم الهندسي لفريقك:
- تدريب فوضى شهري: أوقف نسخة Redis واحدة في بيئة التجهيز، تحقق من ترقية Sentinel بشكل صحيح، وتحقق من RTO للتطبيق. أوقف بروكر Kafka واحد وتحقق من تقارب التأخر ضمن SLO. استخدم مبادئ هندسة الفوضى من الدرس التعليمي السابق في هذه الدورة — وثّق فرضية الحالة المستقرة قبل كل تدريب.
- اختبار تعافٍ ربع سنوي: نفّذ تعافياً كاملاً لـ Redis Primary في الإنتاج خلال نافذة حركة مرور منخفضة. هذا يكشف الانجراف في التهيئة (قواعد الجدار الناري وإصدارات مكتبة العميل وإعدادات TTL لـ DNS) التي لا تظهر إلا في ظروف حقيقية.
- مراجعة دليل التشغيل بعد كل حادثة: بعد كل تحليل ما بعد الحادثة، حدّث قسم دليل التشغيل المتأثر خلال 48 ساعة. مهندس الاستعداد الذي أدار الحادثة يملك هذه المهمة — إذ هو الخبير الموضوعي حتى الدورة التالية.
- تدقيق إجهاد التنبيهات: ربع سنوياً، راجع تكرار إطلاق كل تنبيه. أي تنبيه يطلق أكثر من مرتين أسبوعياً دون حادثة P1 إما خاطئ المعايرة أو يشير إلى مشكلة منهجية يجب إصلاحها لا إسكاتها.
مقياس نضج تشغيل منصة المراسلة ليس ألا تحدث حوادث — بل أن كل حادثة تكون أقصر وأفضل احتواءً وأفضل توثيقاً من السابقة. هذا الدليل هو العقد التشغيلي بين منصتك وكل مهندس يعتمد عليها.