چگونه Write-Ahead Logging و Two-Phase Locking اتمیسیته و ایزولاسیون را در پایگاههای داده رابطهای تضمین میکنند
پایگاههای داده رابطهای برای جلوگیری از از دست رفتن دادهها هنگام قطعی سیستم به ثبت پیشازنوشتن (WAL) و برای مدیریت تراکنشهای همزمان به قفلگذاری دوفازی (2PL) متکی هستند. درک این مکانیزمها، بدهبستانهای اساسی میان توان عملیاتی نوشتن، ایزولاسیون و زمان بازیابی را آشکار میکند.
به قلم نیما موسوی
این خبر را به اشتراک بگذارید
- مدافعان همزمانی بدبینانه
- تکمیل تضمینشده تراکنش و ایزولاسیون دقیق را بر توان عملیاتی موازی خام ترجیح میدهند.
- مدافعان همزمانی خوشبینانه
- اجرای موازی بدون قفل را در اولویت قرار میدهند و نرخ بالاتر لغو تراکنش را در ازای تاخیر کمتر میپذیرند.
- مهندسان ماندگاری داده
- بر لایه ذخیرهسازی فیزیکی تمرکز دارند و عملیات ورودی/خروجی ترتیبی را بهینهسازی میکنند تا از بقای دادهها در برابر خرابیهای سختافزاری اطمینان حاصل کنند.
دیدگاههایی که این گزارش پوشش نداده
- تولیدکنندگان سختافزار
- معماران پایگاه داده NoSQL
نکات کلیدی
- ثبت پیشازنوشتن (WAL) با افزودن تغییرات به یک لاگ ترتیبی پیش از تغییر پایگاه داده اصلی، ماندگاری دادهها را تضمین میکند.
- WAL با تبدیل عملیات کند و تصادفی دیسک (Random I/O) به عملیات سریع و ترتیبی، توان عملیاتی نوشتن را بهبود میبخشد.
- قفلگذاری دوفازی (2PL) با مجبور کردن تراکنشها به دریافت تمام قفلها پیش از آزادسازی آنها، ایزولاسیون را تضمین میکند.
- کنترل همزمانی خوشبینانه (OCC) جایگزینی بدون قفل برای 2PL ارائه میدهد، اما در ترافیک بالای نوشتن از نرخ بالای لغو تراکنشها رنج میبرد.
چرا مهم است
درک نحوه تضمین یکپارچگی دادهها به مهندسان کمک میکند تا معماری مناسبی برای حجم کاری خود انتخاب کنند. سوءتفاهم درباره این بدهبستانها میتواند به افت شدید عملکرد در ترافیک بالا یا از دست رفتن فاجعهبار دادهها هنگام خرابی سرور منجر شود.
محدودیت الزامآور برای هر پایگاه داده رابطهای این است که رسانه ذخیرهسازی زیرین باید پیش از تایید نوشتنهای ترتیبی، آنها را واقعاً ذخیره کند و عملیات همزمان نیز باید از نظر ریاضی قابل سریالسازی باشند. اگر دیسک درباره تکمیل دستور fsync دروغ بگوید، یا اگر ۲ پردازش بهطور همزمان روی یک حافظه بنویسند، کل توهم یک پایگاه داده قابلاعتماد فرو میریزد.
در حالی که فروشندگان مدرن پایگاههای داده اغلب روی تراکنشهای با «مقیاسپذیری بینهایت» و «تاخیر صفر» مانور تبلیغاتی میدهند، قابلیت واقعی آنها به ۲ الگوریتم بنیادین متکی است که دههها پیش عرضه شدهاند: ثبت پیشازنوشتن (WAL) و قفلگذاری دوفازی (2PL). این دو در کنار هم، ۴ ویژگی اصلی مدل ACID (اتمیسیته، سازگاری، ایزولاسیون، ماندگاری) را اعمال میکنند.[3][5]
اتمیسیته (Atomicity) نرخ موفقیت یا شکست ۱۰۰ درصدی را برای یک تراکنش دیکته میکند؛ هیچگونه تکمیل نسبی وجود ندارد. اگر برق سرور در میانه انتقال وجه قطع شود، پایگاه داده باید دقیقاً به حالت پیش از آغاز تراکنش بازگردد و تضمین کند که ۰ داده از دست رفته است.
مکانیزمی که این امر را تضمین میکند، ثبت پیشازنوشتن (WAL) است. همانطور که Bytebase اشاره میکند، WAL بر اساس یک قانون سختگیرانه «اول لاگ، دوم داده» عمل میکند. پیش از آنکه هرگونه تغییری در فایلهای اصلی پایگاه داده اعمال شود، این تغییرات به یک لاگ ماندگار افزوده میشوند.[4]
این طراحی یک گلوگاه حیاتی سختافزاری را حل میکند. نوشتن مستقیم در جداول پایگاه داده نیازمند عملیات ورودی/خروجی تصادفی (Random I/O) دیسک است که از نظر فیزیکی کند است. WAL با افزودن تغییرات به یک لاگ ترتیبی، نوشتنهای تصادفی را به نوشتنهای سریع و ترتیبی تبدیل میکند و ضمن تضمین وجود رکوردی از تراکنش روی دیسک، توان عملیاتی را بهشدت بهبود میبخشد.
در سرفصل دوره ۴۱۱۳ دانشگاه کلمبیا درباره سیستمهای توزیعشده آمده است: «عملیاتهای گنجاندهشده در یک تراکنش، علیرغم خرابیهای موقت پردازش یا ماشینی که پایگاه داده را اجرا میکند، یا همگی موفق میشوند یا هیچکدام.» اگر خرابی رخ دهد، پایگاه داده هنگام راهاندازی مجدد بهسادگی لاگ ترتیبی را بازپخش میکند تا دقیقاً به همان وضعیت قبلی بازگردد.[1]
در حالی که WAL با واقعیت فیزیکی خرابیها مقابله میکند، قفلگذاری دوفازی (2PL) هرجومرج منطقی همزمانی را مدیریت میکند. در سیستمی که ۲۴ ساعت شبانهروز و ۷ روز هفته کار میکند، هزاران کاربر ممکن است تلاش کنند تا دقیقاً همان ردیفها را بهطور همزمان بخوانند و بنویسند.[2]
در حالی که WAL با واقعیت فیزیکی خرابیها مقابله میکند، قفلگذاری دوفازی (2PL) هرجومرج منطقی همزمانی را مدیریت میکند.
بروشورهای بازاریابی مرتباً وعده «ایزولاسیون بینقص» را میدهند، اما واقعیت مهندسی نیازمند سریالپذیری دقیق ریاضی است؛ یعنی این تضمین که وضعیت نهایی پایگاه داده دقیقاً به گونهای باشد که گویی تراکنشها ۱ به ۱ و در یک ترتیب متوالی اجرا شدهاند.
مایکل فرانکلین در مقالهای در سال ۱۹۹۷ برای دانشگاه کارنگی ملون توضیح میدهد که مسئولیت حفظ این ایزولاسیون بر عهده نرمافزار کنترل همزمانی است. فرانکلین با تفکیک نقشهای WAL و 2PL مینویسد: «بازیابی تضمین میکند که پایگاه داده در برابر خطا مقاوم است؛ به این معنا که وضعیت پایگاه داده در نتیجه خرابی نرمافزار، سیستم یا رسانه مخدوش نمیشود.»[2]
2PL با تقسیم یک تراکنش به دقیقاً ۲ فاز مجزا به سریالپذیری دست مییابد: فاز رشد و فاز کاهش. در طول فاز اول، تراکنش قفلهای مورد نیاز خود (برای خواندن یا نوشتن) را روی دادهها دریافت میکند، اما نمیتواند هیچکدام را آزاد کند.[2]
زمانی که تراکنش به نقطه اوج خود میرسد و فاز دوم (فاز کاهش) را آغاز میکند، میتواند قفلها را آزاد کند اما اکیداً از دریافت قفلهای جدید منع میشود. این سختگیری ریاضی از سناریوهای کلاسیک «بنبست» (Deadlock) که در آن تراکنشها تا بینهایت منتظر یکدیگر میمانند، جلوگیری میکند.
با این حال، این رویکرد بدبینانه با یک بدهبستان شدید در عملکرد همراه است. از آنجا که 2PL فرض میکند تداخل رخ خواهد داد، تراکنشها را مجبور میکند در صف منتظر بمانند. در شرایط ترافیک بالا، این سربار قفلگذاری میتواند توان عملیاتی پایگاه داده را خفه کند و در حالی که پردازشها منتظر آزادسازی قفل هستند، چرخههای پردازنده (CPU) را بیکار بگذارد.
جایگزین این روش، کنترل همزمانی خوشبینانه (OCC) است که فرض میکند تداخلها نادر هستند. OCC به تراکنشها اجازه میدهد بدون قفل اجرا شوند و تنها در مرحله آخر آنها را اعتبارسنجی میکند. اگر در طول اعتبارسنجی تداخلی تشخیص داده شود، تراکنش بهسادگی لغو شده و دوباره تلاش میشود.
انتخاب میان 2PL و OCC کاملاً به نرخ تداخل حجم کاری بستگی دارد. در محیطهایی با ترافیک بالای نوشتن، هزینه لغو و تلاش مجدد مداوم تراکنشهای OCC بهسرعت از سربار قفلگذاری پیشاپیش 2PL فراتر میرود. در مقابل، حجمهای کاری که بیشتر شامل خواندن هستند، اغلب از ماهیت بدون قفل OCC بهره میبرند.
بررسی عمیق دیدگاهها
همزمانی بدبینانه (قفلگذاری دوفازی)
فرض میکند تراکنشها تداخل خواهند داشت و برای تضمین ایزولاسیون، دادهها را پیشاپیش قفل میکند.
موافق: سریالپذیری تداخل را بدون هدر دادن چرخههای پردازنده برای تراکنشهای لغوشده تضمین میکند. مخالف: در ترافیک بالا به دلیل تاخیرهای صف قفل، سربار تاخیر شدیدی تحمیل میکند. شواهد: 2PL با مجبور کردن تراکنش به دریافت تمام قفلهای لازم در فاز رشد پیش از آزادسازی آنها در فاز کاهش، از نظر ریاضی از ناهنجاریهای ایزولاسیون جلوگیری میکند. مناسب برای: زمانی که ترافیک نوشتن بالا است و هزینه محاسباتی بازگرداندن یک تراکنش پیچیده بسیار سنگین است. نامناسب برای: زمانی که حجم کاری عمدتاً شامل خواندن است، که باعث میشود تداخلها از نظر آماری نادر باشند و دریافت قفل به یک گلوگاه غیرضروری تبدیل شود.
کنترل همزمانی خوشبینانه (OCC)
فرض میکند تداخلها نادر هستند، به تراکنشها اجازه میدهد آزادانه اجرا شوند و تنها در زمان ثبت (Commit) آنها را اعتبارسنجی میکند.
موافق: تاخیرهای صف قفل را حذف میکند و امکان توان عملیاتی موازی عظیمی را برای کوئریهای بدون تداخل فراهم میسازد. مخالف: زمانی که چندین تراکنش مرتباً ردیفهای یکسانی را هدف قرار میدهند، از نرخ فلجکننده لغو تراکنش رنج میبرد. شواهد: تراکنشها دادهها را میخوانند و محاسبات را در یک فضای کاری خصوصی انجام میدهند و تنها در پایان وارد فاز اعتبارسنجی میشوند؛ اگر تداخلی تشخیص داده شود، تراکنش دور انداخته شده و دوباره تلاش میشود. مناسب برای: زمانی که حجم کاری عمدتاً خواندنی است یا تراکنشها مجموعههای مجزایی از دادهها را لمس میکنند و نرخ لغو را نزدیک به صفر نگه میدارند. نامناسب برای: فعالیت در محیطهای پررقابت مانند مدیریت موجودی یا دفاتر مالی، جایی که تلاشهای مجدد مداوم منابع بیشتری نسبت به قفلگذاری پیشاپیش مصرف میکنند.
ماندگاری فقط-افزودنی (ثبت پیشازنوشتن)
با ثبت ترتیبی تغییرات پیش از اصلاح فایلهای واقعی پایگاه داده، توان عملیاتی فوری نوشتن را در اولویت قرار میدهد.
موافق: با تبدیل عملیات کند و تصادفی دیسک به افزودنهای سریع و ترتیبی، تاخیر نوشتن را بهشدت کاهش میدهد. مخالف: زمان بازیابی از خرابی را افزایش میدهد، زیرا پایگاه داده باید پیش از پذیرش کوئریهای جدید، لاگ ترتیبی را بازپخش کند. شواهد: نوشتن مستقیم در فایلهای ذخیرهسازی اصلی پایگاه داده نیازمند عملیات ورودی/خروجی تصادفی است که در صورت بروز خرابی در میانه نوشتن، خطر مخدوش شدن پایگاه داده را به همراه دارد؛ WAL با افزودن هر تغییر به یک فایل لاگ در ابتدا، این مشکل را دور میزند. مناسب برای: استقرار در تقریباً تمام پایگاههای داده رابطهای مدرن، زیرا مزیت مداوم توان عملیاتی بالای نوشتن بسیار بیشتر از جریمه نادر بازیابی کندتر از خرابی است. نامناسب برای: استفاده در سیستمهای نهفته خاص که در آنها زمانهای راهاندازی مجدد آنی بهطور جدی بر سرعت نوشتن ترجیح داده میشود.
منابع
[1]Columbia Universityمدافعان همزمانی بدبینانهDistributed Systems 1, Columbia Course 4113, Implementing Transactions. (Single Node).
مطالعه در Columbia University →
[2]CMU School of Computer Scienceمدافعان همزمانی بدبینانه1 Introduction (Serializability, Two-Phase Locking, Write Ahead Logging)
مطالعه در CMU School of Computer Science →
[3]IEEE Technology Navigatorمدافعان همزمانی خوشبینانهTransaction databases
مطالعه در IEEE Technology Navigator →
[4]Bytebaseمهندسان ماندگاری دادهWhat is Write Ahead Logging (WAL)
مطالعه در Bytebase →
[5]Varsity Tutorsمهندسان ماندگاری دادهUnderstand transactions conceptually (BEGIN/COMMIT/ROLLBACK) (intro)
مطالعه در Varsity Tutors →
[6]تیم سردبیری کوهستانمهندسان ماندگاری دادهتحلیل تیم سردبیری کوهستان
مطالعه در تیم سردبیری کوهستان →
نظرات
بیشتر در متا
مشاهده همه →معماری شناختی
چگونه اثر تقدم و تاخر، حافظه بلندمدت را از حافظه کاری جدا میکنند
5 منبع
معماری جیاناساس
چگونه شبهفاصله و سهپهلویابی خطای ساعت گیرنده جیپیاس را از موقعیت ماهواره تفکیک میکنند
6 منبع
ایمنی هوش مصنوعی
فروپاشی یک مرز ریاضی: چگونه هوش مصنوعی تفاوت بین شانس ذاتی و کمبود دانش را بازتعریف میکند
6 منبع
اقتصاد کلان
مکانیسمهای نظریه پولی نوین: شواهد در مورد بدهی حاکمیتی و تورم چه میگویند؟
8 منبع
هر زاویه. هر روز.
دریافت متا اخبار همراه با پوشش کامل منابع و تحلیل دیدگاهها، مستقیم در صندوق ورودی شما.





