ملخص
- تتعلق أهمية حادثة GitLab.com في يناير 2017 بأن تقرير GitLab اللاحق ذكر أن مهندسًا حذف بيانات عن طريق الخطأ من قاعدة بيانات الإنتاج الرئيسية أثناء محاولة إعادة بناء النسخ المتماثلة، ثم اكتشف الفريق أن مسارات النسخ الاحتياطي المقصودة كانت غير متاحة أو غير كاملة أو قديمة أو غير مصممة لاحتياجات الاستعادة هذه.
- سؤال المساءلة هو من كان لديه السيطرة الفعلية على الوصول إلى قاعدة بيانات الإنتاج، والتحقق من صحة النسخ الاحتياطي، وفصل النسخ المتماثلة، وتمارين الاستعادة، والتواصل مع العملاء، وإثبات أن مسار الاستعادة يعمل بالفعل قبل اعتماد العملاء عليه.
- أدلة GitLab العامة مفيدة بشكل غير عادي لأن الشركة نشرت تقريرًا مفصلاً بعد الحادثة، وذكرت إجراءات الاستعادة المعطلة، وربطت بالتحسينات اللاحقة، واعترفت بفقدان البيانات بدلاً من معاملة الحادثة كعطل عادي.
- الدرس ليس أن كل منصة يمكنها تجنب كل خطأ تشغيلي. الدرس هو أن منصة المطورين المستضافة يجب أن تثبت قابلية الاستعادة، لأن مشاريع العملاء والقضايا والتعليقات والحسابات والمقتطفات وسجلات CI وسير العمل هي سجلات أعمال، وليست حالة تطبيق يمكن التخلص منها.
- تعامل هذه المقالة تقرير GitLab اللاحق وسجلات القضايا كأدلة أساسية، ووثائق GitLab وPostgreSQL كمفردات تحكم تقنية، والمواد الأوسع حول التصميم الآمن كدعم لمعيار حوكمة الاستعادة. لا تدعي الوصول إلى سجلات خاصة أو سجلات فقدان العملاء الفردية أو تذاكر التغيير الداخلية الكاملة.
لماذا تنتمي هذه القضية إلى ملف المخاطر والمساءلة
تنتمي GitLab إلى ملف المخاطر والمساءلة لأن حادثة قاعدة بيانات GitLab.com في عام 2017 جعلت جملة بسيطة مستحيلة القبول دون دليل: "لدينا نسخ احتياطية". كانت GitLab.com بالفعل منصة مطورين مستضافة حيث تخزن الفرق البيانات الوصفية للكود المصدري والقضايا وطلبات الدمج والتعليقات والمقتطفات وإعدادات المشروع والمستخدمين والأذونات وحالة سير العمل. عندما تم حذف بيانات قاعدة بيانات الإنتاج عن طريق الخطأ في 31 يناير 2017، لم يكن خطر العملاء محدودًا بعدم التوفر المؤقت. قال تقرير GitLab اللاحق علىhttps://about.gitlab.com/blog/postmortem-of-database-outage-of-january-31/إن الخدمة كانت غير متاحة لعدة ساعات وأن GitLab فقدت تعديلات قاعدة البيانات التي تم إجراؤها بين الساعة 17:20 و00:00 بتوقيت UTC، مع تقديرات أفضل بحوالي 5000 مشروع متأثر، و5000 تعليق، و700 حساب مستخدم جديد. مستودعات Git والويكي كانت غير متاحة أثناء العطل ولكنها لم تتأثر بفقدان البيانات، وفقًا لنفس الحساب العام.
هذا التمييز مهم. كائنات المستودع هي فئة واحدة من سجلات منصة المطورين. حالة التنسيق المخزنة في قاعدة البيانات هي فئة أخرى. قد لا يزال المشروع يحتوي على ارتكازات Git بينما تكون قضاياه وتعليقاته وسجلات المستخدمين والمقتطفات والأذونات وبيانات خط الأنابيب وسياق طلب الدمج غير مكتملة. بالنسبة للعملاء، قيمة المنصة هي العلاقة بين هذه السجلات. لذلك فإن قضية المساءلة ليست فقط ما إذا كانت المستودعات الخام قد نجت. بل ما إذا كانت الخدمة المستضافة يمكنها استعادة سجل التعاون الكامل بعملية استعادة مدعومة بالأدلة.
تعتبر القضية مهمة أيضًا لأن استجابة GitLab العامة كانت شفافة بشكل غير عادي. وصف التقرير اللاحق إعداد قاعدة البيانات، والتسلسل الزمني، والحذف العرضي، وإجراءات الاستعادة المعطلة، وقرار الاستعادة من لقطة LVM، والقضايا اللاحقة. فتحت GitLab في وقت سابق مقالًا عامًا عن "حادثة قاعدة البيانات" علىhttps://about.gitlab.com/blog/gitlab-dot-com-database-incident/وأصبحت القضية العامة علىhttps://gitlab.com/gitlab-com/gl-infra/production/-/issues/1684جزءًا من سجل الحادثة. لم تمح الشفافية فقدان البيانات، لكنها خلقت ملف أدلة نادر للحكم على فشل منصة مطورين.
سؤال السيطرة الفعلية مباشر: من كان لديه السيطرة الفعلية على الوصول إلى قاعدة بيانات الإنتاج، والتحقق من صحة النسخ الاحتياطي، وفصل النسخ المتماثلة، وتمارين الاستعادة، والتواصل مع العملاء، وإثبات أن مسار الاستعادة يعمل بالفعل قبل حدث الحذف؟ لمس العديد من الفاعلين أجزاء من هذا النظام. سيطرت قيادة GitLab على التوظيف والأولويات التشغيلية والتواصل العام. سيطر مهندسو البنية التحتية على إجراءات الإنتاج وكتب التشغيل والوصول وإصلاح النسخ المتماثلة وأدوات النسخ الاحتياطي وتنفيذ الاستعادة. سيطرت فرق المنتج والأعمال على كيفية إبلاغ العملاء وكيفية شرح حدود فقدان البيانات. لم يسيطر العملاء إلا على صادراتهم الخارجية ونسخهم المحلية.
سيطرت المنصة المستضافة على إثبات الاستعادة الحرج.
لهذا السبب تتناسب الحادثة مع موضوعات الاعتماد على الخدمات السحابية، ودورة حياة البرامج والارتباط بها، واقتصاديات أدوات التطوير. تستخدم فرق المطورين المنصات المستضافة لأنها تقلل عبء التشغيل. تنقل هذه المقايضة الأدلة التشغيلية إلى المزود. يمكن للعميل استنساخ مستودع، لكن لا يمكنه التحقق بشكل مستقل من نسخ احتياطية قاعدة بيانات GitLab.com. يمكن للعميل تصدير بعض معلومات المشروع، لكن لا يمكنه اختبار مسار التبديل الداخلي لـ GitLab. يمكن للعميل قراءة صفحة الحالة، لكن لا يمكنه رؤية ما إذا كان المزود قد أجرى مؤخرًا تمرين استعادة. يصبح وعد المزود عنصر تحكم في مخاطر العميل فقط عندما يكون مدعومًا بأدلة حالية ومختبرة ومستقلة.
كان الحذف محفزًا، وليس حدث المساءلة بأكمله
غالبًا ما يختزل السرد العام الحادثة إلى مهندس حذف دليل قاعدة بيانات خاطئ. كان ذلك المحفز المرئي، لكنه لم يكن حدث المساءلة بأكمله. قال تقرير GitLab اللاحق إن الفريق كان يستجيب لتحميل قاعدة البيانات وتأخر النسخ المتماثلة. كانت النسخة الثانوية PostgreSQL متأخرة لأن أجزاء WAL المطلوبة قد أزيلت بالفعل من الأساسي، ولم تكن GitLab.com تستخدم أرشفة WAL. كانت النسخة الثانوية بحاجة إلى إعادة مزامنة يدوية عبر pg_basebackup. خلال ذلك العمل، نوى مهندس مسح دليل بيانات PostgreSQL للنسخة الثانوية، لكنه نفذ العملية المدمرة على الأساسي. توقف الأمر بعد ثانية أو ثانيتين، لكن التقرير اللاحق قال إن حوالي 300 غيغابايت قد أزيلت بالفعل.
يكشف هذا المحفز عن عدة طبقات تحكم. أولاً، كان يجب أن يكون المضيف الأساسي والثانوي واضحين بما يكفي بحيث لا يمكن لمهندس متعب أو مضغوط أن يعمل على الجهاز الخاطئ بسهولة. ثانيًا، كان يجب أن تجعل كتابة التشغيل السلوك المتوقع لـ pg_basebackup واضحًا بما يكفي بحيث لا يُقرأ الانتظار الصامت على أنه فشل بدء. ثالثًا، كانت صيانة قاعدة البيانات المدمرة بحاجة إلى ضمانات إجرائية وتقنية مناسبة لمنصة مستضافة. رابعًا، تأخر النسخ المتماثلة وتغطية أرشيف WAL المفقودة عنيت أن النسخة الثانوية لم تكن إجابة واضحة للتعافي من الكوارث في الوقت الذي كانت فيه مطلوبة بشدة.
تساعد وثائق PostgreSQL الرسمية لـ pg_basebackup علىhttps://www.postgresql.org/docs/9.6/app-pgbasebackup.htmlوالأرشفة المستمرة علىhttps://www.postgresql.org/docs/current/continuous-archiving.htmlفي تأطير المفردات التقنية. النقطة ليست أن PostgreSQL تسببت في الحادثة. النقطة هي أن أدوات قاعدة البيانات توقعت من المشغلين فهم النسخ المتماثلة والاحتفاظ بـ WAL وسلوك النسخ الاحتياطي الأساسي وتصميم الأرشيف تحت الضغط. يجب على مزود المنصة الذي يبني خدمته على هذه الأدوات ترجمة هذا التعقيد إلى إجراءات إنتاج آمنة وكتب تشغيل واضحة واختبارات استعادة.
يدفع صياغة التقرير اللاحق التحليل إلى ما هو أبعد من الخطأ الشخصي. أشار إلى أن pg_basebackup سينتظر بصمت حتى يبدأ الأساسي في إرسال بيانات النسخ المتماثلة وأن هذا السلوك لم يكن موثقًا بوضوح في كتب تشغيل GitLab الهندسية أو في الوثيقة الرسمية وفقًا لحساب GitLab. يهم هذا البيان لأن هدف المساءلة يتحول من "شخص واحد كتب الأمر الخطأ" إلى "نظام التشغيل سمح لإجراء استعادة غامض أن يتحول إلى فقدان بيانات". يجب أن تفترض الخدمة المستضافة أن البشر سيعملون أثناء الحوادث، تحت الضوضاء، بمعلومات غير كاملة، وأحيانًا في وقت متأخر من الليل. يجب تصميم نظام التحكم حول هذه الحقيقة.
أصبح الحذف أيضًا أكثر خطورة لأن نظام الاستعادة لم يكن جاهزًا. يمكن أن يكون الخطأ المدمر قابلاً للنجاة إذا كان هناك نسخة احتياطية مختبرة وحديثة ومستقلة منطقيًا. يصبح حدث فقدان بيانات العملاء عندما يكتشف الفريق أثناء الاستعادة أن عملية النسخ الاحتياطي كانت فاشلة، وأن المراقبة لم تنبه الأشخاص المناسبين، وأن اللقطات كانت قديمة أو غير مصممة للتعافي التفصيلي من كوارث قاعدة البيانات، وأن النسخ المتماثلة لا يمكن استخدامها لأن العملية المدمرة قد أثرت بالفعل على كل من المسارين الأساسي والثانوي. كان الحذف هو الشرارة. أدلة الاستعادة الفاشلة كانت الوقود.
لم يكن مخزون النسخ الاحتياطي نفس إثبات الاستعادة
كان تقرير GitLab اللاحق صريحًا بشأن إجراءات الاستعادة المعطلة. أدرج نسخ pg_dump الاحتياطية إلى Amazon S3، ولقطات LVM المحملة في مرحلة الاختبار، ولقطات قرص Azure لخوادم مختلفة، والنسخ المتماثلة PostgreSQL المستخدمة بشكل أساسي للتبديل بدلاً من التعافي من الكوارث. ثم شرح لماذا لم توفر هذه المسارات الاستعادة التي احتاجتها GitLab. كانت حاوية S3 لنسخ pg_dump الاحتياطية فارغة لأن إجراء النسخ الاحتياطي استخدم أدوات PostgreSQL 9.2 ضد قاعدة بيانات 9.6، مما تسبب في أخطاء. تم إرسال إشعارات الخطأ عبر البريد الإلكتروني، لكن DMARC لم يتم تمكينه لرسائل cron الإلكترونية، لذلك قالت GitLab إن الرسائل رُفضت وكان الفريق غير aware بفشل النسخ الاحتياطي.
لم تكن لقطات قرص Azure ممكّنة لخوادم قاعدة البيانات لأن GitLab افترضت أن إجراءات النسخ الاحتياطي الأخرى كانت كافية. كانت لقطات LVM موجودة، لكن GitLab قالت إنها استُخدمت بشكل أساسي لنسخ بيانات الإنتاج إلى مرحلة الاختبار، وليس كنظام للتعافي من الكوارث.
هذا هو درس المساءلة الأساسي. مخزون النسخ الاحتياطي ليس إثبات استعادة. يمكن أن تبدو قائمة آليات النسخ الاحتياطي مرنة بينما يحتوي كل آلية على اعتماد مخفي، أو جدول زمني قديم، أو مراقبة مفقودة، أو إصدار خاطئ، أو مسار استعادة بطيء، أو غرض مختلف. لا يحتاج العملاء إلى بيان تسويقي بوجود نسخ احتياطية. يحتاجون إلى ضمان أن المزود قد استعاد منها مؤخرًا، وفحصها، وراقب إشارات الفشل، وفصلها عن نفس الخطأ التشغيلي الذي قد يضر الإنتاج.
تعكس وثائق GitLab الحالية للنسخ الاحتياطي والاستعادة هذا التمييز بطريقة عامة. نقطة دخول النسخ الاحتياطي والاستعادة في GitLab علىhttps://docs.gitlab.com/administration/backup_restore/ودليل الاستعادة علىhttps://docs.gitlab.com/administration/backup_restore/restore_gitlab/يؤكدان على المتطلبات الأساسية، وتطابق الإصدار، واستعادة الأسرار، ونسخ الهدف النظيف، وفحوصات السلامة، والحاجة إلى اختبار عملية الاستعادة الكاملة قبل استخدامها في الإنتاج. هذه الوثائق ليست دليلاً بأثر رجعي على أن GitLab.com كانت لديها ضوابط محددة في عام 2017. إنها مفيدة لأنها تظهر ما يجب أن يتعامل معه مسار استعادة جاد: سجلات قاعدة البيانات، والمستودعات، وكائنات التسجيل، والتحف، والتحميلات، والويكي، ومتغيرات CI، والتكوين، والأسرار، والتحقق بعد الاستعادة.
الفرق بين "النسخ الاحتياطي موجود" و"الاستعادة تعمل" مهم بشكل خاص لمنصات المطورين. بيانات GitLab علائقية وتشغيلية. يشير سجل المشروع إلى المستودعات والمستخدمين والمجموعات والأذونات وطلبات الدمج والقضايا وخطافات الويب وحالة CI/CD والملفات الآمنة والتحف والتكاملات الخارجية. استعادة طبقة واحدة دون الأخرى يمكن أن تترك الخدمة حية تقنيًا ولكن مكسورة دلاليًا. لقطة تساعد في اختبار تحميل مرحلة الاختبار قد لا تحافظ على نقطة استعادة نظيفة وقابلة للتدقيق للإنتاج. تفريغ يومي يفشل بصمت بسبب عدم تطابق ثنائي ليس نسخة احتياطية. نسخة متماثلة تشارك نفس الحالة التالفة ليست تعافيًا من الكوارث.
تكشف حادثة GitLab أيضًا مشكلة مراقبة. يجب أن توقع النسخ الاحتياطية الفاشلة الأشخاص المسؤولين عن متانة بيانات العملاء، لا أن تختفي في رسائل بريد إلكتروني مرفوضة. كانت القضية العامة اللاحقة لمراقبة النسخ الاحتياطية بـ Prometheus علىhttps://gitlab.com/gitlab-com/gl-infra/production/-/issues/1095والعمل المرتبط ببناء لوحة تحكم عامة لمراقبة النسخ الاحتياطي خطوات مساءلة لأنها حولت فشل النسخ الاحتياطي غير المرئي إلى حالة قابلة للملاحظة. المراقبة ليست تحسينًا تجميليًا. إنها عنصر التحكم الذي يخبر المزود ما إذا كانت وعود الاستعادة لا تزال موجودة.
تمارين الاستعادة هي عنصر تحكم في المنتج، وليست رفاهية تشغيلية
العبارة الأكثر أهمية في ملف المساءلة هي "قبل حدث الحذف". عملية استعادة يتم اختبارها لأول مرة أثناء فقدان البيانات المباشر ليست عنصر تحكم، بل أمل. بالنسبة لمنصة مطورين، تمارين الاستعادة هي عناصر تحكم في المنتج لأن العملاء يعتمدون على المنصة كسجل للعمل. تظهر قضية GitLab اللاحقة نفسها لاختبار استعادة النسخ الاحتياطية علىhttps://gitlab.com/gitlab-com/gl-infra/production/-/issues/1102وقضية تعيين مالك لمتانة البيانات علىhttps://gitlab.com/gitlab-com/gl-infra/production/-/issues/1163أن GitLab فهمت فجوة الحوكمة. يجب أن يمتلك شخص ما الأدلة على إمكانية استعادة النسخ الاحتياطية، وليس فقط المهمة التي تنشئ ملفات النسخ الاحتياطي.
يجب أن تكون تمارين الاستعادة محددة. يجب أن تثبت استعادة كاملة من أهم فئات النسخ الاحتياطي. يجب أن تقيس وقت الاستعادة ونقطة الاستعادة. يجب أن تختبر توافق الإصدار، واستعادة الأسرار، والتخزين الكائني، وتحف CI، وبيانات حزمة التسجيل، وكائنات LFS، والتحميلات، وسلامة قاعدة البيانات. يجب أن تشمل أساسيًا ملوثًا ونسخة متماثلة فاشلة، لأن الحوادث الحقيقية نادرًا ما تتبع أنظف مسار. يجب أن تنتج سجلات وطوابع زمنية وتحف وموافقة المالك وملخصات مخاطر العملاء. يجب أن تدوم الأدلة بعد المهندس الفردي الذي أجرى الاختبار.
وثائق التعافي من الكوارث و Geo في GitLab علىhttps://docs.gitlab.com/administration/geo/disaster_recovery/ذات صلة هنا لأنها تظهر نوع الدقة الإجرائية المطلوبة عند ترقية النسخ الثانوية والتحقق من حالة النسخ المتماثلة واستعادة بيئة GitLab الموزعة. مرة أخرى، هذه الوثائق ليست نتيجة مباشرة حول حالة الخدمة في عام 2017. إنها مفردات تحكم. التعافي من الكوارث هو تسلسل من القرارات المختبرة، وليس حدسًا بوجود نسخة أخرى في مكان ما.
تضيف وثائق pg_dump في PostgreSQL علىhttps://www.postgresql.org/docs/9.6/app-pgdump.htmlقطعة أخرى من السجل. يمكن أن يكون التفريغ المنطقي مفيدًا، لكن توافق الإصدار والسياق التشغيلي مهمان. قال شرح GitLab العام إن عملية pg_dump استخدمت الإصدار الثنائي الخاطئ لـ PostgreSQL افتراضيًا لأنها عملت على خادم تطبيق بدون دليل بيانات قاعدة البيانات الذي يستخدمه Omnibus لاكتشاف الإصدار. هذا عدم تطابق دورة حياة كلاسيكي: سلوك التعبئة، وسياق مضيف التطبيق، وإصدار قاعدة البيانات، ومراقبة cron، وسياسة البريد الإلكتروني اجتمعت في فشل مخفي. لم يكن على أي مكون أن يكون غريبًا لكي يفشل النسخ الاحتياطي.
لهذا السبب يجب أن يكون إثبات الاستعادة شاملًا. قائمة تحقق تقول إن pg_dump يعمل يوميًا ليست كافية. يجب أن يثبت الاختبار أن المفرغ موجود في الموقع المتوقع، وأنه تم إنتاجه بواسطة الثنائي الصحيح، وأنه يمكن استرجاعه، وأن الأسرار والتكوين متوافقان، وأن نسخة نظيفة يمكنها استيراده، وأن البيانات يمكن التحقق منها، وأن عمليات التطبيق يمكن أن تبدأ، وأن السجلات التابعة منطقية. إذا كان أي جزء من السلسلة مكسورًا، فإن ادعاء استعادة المزود أضعف مما كان يعتقد العملاء.
ينطبق نفس المعيار على اللقطات. يمكن أن تكون لقطات LVM ولقطات القرص السحابية أدوات ممتازة، لكن هدفها وخصائص استعادتها يجب أن تتناسب مع المخاطرة. قال تقرير GitLab اللاحق إن لقطات LVM كانت أساسًا لمرحلة الاختبار وأن اللقطة اليدوية من حوالي ست ساعات قبل العطل أصبحت خيار الاستعادة لأنها قللت فقدان البيانات مقارنة باللقطة اليومية الأقدم. كان ذلك عقلانيًا في الظروف، لكنه يظهر أيضًا لماذا لا ينبغي الخلط بين عملية نسخ مرحلة الاختبار واستراتيجية متانة بيانات العملاء.
الارتباط بمنصة المطورين يغير نموذج الضرر
لم يكن عملاء GitLab.com يستخدمون مجرد حوسبة مستأجرة. كانوا يستخدمون نظامًا اجتماعيًا وتشغيليًا للعمل البرمجي. سجلات قاعدة البيانات المعنية وصفت المشاريع والتعليقات والمستخدمين والقضايا والمقتطفات وسياق طلب الدمج وحالة التنسيق الأخرى. عندما تُفقد هذه السجلات، لا تفقد الفرق مجرد بايتات. يفقدون تاريخ المراجعة والقرارات ومسارات التدقيق وتخصيصات العمل وسياق الإصدار والنسيج الضام بين الكود والناس.
لهذا السبب مهم الارتباط بمنصة المطورين. يمكن للفريق غالبًا استنساخ مستودعات Git، لكن طبقة التعاون على منصة مستضافة أصعب في إعادة الإنتاج. قد تشمل القضايا قرارات المنتج. قد تشمل مناقشات طلب الدمج سياق مراجعة الأمان. قد تشمل التعليقات روابط لحوادث العملاء والاختبارات وأدلة الامتثال أو ملاحظات الإصدار. تشكل سجلات المستخدمين والأذونات من يمكنه التصرف. قد تعكس بيانات CI/CD أي عمل تم اختباره أو نشره. كلما أصبحت المنصة هي نظام السجل لتسليم البرامج، كلما أصبح استعادة قاعدة البيانات التزامًا باستمرارية الأعمال.
وثائق GitLab لاستيراد وتصدير المشروع علىhttps://docs.gitlab.com/user/project/settings/import_export/مفيدة كسياق من جانب العميل. يمكن أن تساعد الصادرات العملاء في الحفاظ على بعض السجلات، لكنها لا تحل محل متانة الإنتاج من جانب المزود. قد يكون التصدير قديمًا أو غير كامل لبعض فئات سير العمل أو غير عملي لتشغيله باستمرار عبر جميع المشاريع. لا ينبغي لمنصة مستضافة أن تحول المسؤولية الأساسية عن التحقق من صحة النسخ الاحتياطي الداخلي إلى العملاء الذين ليس لديهم وصول إلى بنية قاعدة بيانات الإنتاج.
تكثف اقتصاديات أدوات التطوير القضية. تكسب المنصات المستضافة العملاء عن طريق تقليل تكلفة تشغيل التحكم في المصادر و CI وتتبع القضايا والأذونات وبنية التعاون التحتية. يقبل العملاء الاعتماد التشغيلي مقابل السرعة وانخفاض العبء الداخلي. لكن الفائدة الاقتصادية تعتمد على أدلة على أن المزود قد تولى الأجزاء الصعبة بمسؤولية. إذا كان على العملاء بناء أنظمة استمرارية موازية لكل سجل مستضاف لأن المزود لا يستطيع إثبات قدرة الاستعادة، تتغير الاقتصاديات. يظل المزود ملائمًا، لكن علاوة المخاطر الخفية تنمو.
تظهر الحادثة أيضًا أن الارتباط ليس تعاقديًا فحسب، بل هو ذاكرة تشغيلية. تتذكر الفرق أين حدثت المحادثات، وماذا تعني أرقام القضايا، وأي طلب دمج تمت الموافقة عليه، وأي مستخدم قام بإجراء. فقدان تلك الحالة يقطع الثقة في عملية العمل. لذلك فإن عبء الإصلاح يشمل التواصل مع العملاء الذي يخبر الفرق أي فئات من البيانات قد تكون مفقودة، وأي فئات نجت، وما هي الإجراءات المطلوبة من العميل، وما الذي غيره المزود. تضمن تقرير GitLab اللاحق أسئلة شائعة لاستكشاف الأخطاء وإصلاحها لطلبات الدمج والصفحات والمسارات والارتكازات والمشاريع والقضايا. لم يكن ذلك ملحقًا ثانويًا. كان اعترافًا بأنه كان على العملاء التوفيق بين الخدمة المستعادة وسجلات سير العمل الخاصة بهم.
سطح الحالة العامة علىhttps://status.gitlab.com/هو أيضًا جزء من نموذج التحكم هذا. أثناء الحادثة، يحتاج العملاء إلى طوابع زمنية ونطاق وحالة الاستعادة والوظائف المتأثرة. بعد الحادثة، يحتاجون إلى تاريخ محفوظ يمكن مقارنته بالتقرير اللاحق. صفحة الحالة ليست كافية بحد ذاتها، لكنها قناة أدلة ضرورية لاعتماد على خدمة سحابية.
الشفافية حسنت ملف الأدلة لكنها لم تحل محل الإصلاح
تستحق شفافية GitLab بعد الحادثة التقدير دون تحويلها إلى درع. نشرت الشركة تفاصيل قللت من شأنها معظم المزودين: الحذف العرضي، حاوية S3 الفارغة، إصدار pg_dump الخاطئ، رسائل cron الإلكترونية المرفوضة، لقطات قاعدة البيانات غير المتاحة، حدود لقطات LVM، وفقدان البيانات المقدر. أعطى هذا السجل العملاء والصناعة فرصة للتعلم من الحادثة. كما خلق معيارًا يمكن من خلاله الحكم على GitLab.
الشفافية مسؤولة فقط عندما تؤدي إلى إصلاح. ربطت GitLab العمل اللاحق على مراقبة النسخ الاحتياطية، واختبار الاستعادة، وتعيين ملكية متانة البيانات، والتحقيق في أدوات النسخ الاحتياطي PostgreSQL، والاستعادة في نقطة زمنية، واستعادة التدفق، والتعافي من الكوارث خارج قاعدة البيانات. يمكن لتتبع القضايا العام أن يجعل الإصلاح قابلاً للملاحظة. كما يخلق خطرًا: إذا كانت القضايا موجودة ولكنها لم تُغلق بدليل، يصبح التقرير اللاحق قائمة نوايا بدلاً من سجل إصلاح.
القضية العامة علىhttps://gitlab.com/gitlab-com/gl-infra/production/-/issues/1684والقضايا ذات الصلة مثلhttps://gitlab.com/gitlab-com/gl-infra/production/-/issues/1097وhttps://gitlab.com/gitlab-com/gl-infra/production/-/issues/1105مفيدة لأنها تجعل فئات الإصلاح مرئية. هي نفسها لا تثبت الحالة النهائية لكل عنصر تحكم في السنوات اللاحقة. يجب على مقال مسؤول أن يفصل بين الوعد العام بالإصلاح والتنفيذ المثبت. يظهر التقرير اللاحق والقضايا أن GitLab حددت الفئات الصحيحة من الضوابط. لا تكشف عن كل نتيجة اختبار خاص، أو كل تمرين لاحق، أو كل تدقيق داخلي.
يهم هذا التمييز لأن الشفافية العامة يمكن أن تكون مقنعة عاطفيًا. قد تبدو الشركة التي تعترف بخطأ جديرة بالثقة. هذا عادل كإشارة ثقافية، لكن العملاء لا يزالون بحاجة إلى دليل تقني. هل استؤنفت النسخ الاحتياطية بإصدار PostgreSQL الصحيح؟ هل نبهت المراقبة القناة الصحيحة؟ هل تم جدولة اختبارات الاستعادة وإكمالها؟ هل تم تمكين مالك متانة البيانات من منع الإصدارات أو تغييرات البنية التي تضعف الاستعادة؟ هل كانت النسخ المتماثلة منفصلة بما يكفي لدعم التعافي من الكوارث بدلاً من التبديل فقط؟ هل تم تحديث كتب التشغيل والتدرب عليها؟ هل كانت الأوامر المدمرة مقيدة بتحديد المضيف أو المراجعة أو الأدوات؟ هذه أسئلة أدلة، وليست أسئلة نبرة.
إطار NIST للأمن السيبراني علىhttps://www.nist.gov/cyberframeworkوإرشادات CISA للتصميم الآمن علىhttps://www.cisa.gov/resources-tools/resources/secure-by-designمفيدة هنا لأنها تؤطر قابلية الاستعادة كخاصية هندسية. حدد الأصول والاعتماديات. احم الوصول المميز ومسارات التغيير. اكشف فشل النسخ الاحتياطي وتلف البيانات. استجب بإجراءات مدربة. استعد بأدلة مختبرة ومقاسة. عبر حادثة GitLab جميع الوظائف الخمس. المزود الذي يعامل النسخ الاحتياطي كوظيفة خلفية يفوت حقيقة أن الاستعادة هي حلقة حوكمة.
تخلق الشفافية أيضًا قيمة صناعية. أصبح تقرير GitLab اللاحق لعام 2017 حالة مرجعية لسبب أهمية مراقبة النسخ الاحتياطي وتمارين الاستعادة والملكية. لا يعني ذلك أن عملاء GitLab يجب أن يتحملوا تكلفة الدرس. يعني أن السجل العام يساعد فرق المنصات الأخرى على طرح أسئلة أكثر حدة قبل حادثتهم الخاصة. هل النسخ الاحتياطية مختبرة؟ هل فشل المراقبة خارج البريد الإلكتروني؟ هل تمارين الاستعادة موقوتة؟ هل لمالك الاستعادة سلطة؟ هل النسخ المتماثلة أصول تعافي من الكوارث أم مجرد مكونات تبديل؟ هل يتم الخلط بين نسخ بيانات مرحلة الاختبار والنسخ الاحتياطي؟ هل يتم إبلاغ العملاء بما هو قابل للاستعادة وما هو ليس كذلك؟
المساءلة تقع عبر الأشخاص والأدوات والبنية
نموذج اللوم الضيق سيبحث عن مهندس مسؤول واحد. نموذج المساءلة الأقوى يخطط نظام التحكم. كان لدى الشخص الذي كتب الأمر المدمر سيطرة فورية على إجراء خطير. لكن GitLab كمنصة سيطرت على البنية التي سمحت للخطأ بتدمير بيانات العملاء، والمراقبة التي فشلت في كشف النسخ الاحتياطية المعطلة، والتوثيق الذي ترك سلوك الاستعادة غامضًا، ونموذج التوظيف والملكية لمتانة البيانات، والتواصل مع العملاء الذي شرح الفقدان.
الوصول إلى قاعدة بيانات الإنتاج هو حارة واحدة. تحتاج المنصة المستضافة إلى وصول مميز للعمليات الحقيقية، لكن يجب أن تقلل السياق الغامض والقوة المدمرة حيثما أمكن. تسمية المضيف، ومطالبات الصدفة، وخطوات كتابة التشغيل، والمراجعة من الأقران للعمليات غير القابلة للإلغاء، وبيانات الاعتماد المقيدة، وأغلفة الأتمتة يمكن كلها أن تقلل من فرصة العمل على النظام الخاطئ. جادل تقرير GitLab اللاحق بأن التركيز الرئيسي يجب أن يكون على التعافي من الكوارث وجعل المضيف النشط واضحًا بدلاً من مجرد منع المهندسين من تشغيل أوامر معينة. هذا توازن معقول، لأن منع كل أمر مدمر ليس كافيًا.
يجب على المنصة استعادة العديد من أنواع فقدان البيانات، بما في ذلك تلف القرص وعيوب البرمجيات.
تصميم النسخ المتماثلة هو حارة أخرى. يمكن للنسخ المتماثلة تحسين التوفر، لكنها ليست تلقائيًا نسخة احتياطية. قال تقرير GitLab اللاحق صراحةً إن النسخ المتماثلة استُخدمت بشكل أساسي للتبديل وليس التعافي من الكوارث. يجب كتابة هذا الفرق في السياسة التشغيلية. إذا كانت النسخة المتماثلة يمكنها استقبال حالة سيئة أو قديمة أو حذف جزئي، فلا يمكن أن تكون إجابة الاستعادة الوحيدة. إذا كانت أرشفة WAL غائبة، فقد يصبح من الصعب إعادة مزامنة نسخة ثانوية متأخرة بشكل نظيف. إذا لم يتم إقران تمارين التبديل بتمارين الاستعادة، فقد يكتشف الفريق أثناء حادثة أن المكون متاح بالاسم فقط.
التحقق من صحة النسخ الاحتياطي هو حارة ثالثة. حاوية S3 الفارغة لم تكن مجرد مشكلة تخزين. كانت مشكلة تحقق. إصدار pg_dump الخاطئ، والملفات المفقودة، وبريد التنبيه المرفوض، ونقص الوعي شكلوا سلسلة. يمكن لـ Amazon S3 علىhttps://aws.amazon.com/s3/تخزين الكائنات بشكل موثوق، لكنها لا تستطيع إثبات أن المزود أنشأ تفريغ قاعدة البيانات الصحيح، ورفعه، واحتفظ به، ونبه على الفشل، واستعاده. التخزين الكائني هو قطعة واحدة من التحكم. دليل الاستعادة هو التحكم بأكمله.
الملكية هي الحارة النهائية. قضية تعيين مالك لمتانة البيانات التقطت حقيقة حوكمة: تتحلل الضوابط عندما لا يملك أحد إثباتها. يمكن أن تستمر مهام النسخ الاحتياطي في العمل بينما لا أحد يعرف ما إذا كانت الاستعادة تعمل. يمكن للوحات القيادة إظهار إشارات خضراء تقيس إنشاء الملف ولكن ليس قابلية الاستعادة. يمكن أن توجد كتب التشغيل دون تدريب. لا يحل المالك المسمى كل شيء، لكنه يخلق نقطة بشرية وتنظيمية حيث يمكن طلب الأدلة.
الأدلة العامة لها حدود يجب أن تظل مرئية
حد الأدلة مهم. تقرير GitLab اللاحق هو مصدر عام أساسي لما قالته GitLab إنه حدث، وما قدرت فقدان البيانات، وما هي مسارات الاستعادة التي فشلت. ليس سجلاً جنائيًا كاملاً. لا يشمل السجل العام كل سطر من سجل الصدفة، أو كل سجل بنية تحتية، أو كل بريد cron فاشل، أو كل حدث تدقيق S3، أو كل سجل عميل متأثر، أو كل رسالة Slack داخلية، أو كل أثر اختبار استعادة لاحق. تظهر القضية العامة والقضايا المرتبطة فئات الإصلاح، لكن ليس بالضرورة الحالة النهائية لجميع الضوابط في السنوات اللاحقة.
يجب أن تتجنب كتابة المساءلة المسؤولة الاتهامات غير المدعومة. يدعم السجل العام القول إن GitLab أزالت عن طريق الخطأ بيانات قاعدة بيانات الإنتاج، وفقدت بعض تعديلات قاعدة البيانات، واكتشفت مسارات نسخ احتياطي معطلة أو غير كافية. يدعم القول إن مساءلة إثبات الاستعادة كانت الدرس المركزي. لا يدعم الادعاء بأن المستودعات فقدت عندما قالت GitLab إن مستودعات الكود والويكي كانت غير متاحة لكنها لم تتأثر بفقدان البيانات. لا يدعم تعيين نية خبيثة. لا يدعم التأكيد على انتهاك تنظيمي دون نتيجة تنظيمية عامة.
عدم اليقين يعمل في كلا الاتجاهين. قد لا يتمكن العملاء من إثبات المدى الكامل لكل سجل مفقود من المصادر العامة. قد تكون GitLab قد أكملت أعمال إصلاح لاحقة غير مرئية بالكامل في مجموعة أدلة المقال. لهذا السبب فإن الاستنتاج الأكثر دفاعية يتعلق بالحوكمة وليس الدافع الخفي: تصبح وعود النسخ الاحتياطي ضوابط مخاطر العملاء فقط عندما يكون دليل الاستعادة حاليًا ومختبرًا ومستقلاً تشغيليًا.
لا ينبغي أيضًا معاملة الحادثة كسبب لرفض المنصات المدارة للمطورين بشكل قاطع. يمكن للأنظمة المدارة ذاتيًا أن تفشل أيضًا، غالبًا بإفصاح عام أقل. الدرس هو طلب أدلة متناسبة مع الاعتماد. يجب على المنصات المستضافة نشر تقارير الحوادث وأهداف الاستعادة ونطاق النسخ الاحتياطي وتواصل الحالة. يجب على عملاء المؤسسات طرح أسئلة تعاقدية والعناية الواجبة حول التحقق من صحة النسخ الاحتياطي وتصدير البيانات واختبارات الاستعادة والاحتفاظ وإشعار الحوادث. يجب على الفرق الهندسية الاحتفاظ بصادراتها أو مراياها عندما تتطلب الحالة التجارية ذلك. تعمل المسؤولية المشتركة فقط عندما يتم مشاركة الأدلة بما يكفي للسماح لكل طرف بالتصرف.
تظهر وثائق GitLab الخاصة، من إجراءات الاستعادة إلى التعافي من الكوارث Geo، أن الاستعادة نظام معقد. أظهر حدث 2017 ما يحدث عندما يُفترض النظام بدلاً من إثباته. هذه هي القيمة الدائمة لملف المساءلة.
ما يتطلبه الإصلاح القابل للتحقق
اختبار الإصلاح الدائم لهذه القضية له عدة أجزاء. أولاً، يجب مراقبة إنشاء النسخ الاحتياطي للتأكد من صحته، وليس فقط جدولته. يجب أن تثبت مهمة النسخ الاحتياطي أنها عملت بإصدار الأداة المتوقع، وأنتجت أثرًا usable، ورفعته إلى الموقع المتوقع، واحتفظت به وفقًا للسياسة، وأنشأت تنبيهًا عبر قناة موثوقة إذا فشلت أي خطوة. ثانيًا، يجب إجراء اختبارات الاستعادة وفقًا لجدول زمني وبعد تغييرات البنية الرئيسية. يجب أن تنتج أدلة على أن بيئة جديدة يمكن أن تصبح مثيل GitLab عامل ببيانات مفككة التشفير ومستودعات متسقة وتحف سليمة وحالة مشروع قابلة للاستخدام.
ثالثًا، يجب فصل التعافي من الكوارث عن النسخ المتماثلة العادية. الاستعداد السريع مفيد، لكن الاستعادة في نقطة زمنية وأرشفة WAL والنسخ الاحتياطية غير القابلة للتغيير واللقطات المختبرة بشكل مستقل تجيب على مخاطر مختلفة. قضية التحقيق في WAL-E علىhttps://gitlab.com/gitlab-com/gl-infra/production/-/issues/494وقضية بناء استعادة قاعدة بيانات متدفقة علىhttps://gitlab.com/gitlab-com/gl-infra/production/-/issues/1139توضح فئات الإصلاح التي كانت GitLab تنظر فيها. يمكن أن تتغير الأداة المحددة. لا يتغير مطلب الأدلة.
رابعًا، يجب أن تفترض إجراءات الإنتاج المميزة الخطأ البشري. مطالبات المضيف وعلامات البيئة ووضوح كتابة التشغيل وأوضاع المحاكاة الجافة وتأكيد الأقران للإجراءات المدمرة والأتمتة يجب أن تقلل العمليات الغامضة. لكن يجب أن يفترض التصميم أيضًا أن بعض الأحداث المدمرة ستحدث في النهاية. برنامج استعادة يعتمد على سلوك مشغل مثالي ليس برنامج استعادة.
خامسًا، يجب أن يكون التواصل مع العملاء محددًا بما يكفي لدعم الإصلاح النهائي. ساعدت الأسئلة الشائعة لاستكشاف الأخطاء وإصلاحها في GitLab العملاء على فهم طلبات الدمج والصفحات والمسارات والارتكازات والمشاريع بعد الاستعادة. يجب أن يحافظ التواصل المستقبلي للحوادث على نفس الانضباط: فئات البيانات المتأثرة، الإطار الزمني المعرض للخطر، السجلات التي نجت، إجراءات العميل الموصى بها، ما لا يزال غير معروف، وما غيره المزود.
أخيرًا، يجب أن تكون بطاقة الأداء قابلة للتدقيق. لا يحتاج المزود إلى نشر مخططات البنية التحتية الحساسة، لكن يمكنه نشر ملخص لنطاق النسخ الاحتياطي وإيقاع اختبار الاستعادة والتزامات مراجعة الحوادث وأدلة الإغلاق. العملاء الذين يعهدون إلى منصة بسجلات تسليم البرامج يحق لهم معرفة ما إذا كانت ادعاءات استعادة المزود حقائق مختبرة.
يجب أن تنجو نفس بطاقة الأداء من تبديل الموظفين وتغيير البنية. غالبًا ما تفشل أنظمة النسخ الاحتياطي بصمت عندما ينتقل الأشخاص الذين بنوها إلى فرق أخرى، أو عند ترقية قواعد البيانات، أو عند إعادة تسمية حاويات التخزين الكائني، أو عندما تتغير سياسات بيانات الاعتماد، أو عندما يترك ترحيل الطوارئ كتاب تشغيل قديم. أظهرت حادثة GitLab كيف يمكن لعنصر التحكم أن يبدو موجودًا في الرسم التخطيطي بينما مسار الاستعادة القابل للاستخدام غير مؤكد عمليًا.
لذلك يحتاج البرنامج الدائم إلى أدلة دورية مستقلة عن فريق الحادثة الأصلي: سجلات استعادة حديثة، وملكية حالية، وتوجيه تنبيهات حالي، وفحوصات احتفاظ حالية، وافتراضات استعادة مواجهة للعملاء تتطابق مع المنصة كما تعمل فعليًا.
يهتم ذلك لأن العملاء لا يشترون وعود إصلاح GitLab لعام 2017؛ هم يعتمدون على وضع الاستعادة الحالي للمزود. السؤال المسؤول بعد كل تغيير لاحق في المنصة هو ما إذا كانت أدلة النسخ الاحتياطي والاستعادة تغيرت معه. يمكن لتغيير إصدار قاعدة البيانات، أو ترحيل التخزين، أو طرح Geo، أو إعادة تصميم تحف CI، أو تغيير نموذج الأذونات أن يغير سلوك الاستعادة. إذا تم التعامل مع اختبار الاستعادة كاستجابة لمرة واحدة للإحراج، فإن المنظمة تنجرف في النهاية نحو الافتراض. إذا تم التعامل معه كعنصر تحكم دائم، يصبح فشل 2017 تحسينًا دائمًا للحوكمة بدلاً من درس تاريخي.
تظل قضية GitLab مهمة لأنها حولت فشلًا تشغيليًا محرجًا إلى اختبار مساءلة واضح. الخطأ المرئي كان الحذف العرضي. الفشل الأعمق كان أن ادعاءات النسخ الاحتياطي لم تكن مدعومة بدليل استعادة حالي. الإرث البناء هو نفس التحذير: منصة المطورين تكسب الثقة ليس من خلال الوعد بأن لا أحد سيرتكب خطأ أبدًا، ولكن من خلال إثبات أن الأخطاء يمكن حصرها واستعادتها والتواصل معها والتعلم منها قبل أن يكتشف العملاء الفجوة في الإنتاج.
ما يجب أن يسأله العملاء بعد حادثة نسخ احتياطي
درس العميل ليس طلب يقين مستحيل من كل مزود. درس العميل هو طلب أدلة تتطابق مع الاعتماد. إذا كانت منصة المطورين المستضافة هي نظام السجل للقضايا والمراجعات والمستخدمين وإعدادات المشروع وبيانات CI الوصفية، يجب على العميل أن يسأل عن فئات البيانات المضمنة في النسخ الاحتياطية للمزود، وعدد مرات إنشاء النسخ الاحتياطية، وعدد المرات التي يتم استعادتها في الاختبار، وماذا تعني أهداف نقطة الاستعادة ووقت الاستعادة للمزود عمليًا، وما إذا كان التعافي من الكوارث منفصلاً عن النسخ المتماثلة العادية. هذه الأسئلة تشغيلية، وليست احتفالية.
يجب أن تميز لغة المشتريات أيضًا بين التصدير والاستعادة من المزود. يمكن أن يكون تصدير العميل مفيدًا للترحيل أو الحجز القانوني أو المرونة المحلية. لا ينبغي الخلط بينه وبين بديل لاستعادة الإنتاج. تعتمد الصادرات عادةً على جدولة العميل وحدود API وأنواع الكائنات المدعومة وحالة الخدمة في وقت التصدير. يعتمد تعافي المزود على نسخ احتياطية لقاعدة البيانات وتخزين المستودعات وتخزين الكائنات والأسرار والتكوين والتنسيق المختبر. كلاهما مهم. يجيبان على مخاطر مختلفة.
يجب على عملاء المؤسسات أن يسألوا كيف يعمل تواصل الحالة أثناء حوادث فقدان البيانات. تحديث توفر عام ليس كافيًا عندما تكون المسألة فقدان محتمل للسجلات. يحتاج العملاء إلى طوابع زمنية وفئات البيانات المتأثرة والإطارات الزمنية والاستثناءات المعروفة وخطوات التوفيق الموصى بها وتقرير ما بعد الحادثة يفصل الحقائق المؤكدة عن المجهولات. يجب أن يسألوا أيضًا ما إذا كان المزود لديه تاريخ حوادث محفوظ وما إذا كان يمكن التحقق من التزامات ما بعد الحادثة لاحقًا. المزود الذي ينشر تقريرًا شفافًا بعد الحادثة لكنه لا يغلق حلقة الإصلاح يترك العميل بسرد جيد وضمان غير مكتمل.
يجب أن تسأل الفرق التقنية ما إذا كان المزود يمكنه إثبات الاستقلال بين آليات النسخ الاحتياطي. قاعدة بيانات متماثلة وتفريغ منطقي ولقطة قرص وتجديد مرحلة اختبار وتصدير هي أدوات مختلفة. لكل منها دور ووضع فشل وطريقة اختبار. أظهرت حادثة GitLab كيف يمكن لعدة آليات مسماة أن توجد بينما مسار الاستعادة القابل للاستخدام لا يزال يعتمد على لقطة موجهة لمرحلة الاختبار قديمة. لا يحتاج العميل إلى كل أمر داخلي، لكن يمكنه أن يسأل ما إذا كان المزود يختبر على الأقل مسارًا واحدًا ينجو من خطأ المشغل والتلف المنطقي وفقدان بيانات الاعتماد وفشل الأساسي.
السؤال النهائي من جانب العميل هو ما إذا كانت المنظمة لديها خطة استمرارية دنيا خاصة بها للسجلات التي لا يمكنها تحمل خسارتها. قد يعني ذلك مرايا مستودعات محلية وصادرات مشروع دورية ونسخ احتياطية خارجية للقضايا للبرامج الحرجة أو شروط تعاقدية تتطلب الإشعار وأدلة الاستعادة. هذه التدابير لا تزيل مسؤولية المزود. تجعل الاعتماد صريحًا. المسؤولية المشتركة الناضجة تعني أن المزود يثبت مسار استعادته ويقرر العميل أي السجلات تتطلب نسخة إضافية خارج المنصة.

