مکانیزم کش قدرتمند فایل سیستم ZFS (سری h از ذخیره سازهای کیونپ QNAP از این مکانیزم بهره می برند)
ZFS یک فایل سیستم پیشرفته است که ویژگی های مفیدی مانند pooled storage ، data scrubbing ، ظرفیت بالا و بسیاری دیگر را در دسترس قرار می دهد. اما یکی از مفیدترین ویژگی های ZFS روش کش کردن داده ها در خواندن و نوشتن اطلاعات است. فایل سیستم ZFS به شما اجازه استفاده از کش لایه ای را برای بکارگیری حافظه های مختلف میدهد. کش فایل سیستم ZFS
اولین مرحله کش در فایل سیستم ZFS را با نام Adaptive Replacement Cache (ARC) یا جایگزینی تطبیقی می شناسیم، به محض اینکه تمامی فضای اختصاص یافته به این لایه از کش مورد استفاده قرار بگیرد، فایل سیستم ZFS جدیدترین و پرکاربردترین داده های را به لایه دوم یا Level 2 Adaptive Replacement Cache (L2ARC) منتقل می کند.
این دو لایه از سرویس کش یعنی ARC و L2ARC بصورت مستقیم اطلاعات خوانده شده یا به اصطلاحی خواندن را کش می کنند. به این معنی که سرعت خواندن اطلاعات از روی سرور یا ذخیره ساز را افزایش می دهند و سیستم نیاز به جستجو در دیسک های مکانیکی با سرعت کم را ندارد.
برای کش نوشتن یا write سیستم عامل ZFS از ویژگی ZIL که در واقع یک نوع فایل لاگ می باشد استفاده می کند (در بیشتر مقاله ها از ZIL بعنوان یکی از لایه های کش در فایل سیستم ZFS نام برده می شود). در این مقاله سعی می کنیم تمامی این اصطلاحات را که می توانند در کیفیت سرویس دهی دستگاه شما نقش موثری را ایفا کنند شرح دهیم.
نوشتن یا Writes
وقتی ZFS یک درخواست نوشتن Write دریافت می کند، در همان لحظه شروع به نوشتن اطلاعات بر روی دیسک نمی کند، آنها را قبل از ارسال به گروه های تراکنشی یا Transaction Groups (TXGs) در بازه های زمانی مشخص (پیش فرض هر 5 ثانیه) در رم RAM ذخیره می کند. این مدل فایل سیستم تراکنشی یا Transactional File System نامیده می شود. کش فایل سیستم ZFS
این تکنیک به بهبود عملکرد سیستم کمک بسیاری می کند زیرا تمامی اطلاعات قبل از انتقال به هارد دیسک ها ساماندهی شده و روند نوشتن بر روی دیسک های مغناطیسی آسان تر و سریعتر انجام می شود. همچنین از تخریب اطلاعات جلوگیری می شود زیرا در صورت قطع برق، اطلاعات بصورت ناقص یا تکه تکه نوشته نمی شوند و اتقال اطلاعات جزیی تمامی اطلاعات موجود بر روی TXG کنار گذاشته شده و مجددا پردازش می شود.
برای درک بهتر اصول اولیه نوشتن یا Write در فایل سیستم ZFS نیاز به درک بهتری از تفاوت مدل های نوشتن همزمان یا synchronous و غیر همزمان یا asynchronous داریم.
نوشتن غیر همزمان یا Asynchronous Writes
نوشتن غیر همزمان به این معنی است که : تمامی داده ها برای یک درخواست نوشتن در رم RAM کش شده و کاربر (ارسال کننده اطلاعات یا درخواست کننده نوشتن بر روی ذخیره ساز) پروسه را کامل شده می بیند و سپس دستگاه اطلاعات را بر روی دیسک ها می نویسد. کش فایل سیستم ZFS
زمانی که کاربر یک درخواست نوشتن را ارسال می کند بلافاصله در رم RAM ذخیره می شود سپس ذخیره ساز به کاربر اعلام می کند که درخواست نوشتن انجام و کامل شده است. بعد از آن ذخیره ساز درخواست ها دیگر را نیز دریافت می کند و همزمان اطلاعات ذخیره شده بر روی رم را در قالب Transaction group ها بر روی دیسک می نویسد.
مدل Asynchronous Writes یا نوشتن های غیر همزمان در نظر کاربر بدلیل سرعت بالای نوشتن بر روی حافظه رم از کیفیت و سرعت بسیار بالایی برخواردار می باشد.
اما یک مشکل وجود دارد، اگر چه اطلاعات از بین نمی روند ولی در صورت قطع برق بدلیل volatile یا فرار بودن حافظه رم همه Transaction group ها از بین خواهند رفت. بهمین دلیل برای بهره گیری از ثبات بیشتر در نوشتن اطلاعات می توانیم از نوشتن همزمان یا Synchronous writes استفاده کنیم که در مقابل کیفیت و سرعت را نیز کارهش می دهد.
نوشتن همزمان بدون SLOG یا Synchronous Writes (without a separated logging device)
نوشتن همزمان به این معنی است که : قبل از اطلاع رسانی از کامل شدن مرحله نوشتن به کاربر، می بایست تایید نوشته شدن اطلاعات بر روی حافظه دائمی گرفته شود.
زمانی که کاربر یک درخواست نوشتن در مدل synchronous write یا نوشتن همزمان ارسال می کند، همچنان در ابتدا مانند نوشتن غیر همزمان اطلاعات بر روی رم RAM نوشته می شود اما ذخیره ساز به کاربر تکمیل نوشتن اطلاعات را اعلام نمی کند تا زمانی که مستندات یا log های آن در ZFS intent log یا ZIL نوشته نشده باشد. بعد از بروز شدن ZIL دستگاه متعهد به نوشتن اطلاعات بوده و نتیجه را به کاربر اعلام می کند.
ZIL بصورت پیش فرض در قالب یک پارتیشن بر روی storage pool وجود دارد و این به آن معناست که هدهای هارد دیسک ها می بایست بصورت فیزیکی به آن قسمت از دیسک رفته تا بتواند ZIL را بروزرسانی کنند و این یکی از عوامل موثر بر سرعت و کیفیت ذخیره سازی در این مدل می باشد. در نتیجه نوشتن بر روی دیسک های کندتر مانند HDD ها موجب کاهش سرعت بویژه در نوشتن اطلاعات کم حجم می شود.
پیشنهاد می شود در هنگام استفاده از فایل سیستم ZFS برای جلوگیری از افت سرعت و از بین رفتن ناگهانی اطلاعات در مدل های نوشتن همزمان، پارتیشن ZIL بر روی یک یا چند درایو SSD با پارتیشن جداگانه که از سرعت بسیار بالاتری برخوردار می باشند قرار بگیرد. به این فضای اختصاصی که برای ZIL در نظر گرفته می شود Separated logging device (SLOG) یا فضای جداگانه برای ذخیره سازی لاگ های نوشتن گفته می شود.
در زبان ساده تر، ZFS بصورت پیش فرض ZIL خود را بر روی storage pool ایجاد می کند که در صورت استفاده از هارد دیسک ها HDDs بسیار کند بوده و نمی تواند کیفیت نوشتن را بصورت ملموس تغییر دهد. در نتیجه با استفاده از درایوهای SSD و بمنظور قرار دادن ZIL بر روی آن کیفیت و سرعت نوشتن اطلاعات را چندین برابر می کنیم. به این SSD ها اصطلاحا SLOG می گوییم. کش فایل سیستم ZFS
نوشتن همزمان با استفاده از SLOG یا Synchronous Writes with a SLOG
هنگامی که ZIL را بر روی SSD قرار دهیم، درخواست های نوشتن همزمان کاربر با سرعت خیلی بیشتری در ZIL ثبت می شوند. در این شرایط اگر اطلاعات موجود بر روی رم RAM بدلیل قطع برق از بین بروند، سیستم بعد از بازگشت برای اطلاعات از وضعیت به ZIL مراجعه می کند. مکانیزم کش قدرتمند فایل سیستم ZFS
از طرف دیگر ممکن است داده های بلافاصله همراه با ثبت اطلاعات ذخیره سازی بر روی ZIL به دیسک ها منتقل شده و در آنجا ذخیره شوند. اطلاعات متادیتای داده های بعد از ارسال TXG مرتبط بروزرسانی شده و محل ذخیره سازی دقیق داده ها بر روی دیسک مشخص می گردد.
در صورتی که قطعی برق رخ دهد، ذخیره ساز ZIL را برای اطلاع از محل ذخیره شدن اطلاعات چک می کند. سیستم تا قبل از انتقال TXG و بروزرسانی مدتادیتا از محل ذخیره سازی مطلع نمی شود بهمین دلیل نیاز به چک کردن ZIL جهت اطلاع از محل ذخیره سازی داده های دارد. کش فایل سیستم ZFS
یکی از مواردی که در مورد SLOG باید مورد توجه قرار بگیرد این است که استفاده از SLOG عموما یکی از بهترین راهکارها جهت ادامه کار سیستم در هنگام قطعی برق می باشد و می تواند ضریب اطمینان به سیستم را تا حد قابل قبولی افزایش دهد.
استفاده از SLOG به چه میزان در افزایش کیفیت ذخیره سازی موثر است؟
تاثیر SLOG در کیفیت وابسته به اپلیکیشن و مدل استفاده از آن است. برای انتقال داده های کم حجم یا فایل های کوچک (small IO) و یا sequential IO (انتقال و نوشتن داده ها بصورت پشت سر هم) می توانیم تاثیر زیادی را در استفاده از SLOG مشاهده کنیم.
برای نوشتن های همزمان یا synchronous writes مانند دیتابیس ها و سرویس های مجازی سازی نیز می تواند تاثیر بالایی داشته باشد اما باید در نظر داشت وظیفه اصلی SLOG افزایش کیفیت عملکرد نیست بلکه نقش موثر آن حفاظت و ایجاد دسترسی سریع به داده ها در هنگام قطع برق می باشد که در نتیجه آن سرعت بازگشت به سرویس دستگاه را بصورت چشمگیری افزایش می دهد.
برای سرویس های حساس و حیاتی مانند سرویس های بانکی از دست دادن 5 ثانیه از اطلاعات در حال انتقال که فاصله زمانی ارسال TXG بعدی می باشد می تواند هزینه بسیار زیادی را به کسب و کار تحمیل کند. این می تواند از دلایل اصلی باشد که از SLOG به عنوان کش نام نمی بریم و هانطور که اسم آن مشخص است نوعی لاگ بر داری محسوب می شود.
دقت داشته باشید در صورتی از دست رفتن 5 ثانیه از داده ها برای شما مشکل ساز است می بایست تمامی انتقال ها را از روش همزمان یا synchronous انجام دهید و در مقابل اگر هیچ داده ای حیاتی نیست می تواند قابلیت sync را غیر فعال کرد و از RAM بعنوان کش (با پذیرفتن ریسک از دست رفتن TGX در مواجهه با قطعی برق) استفاده نمود. کش فایل سیستم ZFS
خواندن Reads
دقیقا مانند عملیات نوشتن فایل سیستم ZFS عملیات خواندن را نیز بر روی RAM دستگاه کش می کند که این مدل از کش adaptive replacment cache (ARC) نامیده می شود. در واقع نسخه بروزرسانی شده IBM ARC می باشد و تقریبا از تمامی مدل های کش بدلیل استفاده از الگوریتم های پیچیده باهوشتر می باشد.
ARC
عملکرد ARC بصورت ذخیره کردن یا نگه داشتن پرکاربردترین (پرتکرارترین) و جدیدترین اطلاعات ارسال شده به ذخیره ساز بر روی رم RAM می باشد. بر خلاف ZIL اطلاعات موجود در کش ARC یا رم یک کپی از اطلاعاتی می باشد که بر روی دیسک ها و storage pool موجود می باشد.
این داده فقط به دلیل تفزایش سرعت و کارایی سیستم در رم قرار می گیرند تا سیستم برای بکارگیری انها به درایوها و دیسک ها کم سرعت تر مراجعه نکند. داشتن یک ARC بزرگ و پرظرفیت مستلزم استفاده از مقدار بسیار زیادی RAM بر روی دستگاه می باشد اما در صورت نیاز اپلیکیشن ها و دستگاه به رم جهت پردازش، سیستم ARC فضای مورد استفاده خود را کاهش داده و فضای رم را در اختیار دستگاه قرار می دهد.
برای استفاده بهینه تر از فضای کش، ARC بصورت مداوم مقدار فضای اختصاص داده شده به داده های اخیرا استفاده شده یا Most recent و یا اغلب استفاده شده یا most often را در هنگام دریافت یک درخواست استفاده از داده های سرد یا cold hit تغییر می دهد.
درخواست استفاده از داده های سرد یا cold hit زمانی اتفاق می افتد که کاربر یا دستگاه درخواست استفاده از داده هایی را داشته باشند که قبلا بر روی کش قرار داشته ولی برای ایجاد فضای کافی جهت ذخیره داده های جدید از کش بیرون رفته است.
معمولا ZFS مسیر ذخیره سازی اطلاعاتی را که بر روی کش قرار داشته اند و بر روی دیسک ها ذخیره شده اند را ثبت می کند تا زمان ایجاد یک درخواست از داده های سرد بتواند سریعتر و راحت تر اطلاعات را در اختیار کاربر قرار دهد.
با توضیحات بالا به این نتیجه می رسیم که هر اندازه RAM بیشتری در اختیار داشته باشیم کیفیت بالاتر و بهتری در خواندن اطلاعات از روی دستگاه در اختیارمان قرار می گیرد. اما محدودیت هایی در اضافه کردن فضای ARC وجود دارد و عمده آن بدلیل هزینه بالا و محدودیت فیزیکی مادربرد، تعداد اسلات های رم و ظرفیت رم قابل پذیرش دستگاه می باشد. در صورتی که ARC شما پر است و از حداکثر میزان رم بر روی دستگاه استفاده کرده اید می بایست اضافه کردن لایه دوم ARC یا level 2 ARC (L2ARC) باشید.
L2ARC
این لایه یعنی L2ARC بر روی SSD ایجاد می شود و علی رقم اینکه از RAM کندتر است اما همچنان به نسبت دیسک های HDD سرعت بالاتری دارد. با اضافه کردن این لایه دستگاه برای پیدا کردن و خواندن اطلاعات بجای مراجعه به هارد دیسک ها، بر روی RAM و SSD بدنبال اطلاعات می گردد که این کمک بسیاری به افزایش سرعت و کیفیت خواندن می کند.
لایه دوم زمانی فعال می شود که لایه اول شما یعنی ARC پر شده و در نتیجه با خالی کردن آن بر روی L2ARC فضای بیشتری بر روی RAM ها جهت کش کردن اطلاعات ضروری و مهم تر بر اساس الگوریتم ها ایجاد می شود. با توجه به ظرفیت SSD ها لایه دوم یا L2ARC مدت زمان بسیار بیشتری را جهت پر شدن نیاز داشته و این عمل مراجعه دستگاه به HDD ها را کمتر می کند.
توجه داشته باشید بر خلاف SLOG که جهت نوشتن اطلاعات مورد استفاده قرار می گیرد برای L2ARC نیاز به ایجاد رید 1 ندارید و می توانید تنها از یک SSD استفاده کنید. نسخه اصلی تمامی اطلاعاتی که بر روی L2ARC قرار می گیرد بر روی هارد دیسک ها وجود دارد.
همچنین L2ARC قسمتی از RAM را جهت پیگیری مسیر ذخیره سازی در اختیار می گیرد که در نتیجه اضافه کردن رم را قبل از ایجاد L2ARC منطقی تر می کند.
جمع بندی:
- کش ZIL فضایی که اطاعات داده ها قبل از دریافت تایید نوشتن توسط هارد دیسک ها و ارسال ان به کاربر در ان ذخیره می شود. بصورت پیش فرض بر روی storage pool وجود دارد و با اضافه کردن SSD و ایجاد SLOG سرعت ان را افزایش می دهیم.
- SLOG یک دستگاه یا درایو جداگانه و مجزا برای ذخیره کردن اطلاعات ZIL می باشد. وظیفه اصلی ان جلوگیری از گم شدن اطلاعات در صورت قطعی برق می باشد و همچنین کیفیت و سرعت نوشتن را افزایش می دهد.
- کش ARC قسمتی از رم است که با کش کردن داده ها سرعت خواندن را افزایش می دهد.
- کش L2ARC یک قسمت از کش ARC است که بر روی SSD ایجاد می شود و ظرفیت رم را جهت کش کردن اطلاعات بیشتر افزایش می دهد.
نویسنده : امیر قربانعلی