مبدأ الـ Durability
السلام عليكم ورحمة الله وبركاته
المقدمة
- مبادئ الـ ACID في إدارة الـ Transactions
- مبدأ الـ Atomicity
- مبدأ الـ Consistency
- مبدأ الـ Isolation - مستويات العزل
- مبدأ الـ Isolation - أنواع الـ Locks
- مبدأ الـ Durability (أنت هنا)
حسنًا لقد وصلنا لأخر مبدأ في الـ ACID وهو مبدأ الـ Durability
لا تقلق لن أطيل عليك سيكون خفيفًا ونظريًا مثل مبدأ الـ Consistency
لأن مبدأ الـ Durability هو مبدأ موجه للأشخاص الذين يقومون بتطوير الـDatabase Management System مثل MySQL أو PostgreSQL أو MongoDB
وكيف يحققون هذا المبدأ في قواعدهم
لكن يمكنك تحقيقه بنفسك عن طريق توفير نوع من الـ Backup لقاعدة البيانات الخاصة بك
مبدأ Durability هو آخر مبدأ من مبادئ الـ ACID، وهو يضمن أن جميع العمليات
التي تمت داخل Transaction لن تُفقد حتى في حالة حدوث عطل أو انقطاع مفاجئ في النظام
بمعنى آخر، عند تنفيذ Transaction بنجاح ووصولها إلى مرحلة COMMIT، فإن جميع
التعديلات على قاعدة البيانات يجب أن تُحفظ فعلًا في الـ Database
لأنك عندما تقول لي أنك قمت بعمل COMMIT بنجاح فهذا يعني أنك فعلًا قمت بتنفيذ الـTransaction بنجاح وقمت بحفظ البيانات في الـ Database
لا تقول لي لقد تم العملية بنجاح وبعد لحظات يحدث انقطاع في الكهرباء أو أن الـServer تعطل
ثم نفاجيء بأن البيانات لم يتم حفظها فعليًا برغم من أنك قمت بعمل COMMIT وجاءتك
رسالة أن العملية تمت بنجاح
هذا ما يعنيه مبدأ الـ Durability أنك عندما تقول لي أنك قمت بعمل COMMIT بأنك
تضمن لي أن البيانات قد تم حفظها
ولو حدث أي كارثة فإن البيانات ستكون موجودة ولن تفقد
لمن يهم هذا المبدأ ؟
كما قلنا في المقدمة أن هذا المبدأ موجه بشكل أكبر للأشخاص الذين يقومون بتطوير الـ Database Management System مثل MySQL أو PostgreSQL أو MongoDB
وكيف يحققون هذا المبدأ في قواعدهم
لكن يمكنك أنت أيضًا تحقيقه بنفسك عن طريق توفير نوع من الـ Backup لقاعدة البيانات الخاصة بك
كيف يعمل مبدأ Durability ؟
كل أنظمة قواعد البيانات سواء كانت MySQL أو PostgreSQL أو MongoDB تحاول
تحقيق مبدأ Durability بطرق مختلفة
بعض الأنظمة تخزن البيانات في الذاكرة العشوائية RAM وبعد ما تقوم بعملCOMMIT تقوم بنقل البيانات من الـ RAM إلى الـ Database
وهذا غير مضمون للـ Durability لأن طالما أن البيانات والتعديل في الـ RAM فسوف
تفقدها في حالة حدوث أي عطل
الأسلوب الأفضل هو أن تخزنها في الـ Hard Disk مباشرة ثم بعد الـ COMMIT تقوم
بنقلها إلى الـ Database
لذا في حالة حدوث أي عطل فإن البيانات ستكون موجودة في الـ Hard Disk ويمكنك
استعادتها
تقنيات تحقيق الـ Durability
يمكننا تحقيق مبدأ الـ Durability بعدة تقنيات وأساليب، منها:
Write-Ahead Logging (WAL)
تسجل جميع العمليات في ملف Log File في الـ Hard Disk قبل تنفيذها أو نقلها إلى
الـ Database مما يتيح استعادة البيانات في حال حدوث أي خطأ
يعد الأكثر شيوعًا واستخدامًا في تحقيق مبدأ الـ Durability
وطريقة عمله ببساطة هي أنه يقوم بتسجيل جميع العمليات التي تمت داخل الـTransaction في ملف Log قبل تنفيذها
ثم في حالة الـ COMMIT يقوم بنقل البيانات من الـ Log إلى الـ Database
في حالة حدوث أي عطل فإنه يمكنك استعادة البيانات من الـ Log
شكل الملف يكون أشبه بملفات الـ Migration الخاصة بالـ Database التي تحدثنا
عنها في مقالة
شرح الـ Database Migration لإدارة التغييرات
[2025-02-17 10:00:00] TXN-ID: 101 | BEGIN
[2025-02-17 10:00:01] TXN-ID: 101 | UPDATE users SET balance = 500 WHERE id = 5
[2025-02-17 10:00:02] TXN-ID: 101 | COMMIT
[2025-02-17 10:05:00] TXN-ID: 102 | BEGIN
[2025-02-17 10:05:01] TXN-ID: 102 | INSERT INTO orders (product, price) VALUES ('Laptop', 1500)
[2025-02-17 10:05:02] TXN-ID: 102 | COMMIT
هذا مثال بسيط على كيفية تسجيل العمليات في ملف Log
وبالطبع هذا شكل تخيلي لأن الـ Log يحتوي على العديد من المعلومات الأخرى ويختلف
شكل الـ Log من قاعدة بيانات لأخرى
وهذه الطريقة ستجدها في كل DBMS تقريبًا:
- ملف
WALفيPostgreSQL - ملف
BinlogفيMySQL - ملفات
idfوmdfفيSQL Server
معلومة مهمة: هذه الملفات تحتفظ بكل العمليات التي تمت في الـ Database
حتى لو قمت بحذفها من الـ Database
سواء تم تنفيذها داخل Transaction أو لا، لذا أحيانًا تستطيع استعادة البيانات بعد حذفها
لكن استعادتها ستكون بشكل يدوي عن طريق قراءة هذه الملفات وتنفيذ العمليات التي تمت فيها
Asynchronous Snapshots
يقوم بعمل نسخة احتياطية من الـ Database بشكل دوري ومتكرر لضمان عدم فقدان
البيانات في حالة الأعطال
بالتالي عند حدوث أي عطل يمكنك استعادة البيانات من أحدث نسخة احتياطية والأمر يكون أشبه بالـ Backup
فلو افترضنا أن السيرفر تعطل في الساعة 03:00 وآخر نسخة احتياطية Snapshot كانت
في الساعة 02:30
فبديهيًا أنك يمكنك استعادة البيانات من هذه النسخة الاحتياطية فقط بالتالي ستفقد
البيانات التي تمت بعد الساعة 02:30
في Redis تستخدم هذه التقنية مع الـ Append Only Files لتحقيق مبدأ الـ Durability
وبالطبع قد تجمع بعض الـ Database Management System بين Write-Ahead Logging
وAsynchronous Snapshots لتحقيق الـ Durability أيضًا
Append Only Files (AOF)
مثل الـ WAL لكنه يستخدم في Redis وما يشبهها لتسجيل تسلسل العمليات التي تم
تنفيذها
في الحقيقة الـ Append Only Files تم تصميمه ليناسب Redis وشبيهاتها
أعني هنا أنظمة الـ In-Memory Database تستخدم هذه التقنية لتحقيق مبدأ الـDurability
عن طريق مزامنة التغيرات التي تحدث في الـ Database مع الـ Append Only Files
كيف تحقق الـ Durability بنفسك ؟
بجانب ما تقدمه قواعد البيانات من آليات داخلية، يمكنك أيضًا:
- إعداد نسخ احتياطية دورية لقاعدة البيانات
- استخدام خدمات النسخ الاحتياطي السحابية مثل
AWS RDSأوGoogle Cloud SQL - تفعيل الـ
Replicationلنسخ البيانات على أكثر من سيرفر - استخدام أنظمة تخزين موثوقة مثل
RAIDللحماية من فشل الأقراص
ملخص
- مبدأ الـ
Durabilityيضمن أن البيانات المحفوظة لن تُفقد حتى عند حدوث أعطال - عندما تحصل على
COMMITناجح، يجب أن تثق أن البيانات محفوظة فعلًا - التقنيات الرئيسية لتحقيقه:
Write-Ahead Logging (WAL)Asynchronous SnapshotsAppend Only Files (AOF)
- يمكنك تعزيز الـ
Durabilityعن طريق النسخ الاحتياطية والـReplication