RDS وقواعد البيانات المُدارة
RDS وقواعد البيانات المُدارة
تتولى خدمة Amazon RDS (Relational Database Service) المهام الثقيلة غير المُميَّزة لعمليات قواعد البيانات — تصحيح نظام التشغيل، وتوفير التخزين، وإعداد النسخ المتطابقة، والنسخ الاحتياطية، والتعافي من الأعطال — لتتركز طاقة فريقك على تصميم المخطط وأداء الاستعلامات. لكن "مُدارة" لا تعني "سحرية". للتشغيل الآمن على نطاق إنتاجي، تحتاج إلى فهم آليات RDS الداخلية: أي محرك تختار، وكيف يعمل التعافي التلقائي في Multi-AZ فعلياً، ومتى تفيد نسخ القراءة (ومتى لا تفيد)، وكيف تُمكّنك مجموعات المعاملات من ضبط المحرك دون الحاجة إلى صلاحيات SSH.
المحركات المدعومة
تدعم RDS ستة محركات لقواعد البيانات. كل محرك على RDS هو الثنائي الأصلي مفتوح المصدر أو التجاري — وليس نسخة مُعدَّلة — لذا تنتقل خبرتك الحالية وبروتوكولاتك وأطر عملك دون أي تعديل.
- MySQL — الخيار الافتراضي لتطبيقات الويب. تدعم RDS MySQL الإصدارين 5.7 و8.0. اختر 8.0 للحصول على دوال النوافذ (window functions) وتعبيرات CTE وإعدادات InnoDB المحسّنة.
- PostgreSQL — المُفضَّل في كبرى شركات التقنية لامتثاله الصارم لمعيار SQL وفهرسة JSONB والنسخ المنطقي والإضافات. تدعم RDS الإصدارات pg 13–16. استخدم
pg_stat_statementsوauto_explainعبر مجموعات المعاملات لتشخيص الاستعلامات البطيئة دون صلاحيات shell. - MariaDB — نسخة مشتقة من MySQL. يجعل نموذج thread-pool الخاص بها مناسباً لأحمال العمل عالية التزامن التي تُربك نموذج MySQL ذا الخيط الواحد لكل اتصال.
- Oracle وSQL Server — متاحان لسيناريوهات نقل تراخيص المؤسسات (BYOL أو License Included). تجنّبهما للمشاريع الجديدة؛ إذ تتأخر ميزات الإدارة فيهما مقارنةً بالمحركات مفتوحة المصدر.
- Amazon Aurora — محرك AWS السحابي الأصيل بنقاط نهاية متوافقة مع MySQL وPostgreSQL. يستبدل طبقة التخزين على القرص بوحدة تخزين موزعة تُعالج نفسها ذاتياً بستة نسخ موزعة عبر ثلاث مناطق توافر (AZs). يُقلّص Aurora وقت الاسترداد من دقائق إلى أقل من 30 ثانية ويلغي تأخير النسخ المتطابقة للقراءات.
TimescaleDB.
Multi-AZ مقابل نسخ القراءة
كثيراً ما يختلط هذان المفهومان لأن كليهما يتضمن نسخة ثانية من قاعدة البيانات. في الحقيقة، يحلّان مشكلتين مختلفتين تماماً.
Multi-AZ آلية توافر عالٍ. يُوفّر AWS نسخة احتياطية متزامنة (standby) في منطقة توافر مختلفة. كل عملية كتابة على الخادم الأساسي تُودَع بشكل متزامن على الخادم الاحتياطي قبل أن تعود العملية بنجاح للتطبيق. إذا فشل الخادم الأساسي — عطل عتاد، أو انقطاع منطقة التوافر، أو تعطل نظام التشغيل — يُحدّث RDS سجل CNAME الخاص بنقطة النهاية ليشير إلى الخادم الاحتياطي خلال 60–120 ثانية. يُعيد تطبيقك الاتصال بنفس اسم المضيف ويستأنف عمله. الخادم الاحتياطي غير مرئي لتطبيقك في التشغيل الاعتيادي ولا يُستخدم للقراءة أبداً. تدفع ثمنه كاملاً ليبقى خاملاً جاهزاً للاستلام — وهي المقايضة الصحيحة للإنتاج: الموثوقية على حساب التكلفة.
نسخ القراءة (Read Replicas) آلية توسيع نطاق القراءة. تستخدم RDS النسخ غير المتزامن (السجل الثنائي لـ MySQL/MariaDB، والنسخ التدفقي لـ PostgreSQL) لنقل عمليات الكتابة من الخادم الأساسي إلى نسخة أو أكثر. لكل نسخة نقطة نهاية DNS خاصة بها ويمكنها خدمة استعلامات SELECT، مُخفِّفةً الضغط عن الخادم الأساسي. النسخ غير متزامن، لذا قد تتأخر النسخ عن الخادم الأساسي بميلي ثوانٍ إلى ثوانٍ تحت حمل كتابة ثقيل. القراءات من النسخة متسقة في نهاية المطاف وليست متسقة قوياً. نسخ القراءة ليست أهدافاً تلقائية للتعافي من الأعطال بشكل افتراضي — يجب عليك الترقية اليدوية لأحدها وتحديث سلاسل الاتصال. يمكنك إنشاء حتى 5 نسخ قراءة لكل مثيل RDS (15 لـ Aurora).
النسخ الاحتياطية التلقائية واللقطات اليدوية
توفر RDS آليتَي نسخ احتياطي مختلفتين. فهم الفرق بينهما ضروري لتحديد RTO وRPO الخاصين بك.
النسخ الاحتياطية التلقائية مفعَّلة بشكل افتراضي (مدة الاحتفاظ 1–35 يوماً). تأخذ RDS لقطة يومية لوحدة تخزين البيانات خلال نافذة النسخ الاحتياطي المُعدَّة، وتُؤرشف سجلات المعاملات بصفة مستمرة في S3. يتيح هذا التركيب الاسترداد إلى نقطة زمنية (PITR): يمكنك استعادة قاعدة بياناتك إلى أي ثانية ضمن مدة الاحتفاظ. الاستعادة تُنشئ مثيلاً جديداً — لا تُعيد الضبط في المكان.
اللقطات اليدوية تُنشأ صراحةً عبر وحدة التحكم أو CLI أو الأتمتة. تبقى حتى تحذفها، وتصمد حتى بعد حذف المثيل. استخدمها قبل هجرات المخطط، وترقيات الإصدار الكبرى، وأي عملية تدميرية. لا تُمكِّن PITR — فهي لقطة كاملة لوحدة التخزين في نقطة زمنية واحدة.
مجموعات المعاملات: ضبط المحرك دون صلاحيات Shell
مجموعة المعاملات (Parameter Group) هي مجموعة من متغيرات إعداد المحرك (مكافئ ملف my.cnf أو postgresql.conf) تربطها بمثيل RDS أو مجموعة. نظراً لانعدام صلاحيات الوصول إلى نظام التشغيل في RDS، تُعدّ مجموعات المعاملات الطريقة الوحيدة لضبط محرك قاعدة البيانات.
تنقسم المعاملات إلى نوعين. المعاملات الثابتة (Static) تتطلب إعادة تشغيل المثيل لتُطبَّق مثل max_connections وshared_buffers. المعاملات الديناميكية (Dynamic) تُطبَّق فوراً دون إعادة تشغيل مثل log_min_duration_statement وwork_mem. تشحن RDS بمجموعة معاملات افتراضية لكل إصدار محرك؛ هذه المجموعة غير قابلة للتعديل — يجب إنشاء مجموعة مخصصة لتغيير أي شيء.
أبرز المعاملات التي يستحق ضبطها في بيئات PostgreSQL الإنتاجية:
shared_buffers— صيغة RDS{DBInstanceClassMemory/4}تضبطه على 25% من الذاكرة، نقطة البداية المعيارية. ثابت؛ يتطلب إعادة تشغيل.work_mem— الذاكرة لكل عملية فرز أو تجزئة. القيمة الافتراضية 4 ميجابايت منخفضة عادةً للاستعلامات التحليلية. ارفعها بحذر: تتضاعف بعدد الاستعلامات المتزامنة. ديناميكي.log_min_duration_statement— تسجيل أي استعلام يتجاوز N ميلي ثانية. ابدأ بـ1000، وخفّضه إلى 200 بعد معالجة الاستعلامات البطيئة الواضحة. ديناميكي.random_page_cost— اضبطه على 1.1 لتخزين SSD (gp3/io1). القيمة الافتراضية 4.0 مصممة للأقراص الدوّارة وتجعل مُخطِّط الاستعلام يُفضّل المسح التسلسلي بشكل مفرط على SSDs. ديناميكي.max_connections— ثابت. على المثيلات الكبيرة، استخدم PgBouncer أو RDS Proxy أمام RDS بدلاً من رفع هذه القيمة؛ تكلفة الاتصالات في PostgreSQL مرتفعة.
SHOW shared_buffers; بعد إعادة التشغيل — لا تفترض أن التغيير طُبِّق.
التخزين: gp3 مقابل io1 مقابل io2
أداء تخزين RDS يؤثر مباشرةً على زمن استجابة قاعدة البيانات. اختر بناءً على متطلبات IOPS والإنتاجية، لا حجم المثيل وحده.
- gp3 — SSD متعدد الأغراض. خط أساس 3,000 IOPS و125 ميجابايت/ث، قابل للترقية إلى 16,000 IOPS و1,000 ميجابايت/ث بصرف النظر عن حجم التخزين. الافتراضي الصحيح لمعظم أحمال الإنتاج.
- io2 — SSD ذو IOPS مُوفَّر. حتى 256,000 IOPS مع ضمان توافر 99.999%. استخدمه لأحمال OLTP المطلوبة حيث يجب أن يكون زمن الاستجابة أقل من ميلي ثانية.
- Aurora — التخزين مُدار بصورة منفصلة؛ لا تُوفِّر IOPS. يتوسع تلقائياً حتى 128 تيرابايت ويتولى I/O بنفسه، وهو من أقوى مزايا Aurora.
aws rds describe-db-instances --query 'DBInstances[*].{ID:DBInstanceIdentifier,Storage:StorageType}' لتدقيق أسطولك.
التوفير عبر CLI: مثال شامل من البداية للنهاية
ما يلي ينشئ مثيل PostgreSQL Multi-AZ جاهزاً للإنتاج مع مجموعة معاملات مخصصة ونسخ احتياطية تلقائية مُعدَّة مسبقاً.
أبرز الخيارات المهمة: --storage-encrypted يُفعِّل التشفير بـ AES-256 في حالة الراحة (إلزامي للامتثال)؛ --deletion-protection يمنع الحذف العرضي للمثيل؛ --no-publicly-accessible يضمن عدم وجود IP عام ويجعل المثيل متاحاً فقط داخل VPC؛ --enable-performance-insights يوفر لوحة بيانات أداء استعلام مجانية لمدة 7 أيام.