انتقل إلى المحتوى
use-cases / snapshot-before-migration / hero
USE CASE / SNAPSHOT BEFORE MIGRATION

خذ لقطة للحاوية قبيل الترحيل الليليّ مباشرةً

أضف قيد hoody-cron يُطلق قبل خمس دقائق من مهمّة الترحيل عند 03:00. يستدعي رابط اللقطات بـ curl ويُعلّم الأثر بوصفه نقطة الاسترجاع. إن فشل الترحيل، تستعيد الوضع في 30 ثانية بأمر PATCH واحد.

اقرأ توثيق cron + اللقطات
use-cases / snapshot-before-migration / mechanism

رابطان وعادة قبل النوم

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

POST cron/entries
المُجدوِل
# تسجيل وظيفة اللقطة المتكررة (إعداد لمرة واحدة)
curl -X POST \
  cron.containers.hoody.com/users/root/entries \
  -H "Content-Type: application/json" \
  -d '{
    "schedule": "55 2 * * *",
    "command": "curl -X POST $SNAP_URL -d '{\"alias\":\"rollback-point\"}'",
    "comment": "pre-migration snapshot"
  }'
يُطلق
POST containers/[id]/snapshots
المُجمِّد
# ما يلتف حول حدث cron كل ليل بـ 02:55 UTC
curl -X POST \
  api.hoody.com/api/v1/containers/$ID/snapshots \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"alias": "rollback-point", "expiry": 7}'

# استجابة من خدمة اللقطات
200 OK · snap-2026-05-04 created in 8s

قيد cron مجرّد صفّ في جدول Postgres في مكان ما داخل Hoody. رابط اللقطات يكتب نقطة محتوى مُعنونة في الواجهة الخلفيّة لتخزين الحاوية. كلاهما دائم، كلاهما يحمل نسخاً، ولا يحتاج أيّ منهما إلى عمليّة طويلة العمر على حاسوبك المحمول.

use-cases / snapshot-before-migration / anatomy

تشريح الليلة الماضية

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

0102:55:00Zينطلق cronschedule: 55 2 * * *
0202:55:08Zتصل اللقطةalias rollback-point
0303:00:00Zينفّذ الترحيلALTER TABLE invoices
0403:01:42Zيُغلق التدقيقاللقطة محتفظ بها 7 أيّام

إن فشلت الخطوة 03، الاسترجاع هو `PATCH /snapshots/snap-2026-05-04` وعدت إلى 02:55:08Z. الخطّ الزمنيّ للتدقيق أعلاه هو نفس البيانات، مُقدَّمة بصيغة JSON.

use-cases / snapshot-before-migration / powers

ما يفتحه هذا الشكل

ليس اللقطة بحدّ ذاتها. الشكل: نسخة احتياطيّة موجودة قبل التغيير، مُعنونة برابط، باسم يحتوي تاريخ اليوم.

01 / أمان

النسخة الاحتياطيّة تسبق التغيير، بخمس دقائق بالضبط

أغلب تحقيقات الانقطاع تبدأ بـ «نسينا أن نأخذ نسخة احتياطيّة». حين تكون النسخة قيد cron، لا يمكنك أن تنسى. لقطة 02:55 هي الجملة الأولى في دليل التشغيل، مكتوبة سلفاً.

02 / سرعة

الاسترجاع PATCH واحد، لا دليل من 40 خطوة

استرجاع snap-2026-05-04 مكالمة HTTP واحدة على api.hoody.com. تعود الحاوية إلى حالتها عند 02:55:08Z في أقلّ من 30 ثانية. لا تذكرة، لا تصعيد للمناوب، لا «من يملك وحدة تحكّم AWS».

03 / تكلفة الخمول

إن نجح الترحيل، اللقطة لا تكلّف شيئاً

اللقطات مُعنونة بالمحتوى ومخزّنة كفروق. فرق 412 MB فوق قرص أساس لم يتغيّر هو ما تدفع مقابله، وفقط طوال نافذة احتفاظ مدّتها 7 أيّام. الترحيلات الناجحة تترك أثراً يكاد لا يُذكر.

use-cases / snapshot-before-migration / rollback

الاسترجاع، قبل وبعد

كيف كان دليل التشغيل يبدو، وإلى ماذا ينطوي حين تكون اللقطة مسمّاة بتاريخ اليوم وقابلة للمخاطبة كرابط.

دليل قديم9 خطوات يدويّة، 20-40 دقيقة، 1-2 من البشر
  • 01
    نبّه DBA المناوب، أكّد أنّ الترحيل كسر الإنتاجالوسيط: 4 دقائق للإقرار
  • 02
    ابحث عن أحدث نسخة احتياطيّة في وحدة تحكّم AWSآمل ألّا يكون عمرها أكثر من 24 ساعة
  • 03
    شغّل نسخة استعادة، انتظرها حتى تصبح متّصلة8-15 دقيقة على db.r6g.xlarge
  • 04
    اعكس ALTER TABLE يدويّاً بسكربت DOWN مكتوب باليدإن وُجد سكربت DOWN، وعادةً لا يوجد
  • 05
    أعد تشغيل خوادم التطبيق، فرّغ التخزين المؤقّت، راقب معدّلات الأخطاءواكتب التقرير اللاحق
متوسّط زمن الاسترجاع، حوادث ops@acme 2024: 27 دقيقة
دليل جديدمكالمة HTTP واحدة، ~30 ثانية، 0 من البشر
# rollback last night's migrationcurl -X PATCH api.hoody.com/api/v1/containers/$ID/snapshots/snap-2026-05-04# response200 OK · حاوية استرجعت إلى snap-2026-05-04 في 28 ثانية
PATCH عمليّة قابلة للتكرار وعكسيّة

العمود الجديد على اليمين ليس أداة. هو جملة واحدة في دليل تشغيل. الجملة لا تبدأ بـ «أوّلاً، خذ نسخة احتياطيّة» لأنّ النسخة موجودة سلفاً.

use-cases / snapshot-before-migration / punchline

خطّة الاسترجاع رابط جدولت وجوده.

قبل: صفحة Notion لا يقرؤها أحدبعد: صفّ في cron ونقطة في تخزين الكائنات
قديمأوّلاً، خذ نسخة احتياطيّةالجملة الأولى في الدليل، يُنفّذها يدويّاً عند 03:02 إنسان متعب
جديدالنسخة الاحتياطيّة موجودة سلفاً، مسمّاة بتاريخ اليوم، أُخذت قبل خمس دقائق من التغييرالجملة الأولى في الدليل، كتبها سلفاً قيد cron
شاهد API اللقطات
use-cases / snapshot-before-migration / replaces

ما يحلّ محلّه

تقاليد ما قبل الترحيل من نسخ احتياطيّة. اجدول اللقطة، ونم في نافذة الترحيل.

  • لقطات يدويّة قبل الترحيلاستيقاظ عند 02:54 للضغط على زرّ النسخ الاحتياطيّ
  • بنود قائمة في دليل التشغيلالخطوة 1 من 14 في صفحة لا أحد يجدها
  • مناوب على أهبّة الاسترجاعادفع لمهندس لينتظر لا شيء
  • pg_dump مرتجل قبل النشرأمل أن تكون قد تذكّرت، أمل أن يكون قد انتهى
  • إصدارات «سنحرص فحسب»التفاؤل الذي يشحن الحوادث
  • لقطات AWS RDS التلقائيّةنافذة 5 دقائق ثابتة، تُحاسب بالـ GB-day
use-cases / snapshot-before-migration / cta

خطّة الاسترجاع رابط جدولت وجوده.

اقرأ مرجع اللقطات
use-cases / snapshot-before-migration / related

اقرأ الآخرين