قواعد البيانات في الإنتاج

نظرة المشغّل إلى قواعد البيانات

18 دقيقة الدرس 1 من 30

نظرة المشغّل إلى قواعد البيانات

يسأل المطوّر: "هل يعيد استعلامي الصفوف الصحيحة؟" ويسأل المشغّل: "هل قاعدة البيانات هذه لا تزال تعمل في الثالثة فجرًا، وهل يمكنها تحمّل فقدان العقدة الأساسية، وهل ستعود للعمل بشكل نظيف إذا تعطّل نواة المضيف؟" هذان سؤالان مختلفان جوهريًّا، وتعلّم التفكير كمشغّل هو أول تحوّل يجب أن تُجريه عندما تنتقل من كتابة كود التطبيق إلى تشغيل بنية قواعد البيانات في الإنتاج.

ما الذي يتغيّر حين تصبح المشغّل

حين تمتلك قاعدة بيانات في الإنتاج، ترث مجموعة من المسؤوليات لا علاقة لها بصحة SQL:

  • التوافرية: يجب أن تكون قاعدة البيانات متاحة. النسخة الواحدة غير المتاحة تُوقف كل خدمة تعتمد عليها — غالبًا في سلسلة من الأعطال متعددة الخدمات.
  • المتانة: يجب أن تبقى الإجراءات المُقرَّة سليمةً بعد الانهيارات وانقطاع الطاقة وفشل الأقراص. إتقان fsync وسجلات الكتابة المسبقة، والفرق بين المُقرَّر والدائم، أمر لا بديل عنه.
  • القدرة على الاسترداد: ستأخذ نسخًا احتياطية. كما يجب أن تختبر عمليات الاسترعادة — النسخة الاحتياطية التي لم تستردّها قط هي نسخة لا تملكها فعلًا.
  • السعة: التخزين يتزايد باستمرار. يجب أن تعرف معدل النمو، وتضبط تنبيهات قبل امتلاء الأقراص، وتخطّط للنمو قبل أن يتحول إلى حادثة.
  • قابلية المراقبة: نسب استجابة الاتصالات (p50/p99)، وتأخّر النسخ المتماثلة، وإشباع تجمّع الاتصالات، ووقت انتظار القفل، ومعدل الاستعلامات البطيئة — كلها علامات حيوية لقاعدة البيانات. يجب جمعها وضبط تنبيهات عليها وقراءتها تحت الضغط.
  • إدارة التغيير: ترحيل المخططات والترقيات وضبط الإعدادات كلها تحمل نطاق انتشار للضرر. يخطّط المشغّل لمسارات التراجع قبل تطبيق التغييرات، لا بعدها.
عقد المشغّل: حين يدفع المطوّر ميزةً جديدة، ينتهي دوره. حين ينشر المشغّل قاعدة بيانات، فهو يملكها طوال عمرها في الإنتاج — كل انهيار، وكل استرداد، وكل أزمة سعة، وكل تنبيه في الثالثة فجرًا.

قواعد البيانات المُدارة مقابل المُدارة ذاتيًّا: المقايضة الحقيقية

تواجه كل مؤسسة تشغّل قواعد بيانات هذا الاختيار. الإجابة نادرًا ما تكون واضحة وتعتمد دائمًا على السياق. دعنا نكون دقيقين بشأن ما تقدّمه كل خيار وما تكلّفه.

قواعد البيانات المُدارة (RDS, Cloud SQL, Aurora, Neon, PlanetScale, Atlas)

تتولى الخدمة المُدارة مجموعة محدّدة من المهام التشغيلية: توفير الأجهزة، وتصحيح نظام التشغيل، وترقيات الإصدارات الثانوية، والنسخ الاحتياطية التلقائية، والتعافي الأساسي التلقائي. ما تتخلى عنه في المقابل هو التحكم — في معاملات النواة، وتخطيط التخزين، وتنسيق سجل ثنائي، وكثيرًا ما يكون جدول الترقيات خارج سيطرتك.

في الواقع العملي، قواعد البيانات المُدارة هي الافتراض الصحيح لـ:

  • الفرق التي لا تضمّ مدير قواعد بيانات متخصص أو فريق منصة قواعد بيانات
  • الأعباء التي يكون فيها خطر تكوين خاطئ لـ innodb_buffer_pool_size أعلى من فاتورة السحابة
  • حالات الاستخدام التي يكون فيها الفشل التلقائي متعدد مناطق التوافر (عادةً 30-60 ثانية لـ RDS) مقبولًا

ما لا تحلّه الخدمات المُدارة: الاستعلامات البطيئة، وأخطاء تصميم المخطط، وعدد الاتصالات الجامح، وأخطاء مستوى التطبيق. السحابة تُصلّح المحرك؛ لكنها لا تُصلّح SELECT * داخل حلقة مكثفة.

وهم الخدمة المُدارة: يفترض المهندسون أحيانًا أن اختيار RDS أو Cloud SQL يعني أنهم لم يعودوا بحاجة إلى التفكير تشغيليًا في قاعدة البيانات. هذا خطأ. لا تزال تمتلك أداء الاستعلام، وإدارة الاتصالات، والتحقق من النسخ الاحتياطية، وترحيل المخططات، وتخطيط السعة. الخدمة المُدارة تتعامل مع الأجهزة ونظام التشغيل — كل ما فوق تلك الطبقة يبقى مسؤوليتك.

قواعد البيانات المُدارة ذاتيًّا (EC2, الخوادم المادية, On-prem, Kubernetes StatefulSets)

الإدارة الذاتية تمنحك تحكمًا كاملًا: ضبط النواة (vm.swappiness=1، transparent_hugepages=never)، وتوبولوجيات تخزين مخصصة، والوصول غير المقيّد إلى السجلات الثنائية لخطوط CDC، والقدرة على تشغيل أي مكوّن إضافي أو امتداد لا تعرضه الخدمة المُدارة. الثمن هو أنك تمتلك كل ما يمكن أن يسوء.

الإدارة الذاتية مبرّرة حين:

  • تحول متطلبات إقامة البيانات أو الامتثال دون استخدام الخدمات المُدارة السحابية
  • تحتاج إلى ميزات محرك لا تعرضها الخدمة المُدارة (مثل pg_cron، ومكوّنات WAL مخصصة، ومحركات تخزين معينة)
  • يجعل الحجمُ سعرَ الخدمة المُدارة أعلى بكثير من تكلفة الهندسة اللازمة للتشغيل الذاتي
  • تحتاج إلى تعافٍ تلقائي في أقل من 10 ثوانٍ مع منطق نصاب مخصص (Patroni, Orchestrator, Vitess)
Managed vs Self-Hosted responsibility split Managed Service Self-Hosted Hardware OS / Kernel DB Engine Backups Schema/Queries Cloud vendor Cloud vendor Shared (vendor patches) Automated (verify yourself) Always your responsibility Your team Your team Your team (full control) Your team + automation Always your responsibility
توزيع المسؤوليات: قواعد البيانات المُدارة تُزيل الطبقات السفلى، لكن المخطط وأداء الاستعلامات ومنطق التطبيق تبقى دائمًا مسؤولية فريقك.

الخط الأساسي التشغيلي: ما تحتاجه كل قاعدة بيانات في الإنتاج

بصرف النظر عن المُدارة أو الذاتية، يجب أن تكون هذه الإمكانات متاحة منذ اليوم الأول — لا بعد الحادثة الأولى:

  1. نسخ احتياطية مؤتمتة ومختبَرة مع RTO وRPO موثّقَين.
  2. النسخ المتماثل (كحد أدنى نسخة احتياطية ساخنة) حتى لا يكون فشل مضيف واحد إيقافًا للخدمة.
  3. المراقبة التي تشمل الاستجابة (p50/p99)، وتأخّر النسخ، وإشباع الاتصالات، واستخدام الأقراص، ومعدل الاستعلامات البطيئة.
  4. كتاب التشغيل الذي يغطي الفشل التلقائي، والاسترداد، وإجراءات قطع الاتصالات في حالات الطوارئ — مكتوبًا قبل الحاجة إليه.
  5. عملية التغيير لترحيل المخططات التي تتضمن مسار التراجع.

الأمر التالي هو من أوائل ما يجب على المشغّل الجديد تشغيله على أي نسخة PostgreSQL أو MySQL مُدارة ذاتيًّا لفهم حالتها الراهنة:

# PostgreSQL: استعراض المعاملات التشغيلية الرئيسية دفعةً واحدة psql -U postgres -c " SELECT name, setting, unit, context FROM pg_settings WHERE name IN ( 'max_connections', 'shared_buffers', 'wal_level', 'synchronous_commit', 'checkpoint_completion_target', 'max_wal_size', 'archive_mode', 'log_min_duration_statement' ) ORDER BY name; " # أيضًا: تحقق من فتحات النسخ المتماثل (الفتحات غير المستهلكة قد تملأ القرص بصمت) psql -U postgres -c " SELECT slot_name, plugin, slot_type, active, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS lag FROM pg_replication_slots; "

في نسخة RDS/Aurora المُدارة، تُجري نفس التدقيق عبر مجموعات المعاملات ومقاييس CloudWatch، لكن المبدأ متطابق: اعرف حالة النظام قبل أن يسوء شيء.

إعدادات النواة ونظام التشغيل المهمة (الإدارة الذاتية)

إذا كنت تشغّل قاعدة بيانات ذاتيًا، فإن ثلاثة إعدادات على مستوى نظام التشغيل تؤثر على الاستقرار أكثر من أي ضبط على مستوى قاعدة البيانات:

# /etc/sysctl.d/90-database.conf # تعطيل SWAP — قاعدة بيانات تستخدم SWAP هي قاعدة بيانات غير صحية vm.swappiness = 1 # رفع حد تدفق البيانات المتسخة (تقليل تكرار التوقف في الكتابات الكبيرة) vm.dirty_ratio = 15 vm.dirty_background_ratio = 5 # زيادة حد الملفات المفتوحة للنسخ المشغولة fs.file-max = 1000000 # تطبيق دون إعادة تشغيل sysctl -p /etc/sysctl.d/90-database.conf # تعطيل Transparent Huge Pages (مصدر رئيسي لارتفاع وقت الاستجابة في قواعد البيانات) echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag # جعل إعداد THP ثابتًا عبر إعادة التشغيل (وحدة systemd أو rc.local)
أول يوم على مضيف قاعدة بيانات جديد: شغّل cat /proc/sys/vm/swappiness وcat /sys/kernel/mm/transparent_hugepage/enabled. إذا كان swappiness أعلى من 1 أو كان THP مُفعّلًا، فقد وجدت أول خطر إنتاجي قبل تشغيل استعلام واحد.

النموذج الذهني الذي تحمله معك للأمام

كل درس لاحق في هذا البرنامج التعليمي — النسخ المتماثل، والنسخ الاحتياطية، والتجميع، والمراقبة، و StatefulSets في Kubernetes — سيكون أكثر منطقيةً حين تحمل هذا الإطار الأساسي: قاعدة البيانات مكوّن مشترك وحالتي وعرضة للفشل، ومتانتها وتوافرها مسؤولية فريقك بالكامل. السحابة لا تجعل الأمر غير ذلك سحريًّا؛ بل تحرّك خط مسؤوليتك إلى أعلى. معرفة أين يقع ذلك الخط بدقة هي أولى مهارات مشغّل قواعد البيانات.