پرش به محتوای اصلی
آبیدرنت
کوردیشروع پروژه
بازگشت به آکادمی
مهندسی نرم‌افزار · ۶ دقیقه مطالعه

اصول مهاجرت دیتابیس بدون داون‌تایم؛ استراتژی‌های Zero-Downtime در پروداکشن

سوران منصوری
توسعه‌دهنده بک‌اند
پروفایل
نمودار فرآیند مهاجرت دیتابیس بدون داون‌تایم با الگوی Expand and Contract در آبیدرنت

راهنمای فنی مهاجرت دیتابیس بدون قطعی سرویس در محیط پروداکشن؛ بررسی الگوهای Expand and Contract و مدیریت ایندکس‌های سنگین در آبیدرنت.

در پروژه‌های در حال سرویس‌دهی، هرگونه تغییر در ساختار جداول پایگاه داده (Schema Changes) می‌تواند به قفل شدن جداول (Table Lock)، کندی شدید کوئری‌ها یا حتی از دسترس خارج شدن موقت سرویس بینجامد. رویکرد سنتی «قرار دادن سایت در حالت تعمیرات» برای کسب‌وکارهای مدرن پذیرفته نیست. اجرای ایمن مهاجرت دیتابیس در محیط عملیاتی، نیازمند معماری گام‌به‌گام و رعایت اصول عدم قطعی (Zero-Downtime Migration) است.

در این یادداشت فنی، راهکارهای اجرایی و استاندارد ارتقای پایگاه داده بدون توقف سرویس را بررسی می‌کنیم:

۱. الگوی بازسازی مرحله‌ای (Expand and Contract Pattern) بزرگ‌ترین اشتباه در اعمال تغییرات ساختاری، حذف یا تغییر نام مستقیم ستون‌ها در یک مرحله است. این الگو عملیات را به سه فاز مجزا تقسیم می‌کند:

  • فاز گسترش (Expand): ستون یا ساختار جدید بدون دستکاری ستون‌های قدیمی اضافه می‌شود. در این مرحله، نسخه جدید کد روی سرور هم در ستون قدیمی و هم در ستون جدید می‌نویسد (Dual Writing).
    • فاز انتقال داده (Migrate): داده‌های رکوردهای قدیمی با اسکریپت‌های پس‌زمینه در دسته‌های کوچک (Batching) به ساختار جدید کپی می‌شوند تا دیتابیس قفل نشود.
      • فاز انقباض (Contract): پس از اطمینان از صحت کامل داده‌ها و هماهنگی کامل نرم‌افزار با ستون جدید، کدهای متکی به ستون قدیمی بازنشسته شده و ساختار قدیمی حذف می‌شود.

        ۲. مدیریت ایندکس‌ها بدون قفل شدن جداول ایجاد یا حذف ایندکس‌های سنگین روی جداول میلیونی می‌تواند نوشتن در دیتابیس را متوقف کند. برای جلوگیری از این چالش، اجرای اصولی مهاجرت دیتابیس وابسته به دستورات غیرهمگام است:

        • در PostgreSQL: استفاده الزامی از دستور CREATE INDEX CONCURRENTLY که به پایگاه داده اجازه می‌دهد ایندکس را در پس‌زمینه و بدون ایجاد قفل انحصاری روی جدول بسازد.
          • در MySQL / MariaDB: استفاده از قابلیت ALGORITHM=INPLACE و ابزارهای آنلاینی نظیر pt-online-schema-changeبرای جداول عظیم.

            ۳. سازگاری رو به عقب در کدنویسی (Backward Compatibility) هیچ تغییر ساختاری نباید با نسخه فعلی نرم‌افزار ناسازگار باشد:

            • همیشه باید فرض کرد که در زمان دیپلوی، نسخه قبلی و جدید نرم‌افزار برای چند دقیقه هم‌زمان در حال پاسخ به کاربران هستند (Blue-Green یا Rolling Deployment).
              • اضافه کردن ستون‌های جدید حتماً باید همراه با مقدار پیش‌فرض (Default Value) یا با امکان پذیرش مقدار خالی (NULL) باشد تا ورودی‌های نسخه قبلی کرش نکنند.

                ۴. نظارت و استراتژی بازگشت اضطراری (Rollback) پیش از اجرای هر اسکریپت در پروداکشن، باید مسیر بازگشت اضطراری آن تعریف و روی داده‌های مشابه تست شده باشد:

                • استفاده از لاگ‌های سرور برای ردیابی زمان اجرای میگریشن‌ها.
                  • جداسازی تراکنش‌های سنگین DDL از تراکنش‌های داده‌ای DML به منظور مهار مصرف CPU و I/O دیسک.

                    نتیجه‌گیری مهندسی موفقیت در اجرای مهاجرت دیتابیس به معنی توانایی به‌روزرسانی زیرساخت داده بدون حتی یک ثانیه قطعی برای کاربران نهایی است. رعایت این الگوهای گام‌به‌گام، پایداری محصول را در مقیاس‌های بزرگ تضمین کرده و ریسک بروز خطاهای پرهزینه در محیط عملیاتی را به صفر می‌رساند.

                    مهاجرت دیتابیس، معماری پایگاه داده، دیتابیس بدون قطعی، مهندسی بک اند، استودیو آبیدرنت