استراتژی جدول سایه (shadow table strategy) چیست؟

استراتژی جدول سایه (Shadow Table Strategy) چیست؟

استخراج سرویس‌ها و مهاجرت داده بدون وقفه (Shadow Table Strategy for Seamless Service Extractions and Data Migrations)

نکات کلیدی

استراتژی جدول سایه یک نسخه‌ی تکراری همگام‌سازی‌شده از داده ایجاد می‌کند که در طول تغییرات، سیستم تولید (Production) را کاملاً عملیاتی نگه می‌دارد و مهاجرت‌های بدون توقف (Zero-downtime) را ممکن می‌کند.
تریگرهای پایگاه داده یا چارچوب‌های Change Data Capture (CDC) به‌صورت فعال هر تغییر را از سیستم اصلی به جدول سایه تکثیر می‌کنند و یکپارچگی داده را تضمین می‌کنند.
استراتژی جدول سایه از سناریوهای متنوعی پشتیبانی می‌کند، از جمله مهاجرت پایگاه داده، استخراج میکروسرویس‌ها و بازطراحی تدریجی شِما، به‌گونه‌ای که سیستم‌های زنده را امن و مرحله‌به‌مرحله به‌روزرسانی کند.
جداول سایه نسبت به Dual-writes یا استقرارهای Blue-Green، سازگاری (Consistency) قوی‌تری ارائه می‌دهند و بازیابی (Recovery) را ساده‌تر می‌کنند.
مطالعات موردی صنعتی از GitHub، Shopify و Uber نشان می‌دهد که رویکرد جدول سایه، مهاجرت‌های بزرگ‌مقیاس داده را با حفظ فعالانه‌ی یکپارچگی پیوسته و داشتن سازوکارهای بازگشت‌پذیر (Rollback-friendly) تقویت می‌کند.

مقدمه

سیستم‌های نرم‌افزاری مدرن معمولاً باید بدون ایجاد اختلال برای کاربران تکامل پیدا کنند. وقتی یک مونولیت را به میکروسرویس‌ها تقسیم می‌کنید یا شِمای پایگاه داده را تغییر می‌دهید، باید داده‌ها را با حداقل زمان توقف و حداقل ریسک مهاجرت دهید. جدول‌های سایه به‌عنوان یک استراتژی قدرتمند برای رسیدن به همین هدف مطرح شده‌اند. خلاصه‌اش این است: رویکرد جدول سایه یک نسخه‌ی تکراری از داده (نسخه‌ی سایه) ایجاد می‌کند و آن را با داده‌ی اصلی همگام نگه می‌دارد، تا وقتی تنظیمات جدید آماده شد، بتوانید با یک سوییچ نرم و بی‌دردسر به آن منتقل شوید.

این مقاله بررسی می‌کند که جدول‌های سایه چگونه در سناریوهای مختلف مهاجرت مانند مهاجرت پایگاه داده، استخراج سرویس و تغییرات شِما کمک می‌کنند؛ همچنین به مطالعات موردی واقعی اشاره می‌کند و این رویکرد را با گزینه‌هایی مثل Dual-writes، استقرارهای Blue-Green و مکانیزم‌های Event Replay مقایسه می‌کند.

استراتژی جدول سایه چیست؟

استراتژی جدول سایه یک کپی موازی از داده را در یک مکان جدید (جدول یا پایگاه داده «سایه») نگه می‌دارد که وضعیت فعلی سیستم اصلی را آینه‌وار بازتاب می‌دهد. ایده‌ی اصلی این است که تغییرات داده به‌صورت لحظه‌ای به سایه تغذیه شوند؛ بنابراین در پایان مهاجرت، مخزن داده‌ی سایه یک کلون کامل و به‌روز از مخزن اصلی خواهد بود. در آن نقطه، می‌توانید بدون ایجاد اختلال، به نسخه‌ی سایه به‌عنوان منبع اصلی سوییچ کنید. در عمل، پیاده‌سازی مهاجرت با جدول سایه معمولاً از یک الگوی مشخص پیروی می‌کند:

  1. ایجاد جدول سایه: یک جدول (یا پایگاه داده) جدید با شِما یا مکان موردنظر آماده می‌کنید. این جدول در ابتدا خالی است، اما ساختارش طوری طراحی می‌شود که داده‌ی مهاجرت‌یافته را در خود جای دهد.

  2. Backfill داده‌ی اولیه: رکوردهای موجود را از مخزن اصلی به جدول سایه کپی می‌کنید و این کار را تکه‌تکه (Chunk) انجام می‌دهید تا سیستم تحت فشار قرار نگیرد.

  3. همگام‌سازی تغییرات جاری: در حالی که سیستم در حال کار است، هر نوشتن یا به‌روزرسانی جدید از داده‌ی اصلی را روی سایه هم اعمال می‌کنید. برای انتشار هر INSERT، UPDATE یا DELETE از منبع به سایه، از تریگرهای پایگاه داده، رویدادهای CDC یا منطق سطح اپلیکیشن استفاده می‌شود تا همگامی حفظ شود.

  4. راستی‌آزمایی: در صورت نیاز، بررسی‌هایی مثل مقایسه تعداد ردیف‌ها یا نمونه‌برداری از رکوردها انجام می‌دهید تا مطمئن شوید داده‌ی سایه با داده‌ی منبع برابر است و چیزی از قلم نیفتاده.

  5. Cutover: بعد از اینکه مطمئن شدید سایه کاملاً به‌روز است، اپلیکیشن را به جدول سایه اشاره می‌دهید (یا در پایگاه داده با Rename/Swap جدول‌ها سوییچ می‌کنید). چون سایه از قبل همگام بوده، این تغییر با زمان توقف ناچیز انجام می‌شود.

  6. Cleanup: بعد از Cutover، مخزن قدیمی را بازنشسته می‌کنید یا مدتی آن را به حالت فقط‌خواندنی نگه می‌دارید تا زمانی که دیگر به‌عنوان بکاپ به آن نیاز نداشته باشید.

استراتژی جدول سایه (shadow table strategy) چیست؟

با این رویکرد، مهاجرت‌ها می‌توانند بدون توقف انجام شوند. سیستم تولید در طول Backfill و Sync همچنان کار می‌کند، چون خواندن و نوشتن هنوز روی مخزن داده‌ی اصلی انجام می‌شود، در حالی که شما سایه را می‌سازید. وقتی آماده شدید، می‌توانید با یک تغییر سریع مانند Rename جدول یا تغییر پیکربندی، به مخزن جدید سوییچ کنید.

این استراتژی گاهی «روش جدول روح» (ghost table) هم نامیده می‌شود (به‌خصوص در ابزار مهاجرت شِمای GitHub یعنی gh-ost) چون جدول جدید مثل یک «روح» از جدول اصلی است.

موارد استفاده‌ای که جدول سایه در آن‌ها می‌درخشد

جدول‌های سایه یک مکانیزم مقاوم و انعطاف‌پذیر برای مدیریت مهاجرت‌های پیچیده، استخراج سرویس‌ها و بازطراحی شِما هستند، بدون اینکه سیستم تولید متوقف شود. سه سناریوی رایج که جدول سایه در آن‌ها بسیار مفید است عبارت‌اند از: مهاجرت پایگاه داده با زمان توقف صفر، استخراج سرویس در مسیر میکروسرویس‌ها، و تغییرات تدریجی شِما همراه با Refactoring مدل داده.

مهاجرت پایگاه داده با زمان توقف صفر

اپلیکیشن‌های مدرن معمولاً به پایگاه‌های داده‌ی بزرگ و پرکاربرد متکی‌اند که نمی‌توانند زمان توقف طولانی برای تغییر شِما یا مهاجرت موتور دیتابیس را تحمل کنند. اعمال مستقیم تغییرات مثل افزودن ستون جدید، تغییر نوع داده یا ساخت ایندکس، می‌تواند باعث قفل‌های طولانی شود و عملیات حیاتی را متوقف کند. جدول‌های سایه راه‌حل جایگزین کم‌ریسکی ارائه می‌دهند.

ابتدا یک جدول جدید ایجاد می‌کنید که ساختار جدول تولید را آینه می‌کند، اما تغییرات شِمای موردنظر را هم در خود دارد. این جدول سایه در ابتدا خالی یا نیمه‌پر است و با یک فرآیند Backfill کنترل‌شده پر می‌شود. Backfill داده‌های تاریخی را به صورت Batchهای کنترل‌شده از جدول تولید به جدول سایه منتقل می‌کند تا سیستم همزمان بتواند به کار خود ادامه دهد.

پس از Backfill، یک مکانیزم همگام‌سازی پیوسته راه‌اندازی می‌کنید تا با تکیه بر تریگرهای دیتابیس یا چارچوب‌های CDC، هر INSERT، UPDATE یا DELETE از جدول تولید به جدول سایه منتقل شود. این مکانیزم «دو-نوشتن» (dual-write) باعث می‌شود جدول سایه همیشه یک نسخه‌ی به‌روز از سیستم تولید باشد.

در کنار آن، فرآیندهای راستی‌آزمایی خودکار به‌طور مداوم متریک‌های کلیدی بین دو جدول را مقایسه می‌کنند. Checksum، تعداد ردیف‌ها و مقایسه‌های عمیق شیء به شما اطمینان می‌دهند که جدول سایه دقیقاً سیستم تولید را بازتاب می‌دهد. وقتی این اعتبارسنجی‌ها ثابت کردند سایه با منبع سازگار است، Cutover نهایی انجام می‌شود، معمولاً با یک Rename اتمیک سریع یا تغییر اشاره‌گر. این روش مهاجرت را با حداقل زمان توقف ممکن می‌کند و تجربه کاربر را حفظ می‌کند.

استخراج سرویس در گذار به میکروسرویس‌ها

گذار از معماری مونولیت به میکروسرویس فقط بازنویسی کد نیست؛ معمولاً باید داده‌های مرتبط با سرویس‌ها را هم با دقت مهاجرت دهید. استخراج یک سرویس از مونولیت اگر داده‌های وابسته دقیق و سازگار منتقل نشوند، به خطا و ناسازگاری ختم می‌شود. اینجا جدول سایه نقش حیاتی دارد: جدا کردن و مهاجرت یک زیرمجموعه از داده‌ها بدون اختلال در سیستم موجود.

در یک استخراج سرویس معمولی، سیستم قدیمی همچنان همه عملیات زنده را انجام می‌دهد، در حالی که توسعه‌دهندگان یک میکروسرویس جدید برای یک قابلیت خاص می‌سازند. در طول استخراج، مهندسان داده‌های مرتبط با سرویس جدید را به یک پایگاه داده سایه اختصاصی آینه می‌کنند. چه با تریگر و چه با تکثیر مبتنی بر رویداد، مکانیزم dual-write تضمین می‌کند هر تغییر در سیستم قدیمی همزمان در پایگاه داده سایه ثبت شود.

وقتی میکروسرویس جدید داده‌ها را از پایگاه داده سایه پردازش می‌کند، مهندسان اعتبارسنجی موازی انجام می‌دهند تا خروجی‌های آن با انتظارات یکسان باشد. یک چارچوب مقایسه خودکار بررسی می‌کند خروجی سرویس جدید با نتایج مورد انتظار از سیستم قدیمی تطابق دارد. این اعتبارسنجی کنار هم (side-by-side) اجازه می‌دهد اختلاف‌ها در لحظه دیده شود و اصلاح شوند.

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

وقتی پایگاه داده سایه و میکروسرویس جدید ثابت کردند همان سطح یکپارچگی داده و عملکرد سیستم قدیمی را حفظ می‌کنند، مهندسان یک Cutover کنترل‌شده و تدریجی اجرا می‌کنند. در طول زمان، همه عملیات به سرویس جدید منتقل می‌شود و نقش سیستم قدیمی کم‌کم کاهش می‌یابد تا آن قابلیت کاملاً از مونولیت حذف شود. این رویکرد مرحله‌ای ریسک را کم می‌کند و اگر مشکلی پیدا شود، راه بازگشت (Rollback) درون خودش دارد.

تغییرات تدریجی شِما و Refactoring مدل داده

حتی برای تغییرات کوچک‌تر مثل Refactor یک جدول یا به‌روزرسانی مدل داده، جدول‌های سایه یک روش قدرتمند برای کاهش ریسک هستند. در بسیاری از سیستم‌ها، تکامل مدل داده یک چالش دائمی است؛ مثلا شکستن یک جدول به چند بخش منطقی، ادغام فیلدها، یا افزودن محدودیت NOT NULL به ستون‌هایی که قبلاً اختیاری بوده‌اند.

به‌جای اعمال تغییر مستقیم روی جدول زنده، مهندسان یک نسخه سایه مطابق طراحی جدید می‌سازند. سیستم همزمان روی هر دو جدول اصلی و سایه می‌نویسد تا هر به‌روزرسانی در لحظه در هر دو ساختار ثبت شود. این dual-writing امکان اعتبارسنجی مداوم شِمای جدید در مقابل شِمای فعلی را فراهم می‌کند و به مهندسان اجازه می‌دهد خروجی‌ها را مقایسه کنند و مطمئن شوند مدل داده Refactor شده همه منطق کسب‌وکار را درست پوشش می‌دهد.

ابزارهای مقایسه خودکار در این مرحله حیاتی‌اند. با پایش و مقایسه‌ی مداوم داده بین شِماهای قدیمی و جدید، این ابزارها اختلاف‌ها را زود تشخیص می‌دهند؛ اختلاف‌هایی که ممکن است از تبدیل نوع داده، مسائل گرد کردن یا Edge Caseهای پیش‌بینی‌نشده ناشی شوند. بعد از اینکه جدول سایه کاملاً اعتبارسنجی شد و ناهنجاری‌ها اصلاح شدند، اپلیکیشن می‌تواند بدون دردسر به شِمای جدید سوییچ کند. سپس جدول اصلی به‌تدریج حذف می‌شود و جدول سایه به‌عنوان مخزن اصلی داده باقی می‌ماند.

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

نمونه‌های صنعتی و بهترین روش‌ها

مهاجرت‌های موفق مبتنی بر جدول سایه توسط سازمان‌های زیادی گزارش شده و مجموعه‌ای از Best Practiceها را شکل داده است:

  • ابزارهای تغییر شِما به‌صورت آنلاین (Online Schema Change):

    شرکت‌هایی مانند GitHub و Facebook ابزارهایی مثل gh-ost و OSC ساختند که تغییر شِما را با جدول سایه/روح انجام می‌دهد. این ابزارها متن‌باز شده‌اند و دیگران هم از آن‌ها استفاده می‌کنند. مهاجرت‌های MySQL اغلب از روال استاندارد ایجاد جدول سایه، همگام‌سازی تغییرات و سپس Rename استفاده می‌کنند. Shopify هم از gem متن‌باز LHM در Rails استفاده کرده تا ستون‌ها را امن اضافه کند، چون «از مکانیزم جدول سایه برای حداقل زمان توقف استفاده می‌کند». بهترین روش اینجاست که فرآیند جدول سایه را خودکار کنید و چک‌های سخت‌گیرانه داشته باشید (تعداد ردیف‌ها، مانیتور کردن replication lag و غیره) و مسیرهای fallback هم مشخص باشد (مثلاً اگر مهاجرت abort شود، جدول اصلی دست‌نخورده می‌ماند که از ALTER نیمه‌کاره امن‌تر است).

  • الگوی Strangler برای میکروسرویس‌ها:

    ترکیب الگوی strangler fig با shadow read/write رویکرد موفقی برای مهاجرت از مونولیت بوده است. Amazon، Netflix و دیگران با هدایت درصدی از ترافیک به سیستم جدید در حالت shadow اعتمادسازی می‌کنند. سپس به مرور readها و در نهایت writeها را منتقل می‌کنند تا بخش قدیمی حذف شود. بهترین روش: مهاجرت مرحله‌ای (shadow/dual-run، راستی‌آزمایی، سپس cutover) و استفاده از مانیتورینگ و متریک‌ها برای تضمین صحت داده.

  • استفاده از CDC و Data Pipeline:

    اگر از event stream برای مهاجرت استفاده می‌کنید، ترتیب (ordering) و idempotency بسیار مهم است. تیم‌ها اغلب Kafka یا لاگ‌های پایدار مشابه را برای replay رویدادها به پایگاه داده سایه انتخاب می‌کنند. ترتیب رویدادها باید مطابق ترتیب commit منبع باشد تا سازگاری حفظ شود. Best practice شامل schema versioning و رویدادهای backward-compatible است تا سیستم جدید حتی اگر شِما حین مهاجرت تغییر کند، بتواند رویدادها را پردازش کند. جدا کردن pipeline (به‌جای dual-write مستقیم) فشار روی سیستم تولید را کم می‌کند، اما باید lag بین منبع و سایه را مانیتور کنید و راهی برای reconcile داشته باشید.

  • برنامه‌های Fallback و Rollback:

    مهاجرت بدون طرح rollback واقعاً امن نیست. جدول‌های سایه معمولاً rollback را ساده می‌کنند. اگر در مرحله verification مشکلی دیدید، کافی است جدول سایه را دور بیندازید؛ کاربران هیچ اثری نمی‌بینند. حتی بعد از cutover، اگر جدول/سیستم جدید مشکل داشت، می‌توانید به سیستم قدیمی برگردید (به شرطی که مدتی آن را سالم نگه داشته باشید). Post-mortem مهاجرت Uber روی امکان برگرداندن ترافیک به سیستم قدیمی تاکید می‌کند. بهترین روش: بعد از cutover، سیستم قدیمی را مدتی به حالت فقط‌خواندنی نگه دارید تا اگر لازم شد fallback کنید. این توری ایمنی همراه با مانیتورینگ دقیق، مهاجرت را مقاوم می‌کند.

مقایسه جدول‌های سایه با رویکردهای جایگزین

مهاجرت با جدول سایه (یا پایگاه داده سایه) قدرتمند است، اما همیشه باید مناسب‌ترین استراتژی را برای وضعیت خود انتخاب کنید.

جدول‌های سایه در برابر Dual-Write

استراتژی جدول سایه معمولاً از تریگرها یا pipelineهای بیرونی برای همگام‌سازی استفاده می‌کند، در حالی که dual-write خالص به اپلیکیشن متکی است که چند نوشتن انجام دهد. dual-write می‌تواند دو سیستم را همگام نگه دارد، اما پیچیدگی تراکنش‌های توزیع‌شده را هم با خود می‌آورد.

اگر طراحی دقیق نباشد، dual-write ممکن است به race condition یا شکست‌های جزئی ختم شود؛ مثلاً اپلیکیشن در دیتابیس جدید می‌نویسد ولی قبل از نوشتن در دیتابیس قدیمی کرش می‌کند و داده‌ها از هم جدا می‌شوند. برای کاهش این ریسک، الگوهایی مثل Outbox Pattern استفاده می‌شود: اپلیکیشن تغییرات را هم در DB اصلی و هم در یک جدول outbox در همان تراکنش می‌نویسد و سپس به‌صورت async این تغییرات را به سیستم دوم منتشر می‌کند.

در مقابل، جدول سایه مبتنی بر تریگر ذاتاً دو نوشتن را به تراکنش دیتابیس منبع گره می‌زند (تریگر داخل commit اجرا می‌شود) و CDC دقیقاً تغییرات commit‌شده را از لاگ ثبت می‌کند. این موضوع معمولاً سازگاری جدول سایه را از dual-writeهای دست‌ساز قابل اعتمادتر می‌کند.

استراتژی جدول سایه (shadow table strategy) چیست؟

با این حال، اگر کنترل هر دو سیستم دست شماست، dual-write ممکن است از نظر سطح اپلیکیشن ساده‌تر باشد و نیاز به دستکاری سطح دیتابیس یا ابزارهای اضافی را کم کند. خلاصه: dual-write کنترل بیشتری در کد اپلیکیشن می‌دهد، اما باید با وسواس از ناسازگاری جلوگیری کنید. جدول سایه بیشتر به دیتابیس یا pipeline تکیه می‌کند تا سازگاری را تضمین کند.

جدول‌های سایه در برابر استقرار Blue-Green

استراتژی جدول سایه مکمل Blue-Green است: می‌توانید جدول سایه را بخشی از محیط «سبز» در حال آماده‌سازی ببینید. تفاوت اصلی این است که Blue-Green به‌تنهایی نمی‌گوید داده را چگونه همگام نگه دارید؛ فرض می‌کند شما راهی برای کپی و تازه‌سازی داده در محیط سبز دارید. این کار می‌تواند با downtime کامل انجام شود (ایده‌آل نیست) یا با فرآیند shadow/copy.

استراتژی جدول سایه (shadow table strategy) چیست؟

مزیت Blue-Green این است که می‌توانید کل استک جدید را موازی تست کنید. مثلاً سرویس جدید را روی دیتابیس سایه (سبز) اجرا کنید، در حالی که سرویس قدیمی روی دیتابیس قدیمی (آبی) کار می‌کند. سپس در زمان مناسب سوییچ می‌کنید و حتی اگر مشکلی شد، به محیط آبی برمی‌گردید چون هنوز سالم است. نقطه ضعفش هزینه و پیچیدگی است: دو برابر کردن زیرساخت به‌صورت موقت.

نگهداری دو محیط کامل (از جمله دیتابیس‌ها) و همگام‌سازی آن‌ها ساده نیست. جدول‌های سایه این درد را تا حدی کم می‌کنند چون تمرکزشان روی همگام‌سازی لایه داده است. اگر مهاجرت شما صرفاً دیتابیس‌محور است (مثل انتقال سرور یا موتور دیتابیس)، جدول سایه عملاً Blue-Green در لایه دیتابیس است. اگر تغییرات اپلیکیشن هم دارید، می‌توانید Blue-Green اپلیکیشن را همزمان با مهاجرت جدول سایه انجام دهید.

هر دو رویکرد هدف «سوییچ بدون توقف» دارند و خوب با هم جفت می‌شوند، اما Blue-Green مفهوم گسترده‌تری است که فراتر از داده می‌رود؛ در حالی که جدول سایه دقیقاً روی سازگاری داده در دوره انتقال زوم کرده است.

جدول‌های سایه در برابر Event Replay (بازسازی از لاگ رویدادها)

Event replay از یک لاگ رویداد یا توالی تغییرات برای ساخت وضعیت یک سیستم جدید استفاده می‌کند. از نظر فنی به CDC نزدیک است اما هدفش کمی متفاوت است. در سناریوی replay ممکن است یک سرویس کاملاً جدید را با مصرف backlog رویدادهای تاریخی راه‌اندازی کنید (مثلاً پردازش دوباره‌ی یک topic کافکا از همه تراکنش‌های سال گذشته) تا وضعیت دیتابیس بازسازی شود. یا اگر سیستم event-sourced باشد (لاگ append-only تغییرات)، می‌توانید مدل خواندن یا دیتابیس جدید را با replay از ابتدای رویدادها بسازید. این کار تضمین می‌کند وضعیت دیتابیس جدید از همان ورودی‌ها مشتق شده و معادل سیستم قدیمی است.

استراتژی جدول سایه (shadow table strategy) چیست؟

برخلاف جدول‌های سایه، replay می‌تواند زمان‌برتر باشد و معمولاً ابتدا آفلاین یا در محیط staging انجام می‌شود، چون پردازش تاریخچه طولانی زمان می‌برد. جدول‌های سایه معمولاً روی داده‌ی زنده و real-time کار می‌کنند، در حالی که replay می‌تواند برای bootstrap استفاده شود و سپس برای بخش انتهایی به یک روش همگام‌سازی زنده مثل CDC سوئیچ کنید. تفاوت دیگر این است که replay ممکن است رویدادهای سطح کسب‌وکار را ثبت کند نه تغییرات سطح ردیف.

مثلاً به جای کپی ردیف‌ها از یک جدول SQL، stream رویدادهایی مانند OrderPlaced و OrderShipped را replay می‌کنید تا وضعیت بازسازی شود. این کار وقتی مفید است که همزمان مدل داده را هم تغییر می‌دهید، چون سیستم جدید می‌تواند رویدادها را متفاوت تفسیر کند. اما اگر رویدادی از قلم بیفتد یا لاگ رویداد کامل نباشد، مهاجرت ناقص می‌شود.

در عمل، مهندسان اغلب replay را با استراتژی‌های سایه ترکیب می‌کنند: ابتدا replay برای catch up، سپس CDC یا dual-write برای ثبت رویدادهای جدیدی که حین replay رخ می‌دهند تا سایه عقب نماند. نتیجه یکی است: یک سایه کاملاً همگام که آماده جایگزینی است. انتخاب بین shadow کپی در سطح دیتابیس و replay در سطح رویداد بستگی به این دارد که چه داده‌ای در دسترس دارید. اگر لاگ رویداد تمیز دارید، replay ساده‌تر است؛ وگرنه گرفتن تغییرات از دیتابیس (تریگر یا log capture) قابل‌مدیریت‌تر است. هر دو به eventual consistency می‌رسند، اما همگام‌سازی جدول سایه (به‌خصوص مبتنی بر تریگر) معمولاً دیتابیس جدید را در حد چند ثانیه همگام نگه می‌دارد، در حالی که replay ممکن است با تأخیر batch‌ای جلو بیاید.

جمع‌بندی

استراتژی جدول سایه ثابت کرده که برای انجام مهاجرت‌های پیچیده داده به‌شکل امن و تدریجی مؤثر است. تیم‌ها یک نسخه‌ی زنده از تغییرات داده را حفظ می‌کنند؛ این امکان می‌دهد دیتابیس‌ها را مهاجرت دهند، سرویس‌ها را استخراج کنند یا شِما را refactor کنند بدون اینکه اپلیکیشن را متوقف کنند. شرکت‌ها از این الگو برای افزودن ستون بدون downtime، مهاجرت جدول‌های عظیم یا انتقال تدریجی ترافیک به میکروسرویس‌های جدید استفاده می‌کنند، در حالی که یکپارچگی داده حفظ می‌شود.

البته هیچ رویکردی برای همه‌ی موقعیت‌ها مناسب نیست. جدول‌های سایه وقتی عالی‌اند که به همگام‌سازی تا حد ثانیه و اطمینان از طریق اجرای موازی و مقایسه نیاز دارید. گزینه‌هایی مثل dual-writes یا event replay ممکن است در سیستم‌هایی که حول پیام‌رسانی رویدادمحور ساخته شده‌اند یا در سناریوهای ساده‌تر مناسب‌تر باشند، جایی که داشتن یک کپی سایه کامل زیاده‌روی است. بسیاری از مهاجرت‌های واقعی ترکیبی از این تکنیک‌ها را استفاده می‌کنند: مثلاً ابتدا bulk load (یا replay)، سپس همگام‌سازی زنده با shadow، یا dual-write در اپلیکیشن همراه با تریگر audit برای چک دوم سازگاری.

مهم است تیم‌های مهندسی مهاجرت را مثل یک پروژه درجه‌یک برنامه‌ریزی کنند و بهترین روش‌های صنعت را اجرا کنند: اجرای سیستم‌ها در حالت shadow برای اعتبارسنجی رفتار، داشتن toggle و backstop برای rollback سریع، و مانیتور کردن همه چیز. اگر با انضباط اجرا شود، استراتژی جدول سایه یک مسیر با پیچیدگی متوسط برای ایجاد تغییرات بزرگ با downtime بسیار کم فراهم می‌کند و کاربران هم خوشحال می‌مانند چون اساساً متوجه نمی‌شوند زیر پوست سیستم چه اتفاقی افتاده است.

قدرت اکوسیستم‌های API‌-محور برای تحقق پایداری چگونه مورد استفاده قرار می‌گیرد؟

دیدگاهتان را بنویسید

سبد خرید
علاقه‌مندی‌ها
مشاهدات اخیر
دسته بندی ها