Mahdi Golbaz
Mahdi Golbaz
خواندن ۲ دقیقه·۳ سال پیش

مفهوم Write ahead logging در پایگاه داده ها

همانطور که در پست قبلی گفته شد:

اسید - ACID (Atomicity, Consistency, Isolation, Durability) به طور کلی تضمینی برای انجام صحیح تراکنش هاست و این خصوصیات وقتی از همزمانی(concurrency) در سیستم استفاده کنیم بیشتر به چشم میآید.به این معنا که عملیات هایی که در سیستم همزمان انجام میشوند با رعایت خواص اسید ضمانت میشوند.

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

برای این منظور پایگاه داده ها از WAL(Write ahead logging) استفاده میکنند.

با توجه به اینکه سریع ترین پردازش در حافظه append کردن روی فایل میباشد؛ ایده اصلی پشت این تکنیک ثبت تمام تراکنش ها روی storage یا همان disk است پیش از آنکه اجرای آنها روی پایگاه داده باعث تغییر شود. در این صورت اگر پس از ثبت و log کردن عملیات های مدنظر و حین اعمال آنها در سیستم مشکلی پیش بیاید؛ سیستم میتواند تغییرات صحیح را از توی لاگ های موجود recovery کند. همچنین این لاگ ها به پایگاه داده ها قابلیت roll back نیز میتواند بدهد که الآن مورد بحث نیست.

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

نکته قابل تامل در مطالب بالا؛ این است که اساسا write روی حافظه disk نسبت به سرعت پردازش در سیستم ها بسیار کند است و باعث کاش performance میشود. معمولا سیستم عامل ها برای حل این مشکل از buffer استفاده میکنند به این صورت که داده ها روی memory به صورت دوره‌ای cache میشوند و با توجه به استراتژی اعمال شده روی کرنل؛ بافر روی دیسک اصلی Flush میشود.(به این عمل sync-ing گفته میشود)

بدیهی است که اگر پایگاه داده بخواهد از همین استراتژی برای ذخیره لاگ ها استفاده کند در صورت قطعی برق ناگهانی یا بروز مشکل در سیستم؛ لاگ های روی memory نیز از دست میرود و عملا write ahead بی‌فایده بوده؛ ولی اگر از sync استفاده کند با کندی سیستم و کاهش performance مواجه خواهد شد.

معمولا در پایگاه داده های مختلف بسته به نیاز محصول باید sync or non-sync را کانفیگ کرد؛ جزئیات این کانفیگ ها در داکیومنت های هرپایگاه داده به تفصیل یافت میشود ولی برای مطالعه کلی‌تر میتوانید به این مطلب مراجعه کنید.

dbmsacidmysql
علاقه‌مند به برنامه‌نویسی؛ زیرساخت و تکنولوژی
شاید از این پست‌ها خوشتان بیاید