الجزء 8 من سلسلة تعلّم AWS من الصفر

قواعد البيانات المُدارة: RDS وAurora

لا تدير قاعدة بياناتك بيدك. كيف تتكفل RDS بالنسخ الاحتياطية والتحديثات والتحويل عند الأعطال، والفرق بين Multi-AZ ونسخ القراءة، ووش تضيف Aurora، مع تجربة عملية تبني فيها قاعدة بيانات خاصة.

في هذا المقال
  1. وش تسوي RDS عنك؟
  2. Multi-AZ ونسخ القراءة
  3. النسخ الاحتياطي والاسترجاع
  4. الأمان
  5. Aurora
  6. عملي: قاعدة بيانات خاصة ما يوصلها إلا سيرفرك
  7. الخلاصة
  8. اختبر نفسك

في الجزء السابع اتفقنا إن السيرفر ممكن يختفي بأي لحظة، فما يبقى عليه شي مهم. وأهم شي عندك هو بياناتك، فوين تعيش؟

تقدر تثبّت PostgreSQL بنفسك على سيرفر EC2. هذا يشتغل، بس صرت أنت المسؤول عن النسخ الاحتياطية، والتحديثات، والنسخ المتطابقة، والتحويل عند الأعطال، والقرص اللي يمتلي الساعة 3 الفجر. RDS تشيل عنك أغلب هذا.

وش تسوي RDS عنك؟

RDS (Relational Database Service) تشغّل محرك قاعدة البيانات اللي تختاره على سيرفرات تديرها AWS. والمحركات المدعومة: PostgreSQL وMySQL وMariaDB وOracle وSQL Server وDb2، وفوقها Aurora اللي بنوصلها بعد شوي.

المهمة قاعدة بيانات على EC2 RDS
تثبيت المحرك وتحديثه هو والنظام أنت AWS، في نافذة صيانة تحددها
النسخ الاحتياطي والاسترجاع لوقت محدد تبنيه بنفسك جاهز
نسخة احتياطية مع تحويل تلقائي تبنيها بنفسك خيار واحد
نسخ للقراءة تبنيها بنفسك بضع ضغطات
لوحات المراقبة تبنيها بنفسك جاهزة
تصميم الجداول والفهارس والاستعلامات أنت لسا أنت

والمقابل: ما تقدر تدخل على السيرفر بـ SSH، ولا تلمس نظام التشغيل. ولو تحتاج هذا فعلاً مع Oracle أو SQL Server، فيه RDS Custom اللي يعطيك وصول للسيرفر، وتبقى AWS تتكفل بكثير من الأتمتة.

تخزين يكبر لحاله

فعّل Storage Auto Scaling وحدد سقف، وRDS توسّع القرص لما تقل المساحة الفاضية، بدون توقف. بس انتبه: التخزين يكبر فقط، وما تقدر تصغّره بعدها.

Multi-AZ ونسخ القراءة

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

Multi-AZ: الحماية التطبيق الأساسية منطقة توفر A الاحتياطية منطقة توفر B نسخ متزامن، وما تقرأ من الاحتياطية عند العطل تستلم تلقائياً نسخ القراءة: قراءات أكثر التطبيق الأساسية الكتابة نسخة قراءة 1 نسخة قراءة 2 نسخ غير متزامن، وتقدر تقرأ منها تطبيقك يختار وين تروح القراءات
في Multi-AZ تنتظر النسخة الاحتياطية بدون قراءة وتستلم عند العطل، وفي نسخ القراءة يوجّه التطبيق قراءاته لنسخ منفصلة.
Multi-AZ نسخة قراءة (Read Replica)
الهدف التوفر: تنجو من العطل التوسّع: تخدم قراءات أكثر
النسخ متزامن غير متزامن، فممكن تتأخر شوي
تقرأ منها؟ لا، الاحتياطية تنتظر فقط نعم، هذا هدفها
العنوان نفسه، وينتقل عند التحويل لكل نسخة عنوانها
مكانها منطقة توفر ثانية في نفس الـ Region نفس المنطقة أو غيرها أو Region ثانية
عند العطل تحويل تلقائي خلال دقيقة أو دقيقتين يدوي: ترقّيها لقاعدة مستقلة

Multi-AZ

متزامن معناها إن الكتابة ما تتأكد إلا بعد ما توصل النسختين. ولما تتعطل الأساسية، توجّه RDS نفس اسم الـ DNS للاحتياطية، وتطبيقك يعيد الاتصال بدون أي تعديل. وتقدر تفعّلها على قاعدة شغّالة بدون توقف.

وفيه شكل أحدث اسمه Multi-AZ DB cluster لـ MySQL وPostgreSQL: قاعدة أساسية واحدة مع نسختين احتياطيتين تقدر تقرأ منهم، وتحويل أسرع.

نسخ القراءة

تقدر تسوي لين 15 نسخة في PostgreSQL وMySQL وMariaDB، وأقل في غيرها. ومثال شائع: تقارير لوحة التحكم الثقيلة تقرأ من نسخة، فما تأثر على قاعدة الإنتاج.

انتبه لنقطتين:

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

ونقل البيانات لنسخة داخل نفس الـ Region مجاني، وبين Regions مدفوع.

النسخ الاحتياطي والاسترجاع

RDS تاخذ نسخة يومية تلقائية، وتحفظ سجلات المعاملات كل 5 دقايق، فتقدر ترجع لأي ثانية داخل فترة الاحتفاظ لين حوالي 5 دقايق قبل الحين. وتحدد الفترة من يوم لين 35 يوم، و0 يوقف النسخ التلقائي.

أما اللقطات اليدوية (Snapshots) فتبقى لين تحذفها أنت، فمناسبة قبل أي تغيير كبير.

وأهم نقطة: الاسترجاع ينشئ قاعدة جديدة بعنوان جديد، وما يكتب فوق القديمة. وبعدها توجّه تطبيقك للعنوان الجديد.

الأمان

نفس النمط اللي شفناه في الجزء السادس: قاعدة البيانات في شبكة خاصة، وما تقبل إلا من مجموعة أمان السيرفرات.

  • الشبكة: أوقف الوصول العام (Public access)، وخل مجموعة الأمان تسمح بالمنفذ (5432 أو 3306) من مجموعة أمان السيرفرات فقط.
  • التشفير المخزّن: عن طريق KMS، وقرره عند الإنشاء. تفعيله بعدين يعني تشفّر نسخة من لقطة وتسترجعها.
  • التشفير أثناء النقل: TLS.
  • كلمات المرور: خل RDS تدير كلمة المدير في Secrets Manager، أو استخدم مصادقة IAM برموز مؤقتة في PostgreSQL وMySQL وMariaDB.
  • السجلات: صدّرها إلى CloudWatch Logs.

RDS Proxy

لو عندك اتصالات كثيرة وقصيرة، زي دوال Lambda اللي بنشرحها في الجزء الحادي والعشرين، ممكن تستهلك حد الاتصالات في القاعدة. RDS Proxy يجلس في النص ويعيد استخدام الاتصالات، وتطبيقك يتصل فيه كأنه القاعدة نفسها.

ويقلل وقت التحويل عند الأعطال، لأنه يبقي اتصالات تطبيقك مفتوحة ويوجّهها للقاعدة الجديدة. ويتوفر من داخل شبكتك الخاصة فقط.

Aurora

Aurora محرك قاعدة بيانات بنته AWS للسحابة، ومتوافق مع MySQL أو PostgreSQL، فتطبيقك وأدواتك تشتغل بتعديل بسيط أو بدون تعديل. والفرق الجوهري: التخزين منفصل عن السيرفرات.

عنوان الكتابة عنوان القراءة: يوزّع على النسخ Writer يقرأ ويكتب Reader 1 يقرأ فقط Reader 2 يقرأ فقط تخزين مشترك: ست نسخ على ثلاث مناطق توفر منطقة توفر A نسخة نسخة منطقة توفر B نسخة نسخة منطقة توفر C نسخة نسخة
سيرفر واحد يكتب وعدة سيرفرات تقرأ، وكلهم يتشاركون تخزين واحد محفوظ بست نسخ على ثلاث مناطق توفر.
  • التخزين: ما تحجز مساحة مسبقاً، فهو يكبر لحاله لين 256 TiB في الإصدارات الحديثة، ويحفظ ست نسخ على ثلاث مناطق توفر.
  • السيرفرات: سيرفر كتابة واحد ولين 15 نسخة قراءة. وبما إنهم يتشاركون التخزين، يكون تأخر النسخ عادةً قليل جداً.
  • التحويل: عند العطل تترقى نسخة قراءة، وعادةً خلال أقل من 30 ثانية.
  • العناوين: عنوان الكتابة يشير دايماً للسيرفر الكاتب، وعنوان القراءة يوزّع على النسخ. وتقدر تسوي عناوين مخصصة، مثلاً تخصص أقوى النسخ للتقارير.
  • توسّع النسخ: تقدر تخلي Aurora تزيد نسخ القراءة وتنقصها حسب الضغط.

ميزات تستاهل تعرفها

الميزة وش تعطيك
Aurora Serverless v2 السعة تكبر وتصغر مع الضغط بدون ما تختار حجم سيرفر. يناسب الضغط المتقلب، ويقدر يوقف وقت الخمول
Global Database Region واحدة للكتابة ولين 10 Regions للقراءة، بتأخر أقل من ثانية عادةً. وترقّي وحدة منهم لو طاحت الأساسية
Cloning نسخة سريعة من الإنتاج للتجربة، تتشارك البيانات وتخزّن التغييرات فقط
Babelfish يخلي Aurora PostgreSQL تفهم لغة T-SQL حقت SQL Server، فيسهّل الانتقال
Aurora ML تنادي نماذج ذكاء اصطناعي من SageMaker أو Bedrock داخل استعلام SQL

RDS أو Aurora؟

تبي اختر
Oracle أو SQL Server أو Db2 أو MariaDB RDS، فـ Aurora متوافقة مع MySQL وPostgreSQL فقط
قاعدة صغيرة بضغط متوسط وتكلفة قليلة RDS
قراءات كثيرة وتحويل سريع وتشغيل عبر Regions Aurora
ضغط متقلب أو تشتغل ساعات محدودة Aurora Serverless v2

وفي التكلفة، سيرفرات Aurora أغلى في الساعة، وطريقة حساب التخزين مختلفة. الخيار القياسي يحسب عمليات القراءة والكتابة، وخيار I/O-Optimized يلغيها مقابل سعر أعلى للسيرفرات والتخزين. فقارن بحاسبة الأسعار على ضغطك الحقيقي.

عملي: قاعدة بيانات خاصة ما يوصلها إلا سيرفرك

بنستخدم السيرفر اللي شغّلته في الجزء الثالث. افتح خدمة Aurora and RDS واضغط Create database:

  1. المحرك: اختر PostgreSQL، وخيار الإعداد اللي يعرض كل التفاصيل بدل الإعداد السريع.
  2. القالب: أرخص قالب متاح، مثل Free tier لو يظهر في حسابك.
  3. الاسم: سمّ القاعدة series-db، وخل اسم المستخدم postgres، واختر Self managed وحط كلمة مرور قوية.
  4. الحجم: db.t4g.micro مع 20 GiB.
  5. الشبكة: اختر Connect to an EC2 compute resource وحدد سيرفرك. RDS تضبط مجموعات الأمان لك، ويبقى الوصول العام مقفل.

انتظر لين تصير الحالة Available، وانسخ Endpoint من تبويب Connectivity & security. ثم ادخل على السيرفر من EC2 Instance Connect:

Bash
sudo dnf install -y postgresql16
psql -h YOUR-DB-ENDPOINT -U postgres -d postgres

وداخل psql سوّ جدول وجرّبه:

SQL
CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  item TEXT NOT NULL,
  created_at TIMESTAMPTZ DEFAULT now()
);

INSERT INTO orders (item) VALUES ('keyboard'), ('screen');

SELECT * FROM orders;

اخرج بـ \q. والحين تأكد إن القاعدة خاصة فعلاً، بتجربة الوصول من CloudShell اللي هو خارج شبكتك:

Bash
timeout 5 bash -c '</dev/tcp/YOUR-DB-ENDPOINT/5432' && echo open || echo closed

المفروض تشوف closed. وخذ لقطة يدوية من CloudShell، وهذا اللي تسويه قبل أي تغيير خطير:

Bash
aws rds create-db-snapshot \
  --db-instance-identifier series-db \
  --db-snapshot-identifier series-db-demo

aws rds describe-db-snapshots \
  --db-snapshot-identifier series-db-demo \
  --query "DBSnapshots[0].[Status,PercentProgress]" --output table

إضافية: جرّب نسخة قراءة

نسخة القراءة تحتاج النسخ التلقائي مفعّل على القاعدة الأساسية، وهي سيرفر مدفوع لحاله، وبعض خطط الحسابات المجانية ما تسمح بهذا. لو حسابك يسمح:

Bash
aws rds modify-db-instance --db-instance-identifier series-db \
  --backup-retention-period 1 --apply-immediately

aws rds create-db-instance-read-replica \
  --db-instance-identifier series-db-replica \
  --source-db-instance-identifier series-db

لما تجهز، اتصل بعنوانها من سيرفرك. بتلقى صفوف جدول orders كلها، ولو حاولت تضيف صف بيرجع لك الخطأ cannot execute INSERT in a read-only transaction.

Bash
aws rds delete-db-instance --db-instance-identifier series-db-replica \
  --skip-final-snapshot

aws rds delete-db-instance --db-instance-identifier series-db \
  --skip-final-snapshot --delete-automated-backups

aws rds delete-db-snapshot --db-snapshot-identifier series-db-demo

الخلاصة

  • RDS تتكفل بالتشغيل والنسخ والتحديثات، وتصميم الجداول والاستعلامات يبقى عليك.
  • Multi-AZ للتوفر وما تقرأ منها، ونسخ القراءة للتوسّع وتأخرها وارد.
  • الاسترجاع ينشئ قاعدة جديدة بعنوان جديد.
  • خل القاعدة في شبكة خاصة، وما تقبل إلا من مجموعة أمان السيرفرات.
  • Aurora تخزين مشترك بست نسخ، ولين 15 نسخة قراءة، وتحويل سريع، بس مع توافق MySQL وPostgreSQL فقط.

اختبر نفسك

قبل ما تكمل، جرّب هذي الأسئلة عشان تتأكد إنك فهمت الجزء. كل سؤال موقف عملي، وبعد ما تجاوب يطلع لك الشرح.

السؤال 1 من 5

قاعدة بيانات PostgreSQL للإنتاج على RDS لازم تستمر لو طاحت منطقة التوفر حقها. والتحويل لازم يكون تلقائي، بدون تغيير نص الاتصال في التطبيق. وش يفعّل الفريق؟

اعرض الجواب

الجواب الصحيح: B

Multi-AZ يبقي نسخة احتياطية متزامنة في منطقة توفر ثانية. ووقت العطل، RDS يوجه نفس اسم DNS لها، فيعيد التطبيق الاتصال بدون أي تغيير.

  • A: نسخة القراءة تحتاج ترقية يدوية، ولها نقطة وصول خاصة فيها.
  • C: الاسترجاع ياخذ وقت، وينشئ قاعدة جديدة بنقطة وصول جديدة.
  • D: السيرفر الأكبر يبقى في منطقة توفر وحدة.

للمراجعة: Multi-AZ ونسخ القراءة في هذا الجزء، وMulti-AZ deployments في وثائق AWS.

السؤال 2 من 5

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

اعرض الجواب

الجواب الصحيح: D

نسخة القراءة تخدم هذي الاستعلامات على سيرفر منفصل، فتبقى قاعدة الإنتاج مرتاحة. وتأخرها البسيط مقبول لهذي التقارير.

  • A: النسخة الاحتياطية في Multi-AZ ما تخدم القراءة.
  • B: هذا يزيد مساحة القرص، والمشكلة في حمل الاستعلامات.
  • C: هذا يعني إعادة تصميم البيانات وكتابة التطبيق من جديد.

للمراجعة: نسخ القراءة في هذا الجزء، وWorking with read replicas في وثائق AWS.

السؤال 3 من 5

مطور شغّل UPDATE غلط على قاعدة RDS للإنتاج الساعة 2:05 مساءً. والنسخ التلقائي شغال. وش يصير لو استرجع الفريق إلى الساعة 2:04؟

اعرض الجواب

الجواب الصحيح: A

الاسترجاع لنقطة زمنية ينشئ دايماً قاعدة جديدة بنقطة وصول جديدة، من النسخ التلقائية وسجلات المعاملات.

  • B: الاسترجاع ما يكتب فوق القاعدة الموجودة.
  • C: النسخ التلقائية تكفي لهذا.
  • D: النسخة الاحتياطية متزامنة، فوصلها نفس الـ UPDATE الغلط.

للمراجعة: النسخ الاحتياطي والاسترجاع في هذا الجزء، وRestoring to a specified time في وثائق AWS.

السؤال 4 من 5

مئات من دوال Lambda تفتح اتصالات قصيرة بقاعدة RDS، ووقت الزحمة تفشل القاعدة لأن الاتصالات كثيرة. أي حل يحتاج أقل تغيير في الكود؟

اعرض الجواب

الجواب الصحيح: C

RDS Proxy يعيد استخدام مجموعة صغيرة من الاتصالات، والتطبيق يتصل فيه كأنه القاعدة نفسها.

  • A: هذا يضيف نسخة احتياطية ما تقبل أي اتصال.
  • B: نسخ القراءة للقراءة فقط، فما تستقبل الكتابة.
  • D: هذا يكبر القرص، والحد هنا في الاتصالات.

للمراجعة: RDS Proxy في هذا الجزء، وAmazon RDS Proxy في وثائق AWS.

السؤال 5 من 5

فريق يشغّل RDS for MySQL ويفكر ينتقل إلى Aurora MySQL. أي عبارتين عن Aurora صحيحة؟ (اختر اثنين.)

اعرض الجواب

الجواب الصحيح: A + D

Aurora يفصل التخزين عن السيرفرات، وطبقة التخزين المشتركة هذي هي اللي تخلي التأخر بسيط والتحويل سريع.

  • B: Aurora متوافق مع MySQL وPostgreSQL فقط.
  • C: سيرفر واحد يكتب، والقراء يقرأون فقط.
  • E: هذا أسلوب نسخ القراءة في RDS، أما قراء Aurora فيتشاركون التخزين.

للمراجعة: Aurora في هذا الجزء، وWhat is Amazon Aurora? في وثائق AWS.

حتى مع قاعدة قوية، تكرار نفس الاستعلام آلاف المرات هدر. في الجزء التاسع نضيف طبقة سريعة قدّامها مع ElastiCache.