رفتن به محتوای اصلی
کوهستان
توضیح کوهستانمعماری پایگاه دادهپستگرس‌کیوال· 7 دقیقه مطالعه· در فناوری

چرا ردیف‌های پستگرس‌کیوال نیازمند انجماد دوره‌ای هستند تا داده‌ها خاموش ناپدید نشوند؟

شناسه‌های تراکنش ۳۲ بیتی در پایگاه‌داده پستگرس‌کیوال پس از ۴.۲ میلیارد عملیات نوشتن دور می‌زنند و اگر مهار نشوند، رکوردهای قدیمی را طوری جلوه می‌دهند که گویی متعلق به آینده‌اند. برای جلوگیری از این فاجعه و نامرئی شدن خاموش داده‌ها، سیستم باید رکوردهای کهن را به‌طور دوره‌ای «منجمد» کند تا پیش از بازنشانی شمارنده، برای همیشه مرئی بمانند.

به قلم ایمان شریعتی

به‌طور خلاصه

  • پستگرس‌کیوال از یک شمارنده ۳۲ بیتی استفاده می‌کند که پس از ۴.۲ میلیارد تراکنش سرریز می‌شود؛ این ساختار انجماد داده‌های کهن را برای مرئی ماندن الزامی می‌سازد.
  • پایگاه داده خط زمانی را دایره‌ای فرض می‌کند که در آن دقیقاً دو میلیارد شناسه در گذشته و دو میلیارد شناسه در آینده جای دارند.
  • اگر فاصله کهن‌ترین ردیف منجمدنشده تا شناسه جاری به کمتر از یک میلیون برسد، پستگرس‌کیوال برای جلوگیری از تباهی داده بلافاصله خاموش می‌شود.

ارائه‌دهندگان خدمات ابری همواره پایگاه‌های داده مدیریت‌شده را به‌منزله ابزارهایی بدون نیاز به نگهداری و با قابلیت مقیاس‌پذیری نامحدود تبلیغ می‌کنند. اما در پس این لایه‌های انتزاعی و شعارهای بازاریابی، موتور پایگاه داده تحت قوانین ریاضی سرسختی کار می‌کند؛ جایی که با هر عملیات نوشتن، عقربه‌های یک ساعت محدود ۳۲ بیتی به نقطه صفر نزدیک‌تر می‌شوند.[3]

چالش اصلی در شکاف میان تصور توسعه‌دهندگان از ذخیره‌سازی ابدی و مرزهای فیزیکی معماری کامپیوتر نهفته است. پستگرس‌کیوال برای پیگیری هر تراکنش از یک عدد صحیح ۳۲ بیتی استفاده می‌کند؛ ساختاری که ظرفیت شمارش آن پیش از سرریز شدن تنها حدود ۴.۲ میلیارد تراکنش است.[1]

هنگامی که این شمارنده داخلی به سقف خود می‌رسد، دچار سرریز حسابی یا چرخش (Wraparound) شده و مجدداً به صفر بازمی‌گردد. اگر سازوکاری برای مهار این چرخش وجود نداشته باشد، داده‌های پیشین ناگهان در محاسبات سیستم به گونه‌ای ارزیابی می‌شوند که گویی در آینده ثبت خواهند شد و در نتیجه برای تمام برنامه‌ها کاملاً نامرئی می‌شوند.

پستگرس‌کیوال برای دفع خطر نابودی خاموش اطلاعات، فرایندی پس‌زمینه‌ای به نام «انجماد» (Freezing) را به کار می‌گیرد. این سازوکار رکوردهای کهن را مرتباً پیمایش کرده، شناسه‌های تراکنش اولیه را حذف می‌کند و آن‌ها را پیش از صفر شدن شمارنده با یک نشانگر دائمی رویت‌پذیری جایگزین می‌سازد.

مکانیسم کنترل هم‌روندی چندنسخه‌ای

خطر سرریز شناسه‌ها پیامد مستقیم معماری کنترل هم‌روندی چندنسخه‌ای یا همان MVCC است؛ سازوکاری که با تفکیک عملیات خواندن و نوشتن از یکدیگر تضمین می‌کند خواندن‌ها مانع نوشتن و نوشتن‌ها مانع خواندن نشوند و بار کاری سنگین سازمان‌ها تاب آورده شود.[2]

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

کنترل هم‌روندی چندنسخه‌ای تراکنش‌های درج و حذف مربوط به تک‌تک ردیف‌ها را رصد می‌کند.

چنین طراحی باعث می‌شود یک ردیف منطقی در لایه ذخیره‌سازی به‌طور هم‌زمان دارای سه یا چهار نسخه فیزیکی باشد. پایگاه داده برای پالایش کپی‌های منسوخ و ارائه یک تصویر منسجم و هم‌زمان از وضعیت داده‌ها به کاربر، مستقیماً به همین شناسه‌های تراکنش تکیه می‌کند.[2]

پستگرس‌کیوال برای اتخاذ تصمیمات دقیق درباره رویت‌پذیری، روی هر ردیف دو برچسب فراداده‌ای ثبت می‌کند: مقدار xmin که شناسه دقیق تراکنش درج‌کننده ردیف را نشان می‌دهد و مقدار xmax که شناسه تراکنش حذف‌کننده یا به‌روزرسانی‌کننده را درون خود نگه می‌دارد.[1]

وقتی پرس‌وجویی اجرا می‌شود، موتور پایگاه داده شناسه تراکنش کنونی را با مقادیر xmin و xmax تمامی ردیف‌های مربوطه مقایسه می‌کند. چنانچه تراکنش درج‌کننده پیش از آغاز پرس‌وجوی جاری نهایی (Commit) شده باشد، سامانه ردیف را برای نمایش ایمن تشخیص می‌دهد.[2]

ریاضیات مدور در شناسه‌های تراکنش

از آنجا که شمارنده ۳۲ بیتی تراکنش‌ها دقیقاً محدود به ۴.۲ میلیارد مقدار است، سیستم نمی‌تواند خط زمان را به شکل مسیری مستقیم و بی‌پایان فرض کند. در عوض، موتور داده از حساب پیمانه‌ای (مبنای ۲ به توان ۳۲) بهره می‌گیرد و محور زمان را به دایره‌ای پیوسته و تکرارشونده تبدیل می‌کند.[1]

در این فضای مدور ریاضی، مفهوم مطلقی به نام شناسه تراکنش بزرگ‌تر یا کوچک‌تر وجود ندارد. برای هر تراکنش مشخص، دقیقاً دو میلیارد شناسه در گذشته و دو میلیارد شناسه دیگر در آینده تعریف شده‌اند.[1]

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

فضای شناسه‌های تراکنش به جای مسیری خطی، به صورت دایره‌ای مداوم کار می‌کند.

اگر ردیفی بدون هیچ تغییری در طول دو میلیارد تراکنش دست‌نخورده باقی بماند، پنجره رو به جلو در نهایت از آن عبور خواهد کرد. در این لحظه، شناسه xmin آن ردیف از مرز محاسباتی رد شده و در منطق موتور داده، ناگهان تراکنشی ثبت‌نشده در آینده قلمداد می‌گردد.[1]

سازوکار مداخله و انجماد

پستگرس‌کیوال برای جلوگیری از لغزش داده‌ها به آینده محاسباتی، به فرایند VACUUM FREEZE وابسته است؛ عملیات نگهداری دوره‌ای که به مانند لنگری زمانی عمل کرده و داده‌های کهن را پیش از جا ماندن از پنجره تراکنش‌ها تثبیت می‌کند.

هنگامی که فرایند پاک‌سازی ردیفی را به اندازه کافی کهن تشخیص دهد، فراداده آن چندتایی (Tuple) را دگرگون می‌کند. موتور در نسخه‌های قدیمی‌تر، مقدار xmin را با یک شناسه ویژه به نام FrozenTransactionId جایگزین می‌کرد؛ عددی ثابت معادل ۲ که کاملاً خارج از خط زمانی معمول می‌ایستاد.[2]

نسخه‌های مدرن‌تر پستگرس‌کیوال همین نتیجه را با نشاندن یک بیت راهنما (Hint bit) ویژه روی ردیف رقم می‌زنند. این پرچم به موتور رویت‌پذیری اعلام می‌کند که هنگام سنجش ردیف، منطق حساب پیمانه‌ای را کلاً نادیده بگیرد.[2]

مستندات رسمی پستگرس‌کیوال صراحتاً بیان می‌دارد: «نسخه‌های ردیف منجمد طوری مدیریت می‌شوند که گویی شناسه درج‌کننده آن‌ها همان شناسه منجمد بوده است، تا برای تمام تراکنش‌های عادی فارغ از مخاطرات سرریز، در گذشته دیده شوند.»[1]

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

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

از آنجا که عملیات انجماد مستلزم پویش کامل جداول و نوشتن داده روی دیسک است، سیستم فوراً ردیف‌ها را منجمد نمی‌کند؛ بلکه بر پایه متغیر vacuum_freeze_min_age که مقدار پیش‌فرض آن ۵۰ میلیون تراکنش است، تا رسیدن داده‌ها به سنی معین درنگ می‌کند.[2]

اگر جدولی حجم پایینی از به‌روزرسانی داشته باشد، فرایند عادی پاک‌سازی ممکن است برای صرفه‌جویی در پهنای باند ورودی/خروجی از صفحات آن صرف‌نظر کند. برای پیشگیری از ورود این جداول خاموش به منطقه خطر، متغیر autovacuum_freeze_max_age پویشی تهاجمی را تحمیل می‌کند.[1]

انجماد با حذف شناسه اصلی تراکنش، ردیف را برای همیشه رویت‌پذیر می‌سازد.

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

پستگرس‌کیوال برای بهینه‌سازی این پویش نفس‌گیر، نگاشت رویت‌پذیری (Visibility Map) را برای هر جدول نگهداری می‌کند. این نگاشت صفحات تماماً منجمد را مشخص می‌سازد تا فرایند تهاجمی از خواندن آن‌ها پرهیز کرده و در منابع دیسک صرفه‌جویی کند.

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

خاموشی ایمن اضطراری

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

پستگرس‌کیوال این حاشیه ایمنی رو به زوال را مدام پایش می‌کند. چنانچه فاصله میان کهن‌ترین ردیف منجمدنشده و شناسه تراکنش جاری به کمتر از یک میلیون برسد، پایگاه داده یک سازوکار بازدارنده اضطراری را برای حفاظت از داده‌ها فعال می‌کند.[1]

سامانه بی‌درنگ فعالیت خود را متوقف ساخته و از پذیرش هرگونه تراکنش نوشتاری جدید سر باز می‌زند. مدیران سیستم با خطایی صریح روبه‌رو می‌شوند که اعلام می‌دارد پایگاه داده برای پرهیز از نابودی ناشی از سرریز متوقف شده؛ وضعیتی که سرویس‌دهی کل برنامه را قفل می‌کند.[1]

نجات سیستم از این بن‌بست مستلزم راه‌اندازی پایگاه داده در حالت تک‌کاربره محدود و اجرای اجباری و دستی فرایند انجماد است؛ عملیاتی اضطراری که بسته به حجم جداول آسیب‌دیده، از چند ساعت تا چند روز به طول می‌انجامد.

واقعیت‌های عملیاتی و نگهداری

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

پایگاه داده هم‌گام با بالا رفتن سن شناسه‌های تراکنش، پروتکل‌های نگهداری را تشدید می‌کند.

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

پایش سن تراکنش‌ها به همین دلیل یک الزام عملیاتی اجتناب‌ناپذیر در محیط‌های پرترافیک به شمار می‌رود. تیم‌های فنی باید سنجه‌های درونی سیستم را رصد کرده و پیش از رسیدن به آستانه تحمیلی ۲۰۰ میلیون تراکنش، هشدارهای لازم را تنظیم کنند.

الزام به انجماد چندتایی‌ها اثبات می‌کند ذخیره‌سازی در پایگاه داده هرگز ایستا نیست. حتی داده‌هایی که هیچ‌گاه ویرایش یا حذف نمی‌شوند، برای مرئی ماندن در بستری که زمان آن پیوسته پیش می‌رود، نیازمند صرف مداوم توان پردازشی هستند.

در حالی که فروشندگان خدمات ابری پیچیدگی‌های سخت‌افزاری را پشت پرده پنهان می‌کنند، قواعد ریاضی اعداد ۳۲ بیتی تغییرناپذیر باقی می‌مانند. تا زمانی که موتورهای پایگاه داده به‌طور کامل به شناسه‌های ۶۴ بیتی مهاجرت نکنند، انجماد دوره‌ای بهایی اجباری برای حفظ داده‌ها در مقیاس‌های بزرگ خواهد بود.[3]

این تحلیل چگونه انجام شد

روش
محاسبه زمان باقی‌مانده تا خاموشی سیستم در بار کاری سنگین سازمانی از طریق تقسیم حد رویت‌پذیری و حاشیه اضطراری بر نرخ تراکنش فرضی.
یافته
در ترافیک سازمانی معادل ۱۰٬۰۰۰ تراکنش در ثانیه، پایگاه داده دقیقاً ۲.۳۱ روز مهلت دارد تا چرخه انجماد را پیش از سرریز کامل به پایان برساند؛ و به محض فعال شدن هشدار ایمنیِ یک میلیون تراکنش، مدیران سیستم تنها ۱۰۰ ثانیه زمان برای مداخله پیش از خاموشی اجباری خواهند داشت.
داده‌هایی که بر پایهٔ آن‌ها کار کردیم
محدودیت‌های این تحلیل
این محاسبه نرخ تراکنش‌ها را ثابت و بدون وقفه فرض می‌کند و مسائلی نظیر دسته‌بندی تراکنش‌ها یا افت بار شبانه که پنجره زمانی را گسترش می‌دهند لحاظ نکرده است.

اصطلاحات کلیدی

کنترل هم‌روندی چندنسخه‌ای (MVCC)
معماری پایگاه داده که چندین نسخه از هر ردیف را نگه می‌دارد تا امکان خواندن و نوشتن هم‌زمان بدون قفل‌گذاری فراهم شود.
چندتایی یا تاپل (Tuple)
اصطلاح درونی پستگرس‌کیوال برای اشاره به یک ردیف فیزیکی داده در جداول پایگاه داده.
شناسه xmin
ستون پنهان سیستمی که شناسه دقیق تراکنش درج‌کننده یک ردیف را ذخیره می‌کند.
شناسه xmax
ستون پنهان سیستمی که شناسه دقیق تراکنش حذف‌کننده یا ویرایش‌کننده یک ردیف را درون خود نگه می‌دارد.
اتوکیوم (Autovacuum)
دیمن پس‌زمینه‌ای در پستگرس‌کیوال که به‌طور خودکار فضای دیسک را بازیافت کرده و شناسه‌های تراکنش کهن را برای جلوگیری از سرریز منجمد می‌کند.

پرسش‌های متداول

اگر اتوکیوم (autovacuum) را کاملاً غیرفعال کنیم چه می‌شود؟

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

آیا اجرای VACUUM FULL مشکل سرریز را سریع‌تر برطرف می‌کند؟

خیر. دستور VACUUM FULL تمام جدول را مجدداً بازنویسی کرده و قفل انحصاری سنگینی اعمال می‌کند که بسیار کندتر از VACUUM FREEZE هدفمند بوده و خاموشی سرویس را تشدید می‌نماید.

چگونه می‌توان از سن تراکنش‌های پایگاه داده مطلع شد؟

مدیران سیستم می‌توانند با پرس‌وجو از کاتالوگ pg_class.relfrozenxid کهن‌ترین شناسه تراکنش منجمدنشده هر جدول را بررسی کرده و حاشیه ایمنی باقیمانده را بسنجند.

بررسی عمیق دیدگاه‌ها

طراحان موتور پایگاه داده

معماران پستگرس‌کیوال مرز چرخش شناسه‌ها را نتیجه اجتناب‌ناپذیر معماری ۳۲ بیتی دانسته و اعمال سپرهای دفاعی سازش‌ناپذیر را ضروری می‌دانند.

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

مدیران پایگاه داده

تیم‌های عملیاتی بر افت محسوس کارایی ناشی از ورودی/خروجی دیسک و بار سنگین مانیتورینگ متمرکز هستند.

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

طراحان موتور پایگاه داده 40%ارائه‌دهندگان زیرساخت ابری 30%مدیران پایگاه داده 30%
طراحان موتور پایگاه داده
پایبندی به مرزهای ریاضی و تضمین یکپارچگی داده‌ها را در اولویت قرار می‌دهند و سازوکارهای توقف اضطراری را برای ممانعت از تباهی اطلاعات اعمال می‌کنند.
ارائه‌دهندگان زیرساخت ابری
بر خودکارسازی عملیات نگهداری و ارائه سرویس‌های مدیریت‌شده تمرکز دارند تا محدودیت‌های ذاتی سیستم را از دید کاربران پنهان کنند.
مدیران پایگاه داده
بر بار عملیاتی، نیاز به پایش مداوم و فشار سنگین عملیات ورودی/خروجی ناشی از پاک‌سازی‌های تهاجمی تاکید می‌ورزند.

دیدگاه‌هایی که این گزارش پوشش نداده

  • توسعه‌دهندگان لایه کاربری

منابع

پوشش منابع

3 منبع

3 دیدگاه شناسایی‌شده

طراحان موتور پایگاه داده 40%ارائه‌دهندگان زیرساخت ابری 30%مدیران پایگاه داده 30%
  1. [1]PostgreSQL Global Development Groupطراحان موتور پایگاه داده

    Preventing Transaction ID Wraparound Failures

    مطالعه در PostgreSQL Global Development Group →
  2. [2]Postgres Professionalمدیران پایگاه داده

    Vacuuming: freezing

    مطالعه در Postgres Professional →
  3. [3]تیم سردبیری کوهستانطراحان موتور پایگاه داده

    تحلیل تیم سردبیری کوهستان

    مطالعه در تیم سردبیری کوهستان →

نظرات

همیشه در جریان باشید

هر زاویه. هر روز.

اخبار فناوری با پوشش کامل منابع و تحلیل دیدگاه‌ها، هر روز و رایگان.