ZFS (قبلاً Zettabyte File System ) یک سیستم فایل با قابلیت مدیریت حجم است . این به عنوان بخشی از سیستم عامل Sun Microsystems Solaris در سال 2001 آغاز شد. بخش های بزرگی از Solaris، از جمله ZFS، تحت یک مجوز منبع باز به عنوان OpenSolaris برای حدود 5 سال از سال 2005 منتشر شد، قبل از اینکه تحت مجوز منبع بسته قرار گیرد زمانی که شرکت Oracle Sun را خریداری کرد. در سال 2009-2010. در طی سالهای 2005 تا 2010، نسخه منبع باز ZFS به Linux ، Mac OS X (ادامه به عنوان MacZFS ) و FreeBSD منتقل شد . در سال 2010، پروژه illumos یک نسخه جدید از OpenSolaris، از جمله ZFS را برای ادامه توسعه خود به عنوان یک پروژه منبع باز ایجاد کرد . در سال 2013، OpenZFS برای هماهنگی توسعه ZFS منبع باز تاسیس شد. [3] [4] [5] OpenZFS کد اصلی ZFS را حفظ و مدیریت میکند، در حالی که سازمانهایی که از ZFS استفاده میکنند، کد خاص و فرآیندهای اعتبارسنجی مورد نیاز برای ZFS را برای ادغام در سیستمهای خود حفظ میکنند. OpenZFS به طور گسترده در سیستم های شبه یونیکس استفاده می شود . [6] [7] [8]
مدیریت دادههای ذخیرهشده عموماً شامل دو جنبه است: مدیریت حجم فیزیکی یک یا چند دستگاه ذخیرهسازی بلوک (مانند دیسکهای سخت و کارتهای SD )، از جمله سازماندهی آنها در دستگاههای بلوک منطقی به عنوان VDEV (دستگاه مجازی ZFS) [9] همانطور که مشاهده میشود. توسط سیستم عامل (اغلب شامل یک مدیر حجم ، کنترلر RAID ، مدیر آرایه یا درایور دستگاه مناسب ) و مدیریت داده ها و فایل هایی که در این دستگاه های بلوک منطقی (یک سیستم فایل یا سایر ذخیره سازی داده ها) ذخیره می شوند.
ZFS غیرمعمول است زیرا بر خلاف اکثر سیستمهای ذخیرهسازی دیگر، هر دوی این نقشها را یکی میکند و هم به عنوان مدیر حجم و هم به عنوان سیستم فایل عمل میکند . بنابراین، هم از دیسکها و حجمهای فیزیکی (از جمله وضعیت، وضعیت و چیدمان منطقی آنها در حجمها) و همچنین همه فایلهای ذخیرهشده روی آنها اطلاعات کامل دارد. ZFS طوری طراحی شده است که (با توجه به سخت افزار مناسب ) اطمینان حاصل کند که داده های ذخیره شده روی دیسک ها به دلیل خطاهای فیزیکی، پردازش نادرست توسط سخت افزار یا سیستم عامل ، یا رویدادهای پوسیدگی بیت ها و خرابی داده ها که ممکن است در طول زمان اتفاق بیفتد، از بین نمی روند. کنترل کامل آن بر روی سیستم ذخیره سازی برای اطمینان از اینکه هر مرحله، چه مربوط به مدیریت فایل یا مدیریت دیسک باشد ، تایید، تایید، در صورت نیاز تصحیح و بهینه سازی می شود، به گونه ای که کارت های کنترل کننده ذخیره سازی و سیستم های حجم و فایل جدا می شود. نمی تواند به دست آورد.
ZFS همچنین دارای مکانیزمی برای دادهها و عکسهای فوری و تکرار در سطح استخر است ، از جمله شبیهسازی عکس فوری ، که توسط مستندات FreeBSD به عنوان یکی از «قویترین ویژگیها» با عملکردی توصیف شده است که «حتی سایر سیستمهای فایل با عملکرد عکس فوری فاقد آن هستند». [10] تعداد بسیار زیادی از عکسهای فوری را میتوان بدون کاهش عملکرد گرفت، که اجازه میدهد از عکسهای فوری قبل از عملیات مخاطرهآمیز سیستم و تغییرات نرمافزاری استفاده شود، یا از کل سیستم فایل تولیدی ("زنده") به طور کامل چندین بار در ساعت عکسبرداری شود. برای کاهش از دست دادن داده ها به دلیل خطای کاربر یا فعالیت مخرب. عکسهای فوری را میتوان به صورت زنده بازگردانی کرد یا وضعیتهای قبلی سیستم فایل را حتی در سیستمهای فایل بسیار بزرگ مشاهده کرد، که منجر به صرفهجویی در مقایسه با فرآیندهای پشتیبانگیری و بازیابی رسمی میشود. [10] عکس های فوری را نیز می توان برای تشکیل فایل سیستم های مستقل جدید شبیه سازی کرد. ZFS همچنین توانایی گرفتن یک عکس فوری در سطح استخر (معروف به "نقطه بازرسی") را دارد که امکان بازگشت عملیاتی را که ممکن است کل ساختار استخر را تحت تاثیر قرار دهد یا کل مجموعه دادهها را اضافه یا حذف کند را دارد.
در سال 1987، AT&T Corporation و Sun اعلام کردند که در پروژه ای برای ادغام محبوب ترین انواع یونیکس در بازار در آن زمان: Berkeley Software Distribution ، UNIX System V و Xenix همکاری می کنند . این نسخه Unix System V Release 4 (SVR4) شد. [11] این پروژه با نام Solaris منتشر شد ، که جانشین SunOS 4 شد (اگرچه نسخههای SunOS 4.1. x micro به صورت ماسبق به نام Solaris 1 نامگذاری شدند ). [12]
ZFS توسط تیمی در Sun به رهبری جف بونویک ، بیل مور، [13] و متیو آرنز طراحی و اجرا شد. در 14 سپتامبر 2004 اعلام شد، [14] اما توسعه در سال 2001 آغاز شد. [15] کد منبع برای ZFS در 31 اکتبر 2005 در صندوق اصلی توسعه Solaris ادغام شد [16] و به عنوان بخشی از ساخت برای توسعه دهندگان منتشر شد. 27 OpenSolaris در 16 نوامبر 2005. در ژوئن 2006، Sun اعلام کرد که ZFS در به روز رسانی اصلی 6/06 Solaris 10 گنجانده شده است . [17]
Solaris در ابتدا به عنوان نرم افزار اختصاصی توسعه داده شد ، اما Sun Microsystems یکی از طرفداران تجاری اولیه نرم افزار منبع باز بود و در ژوئن 2005 اکثر کدهای Solaris را تحت مجوز CDDL منتشر کرد و پروژه منبع باز OpenSolaris را تأسیس کرد . [18] در Solaris 10 6/06 ("U2")، Sun سیستم فایل ZFS را اضافه کرد و ZFS را به طور مکرر با ویژگی های جدید در طول 5 سال آینده به روز کرد. ZFS تحت این مجوز منبع باز به Linux ، Mac OS X (ادامه به عنوان MacZFS ) و FreeBSD منتقل شد .
نام در یک نقطه به معنای "Zettabyte File System" بود، [19] اما در سال 2006، نام دیگر به عنوان مخفف در نظر گرفته نمی شد. [20] یک سیستم فایل ZFS می تواند تا 256 کوادریلیون زتابایت (ZB) را ذخیره کند.
در سپتامبر 2007، NetApp از Sun شکایت کرد و ادعا کرد که ZFS برخی از پتنت های NetApp را در Write Anywhere File Layout نقض کرده است . Sun در اکتبر همان سال با ادعای خلاف این شکایت کرد. این دعاوی در سال 2010 با یک توافق نامعلوم پایان یافت. [21]
نسخههای پورتشده ZFS در سال 2005 ظاهر شدند. پس از خرید Sun توسط Oracle در سال 2010، نسخه Oracle از ZFS به منبع بسته تبدیل شد و توسعه نسخههای منبع باز بهطور مستقل و با هماهنگی OpenZFS از سال 2013 ادامه یافت.
نمونه هایی از ویژگی های خاص ZFS عبارتند از:
یکی از ویژگیهای اصلی که ZFS را از سایر سیستمهای فایل متمایز میکند این است که با تمرکز بر یکپارچگی دادهها با محافظت از دادههای کاربر روی دیسک در برابر خرابی دادههای بیصدا ناشی از تخریب دادهها ، نوسانات برق ( بالاهای ولتاژ )، اشکالات در سیستم عامل دیسک ، فانتوم طراحی شده است. می نویسد (نوشتن قبلی به دیسک نمی رسد)، خواندن/نوشتن اشتباه هدایت می شود (دیسک به بلوک اشتباه دسترسی پیدا می کند)، خطاهای برابری DMA بین آرایه و حافظه سرور یا از درایور (از آنجایی که جمع کنترلی داده های داخل آرایه را تایید می کند)، خطاهای درایور (داده ها در بافر اشتباه داخل هسته جمع می شوند)، بازنویسی های تصادفی (مانند تعویض به یک سیستم فایل زنده) و غیره.
مطالعهای در سال 1999 نشان داد که نه هیچ یک از سیستمهای فایل اصلی و گسترده در آن زمان (مانند UFS ، Ext ، [22] XFS ، JFS ، یا NTFS )، و نه RAID سختافزاری (که مشکلاتی با یکپارچگی دادهها دارد ) محافظت کافی در برابر دادهها ارائه نکرده است. مشکلات فساد [23] [24] [25] [26] تحقیقات اولیه نشان می دهد که ZFS از داده ها بهتر از تلاش های قبلی محافظت می کند. [27] [28] همچنین سریعتر از UFS [29] [30] است و می توان آن را جایگزین آن دانست.
در ZFS، یکپارچگی داده ها با استفاده از یک چک جمع مبتنی بر فلچر یا یک هش SHA-256 در سراسر درخت سیستم فایل به دست می آید. [31] هر بلوک داده جمعبندی میشود و مقدار چک جمعآوری سپس در نشانگر آن بلوک ذخیره میشود - نه در خود بلوک واقعی. سپس، نشانگر بلوک جمعبندی میشود و مقدار در نشانگر آن ذخیره میشود . این جمعبندی چک تا آخر سلسله مراتب دادههای سیستم فایل تا گره ریشه ادامه مییابد، که جمعبندی نیز چک میشود، بنابراین یک درخت Merkle ایجاد میکند . [31] خرابی دادههای حین پرواز یا خواندن/نوشتن فانتوم (دادههای نوشتهشده/خوانده شده به درستی جمعبندیهای چک را میخوانند، اما در واقع اشتباه هستند) توسط اکثر فایلسیستمها غیرقابل شناسایی هستند، زیرا آنها چکسوم را با دادهها ذخیره میکنند. ZFS جمع چک هر بلوک را در نشانگر بلوک والد خود ذخیره میکند تا کل استخر خود تأیید شود. [31]
هنگامی که به یک بلوک دسترسی پیدا می شود، صرف نظر از اینکه آن داده یا فراداده باشد، جمع چک آن محاسبه می شود و با مقدار جمع کنترل ذخیره شده آن چیزی که «باید» باشد مقایسه می شود. اگر جمعهای چک مطابقت داشته باشند، دادهها از پشته برنامهنویسی به فرآیندی که آن را درخواست کرده است منتقل میشود. اگر مقادیر مطابقت نداشته باشند، در صورتی که استخر ذخیرهسازی افزونگی دادهها را فراهم کند ، با فرض اینکه کپی دادهها آسیبی ندیده و دارای جمعهای بررسی منطبق باشد، ZFS میتواند دادهها را بهبود بخشد. [32] به صورت اختیاری میتوان افزونگی اضافی درون استخر را با مشخص کردن کپی=2 (یا کپی=3 ) فراهم کرد، به این معنی که دادهها دو بار (یا سه بار) روی دیسک ذخیره میشوند و عملاً نصف میشوند (یا برای کپیها ). = 3 ، کاهش به یک سوم) ظرفیت ذخیره سازی دیسک. [33] بهعلاوه، برخی از انواع دادههایی که توسط ZFS برای مدیریت استخر مورد استفاده قرار میگیرند، بهطور پیشفرض برای ایمنی حتی با تنظیم پیشفرض کپی=1، چندین بار ذخیره میشوند.
اگر نسخههای دیگری از دادههای آسیبدیده وجود داشته باشد یا بتوان آنها را از جمعهای چک و دادههای برابری بازسازی کرد ، ZFS از یک کپی از دادهها استفاده میکند (یا آنها را از طریق مکانیزم بازیابی RAID دوباره ایجاد میکند) و چکسوم را مجدداً محاسبه میکند – که در حالت ایدهآل منجر به بازتولید مقدار مورد انتظار اولیه میشود. ارزش اگر دادهها از این بررسی یکپارچگی عبور کنند، سیستم میتواند تمام نسخههای معیوب را با دادههای خوب بهروزرسانی کند و افزونگی بازیابی میشود.
اگر هیچ نسخهای از دادههای آسیبدیده وجود نداشته باشد، ZFS استخر را در وضعیت معیوب قرار میدهد، [34] از استفاده آینده آن جلوگیری میکند و هیچ راه مستندی برای بازیابی محتویات استخر ارائه نمیدهد.
سازگاری دادههای نگهداری شده در حافظه، مانند دادههای کش شده در ARC، بهطور پیشفرض بررسی نمیشود، زیرا انتظار میرود ZFS روی سختافزار با کیفیت سازمانی با RAM اصلاحکننده خطا اجرا شود . با این حال، قابلیت بررسی داده های درون حافظه وجود دارد و می توان آن را با استفاده از "پرچم های اشکال زدایی" فعال کرد. [35]
برای اینکه ZFS بتواند یکپارچگی داده ها را تضمین کند، به چندین نسخه از داده ها نیاز دارد که معمولاً در چندین دیسک پخش می شوند. این معمولاً با استفاده از یک کنترلر RAID یا به اصطلاح RAID "نرم" (ساخته شده در یک سیستم فایل ) به دست می آید.
در حالی که ZFS میتواند با دستگاههای RAID سختافزاری کار کند ، اگر دسترسی خام به همه دستگاههای ذخیرهسازی داشته باشد، معمولاً کارآمدتر و با محافظت از دادههای بیشتری کار میکند. ZFS برای یک دید صادقانه برای تعیین لحظه ای که داده ها به صورت ایمن نوشته شده اند، به دیسک متکی است و الگوریتم های متعددی دارد که برای بهینه سازی استفاده از کش ، شستشوی کش و مدیریت دیسک طراحی شده است.
دیسکهایی که با استفاده از سختافزار، سفتافزار، دیگر RAID «نرم» یا هر کنترلکننده دیگری که مسیر ورودی/خروجی ZFS به دیسک را تغییر میدهد، به سیستم متصل شدهاند، بر عملکرد ZFS و یکپارچگی دادهها تأثیر میگذارند. اگر یک دستگاه شخص ثالث ذخیره سازی را انجام دهد یا درایوها را به عنوان یک سیستم واحد به ZFS ارائه کند، بدون اینکه ZFS به نمای سطح پایینی متکی باشد، احتمال بسیار بیشتری وجود دارد که سیستم عملکرد بهینه کمتری داشته باشد و احتمال اینکه ZFS کمتر از خرابی جلوگیری کند، وجود دارد. بازیابی از خرابی ها با کندی بیشتر، یا از دست دادن داده ها به دلیل شکست نوشتن. به عنوان مثال، اگر از کارت RAID سخت افزاری استفاده شود، ZFS ممکن است نتواند وضعیت دیسک ها را تعیین کند، تعیین کند که آیا آرایه RAID تخریب شده یا در حال بازسازی است، تمام خرابی داده ها را شناسایی کند، داده ها را به طور بهینه در بین دیسک ها قرار دهد، تعمیرات انتخابی انجام دهد، کنترل کند. چگونه تعمیرات با استفاده مداوم متعادل می شوند یا تعمیراتی را انجام می دهند که ZFS معمولاً می تواند انجام دهد. کارت RAID سخت افزاری با الگوریتم های ZFS تداخل خواهد داشت. کنترلکنندههای RAID معمولاً دادههای وابسته به کنترلر را به درایوها اضافه میکنند که مانع از دسترسی نرمافزار RAID به دادههای کاربر میشود. در صورت خرابی کنترلر RAID سخت افزاری، ممکن است بتوان داده ها را با کنترلر سازگار دیگری خواند، اما همیشه این امکان وجود ندارد و ممکن است جایگزینی در دسترس نباشد. کنترلکنندههای RAID سختافزاری جایگزین ممکن است دادههای سفارشی سازنده اصلی مورد نیاز برای مدیریت و بازیابی یک آرایه را درک نکنند.
برخلاف اکثر سیستمهای دیگر که کارتهای RAID یا سختافزارهای مشابه میتوانند منابع و پردازشها را برای افزایش عملکرد و قابلیت اطمینان بارگیری کنند، با ZFS اکیداً توصیه میشود که از این روشها استفاده نشوند زیرا معمولاً عملکرد و قابلیت اطمینان سیستم را کاهش میدهند .
اگر دیسکها باید از طریق یک RAID یا کنترلکننده دیگر متصل شوند، توصیه میشود با استفاده از یک HBA ساده (آداپتور میزبان) ، یک کارت ساده فنآوت ، یا پیکربندی کارت در حالت JBOD (یعنی چرخش) میزان پردازش انجام شده در کنترلکننده را به حداقل برسانید. غیرفعال کردن RAID و توابع حافظه پنهان)، اجازه می دهد دستگاه ها با حداقل تغییرات در مسیر ورودی/خروجی ZFS به دیسک متصل شوند. یک کارت RAID در حالت JBOD در صورتی که حافظه پنهان داشته باشد همچنان ممکن است تداخل داشته باشد یا بسته به طراحی آن، ممکن است درایوهایی را که به موقع پاسخ نمیدهند جدا کند (همانطور که در بسیاری از هارد دیسکهای مصرفکننده کارآمد دیده شده است) و به همین ترتیب. ، ممکن است برای جلوگیری از افت درایو به درایوهای دارای بازیابی خطای محدود (TLER)/CCTL/ERC نیاز داشته باشد، بنابراین همه کارتها حتی با غیرفعال شدن عملکردهای RAID مناسب نیستند. [36]
به جای RAID سخت افزاری، ZFS از RAID "نرم" استفاده می کند و RAID-Z ( بر اساس برابری مانند RAID 5 و موارد مشابه) و انعکاس دیسک (مشابه RAID 1 ) را ارائه می دهد. طرح ها بسیار انعطاف پذیر هستند.
RAID-Z یک طرح توزیع داده/تعادل مانند RAID-5 است ، اما از عرض نوار پویا استفاده میکند: هر بلوک بدون در نظر گرفتن اندازه بلوک، نوار RAID خودش است، که در نتیجه هر نوشتن RAID-Z یک نوشتن نوار کامل است. این، هنگامی که با معنای تراکنشی کپی روی نوشتار ZFS ترکیب میشود، خطای سوراخ نوشتن را حذف میکند . RAID-Z همچنین سریعتر از RAID 5 سنتی است، زیرا نیازی به انجام دنباله معمول خواندن، اصلاح و نوشتن ندارد . [37]
از آنجایی که همه نوارها اندازههای متفاوتی دارند، بازسازی RAID-Z باید فرادادههای سیستم فایل را برای تعیین هندسه واقعی RAID-Z طی کند. اگر سیستم فایل و آرایه RAID محصولات جداگانه باشند، این امر غیرممکن خواهد بود، در حالی که زمانی که یک نمای یکپارچه از ساختار منطقی و فیزیکی داده ها وجود داشته باشد، امکان پذیر می شود. مرور ابرداده به این معنی است که ZFS میتواند هر بلوک را با جمعبندی 256 بیتی خود اعتبارسنجی کند، در حالی که محصولات RAID سنتی معمولاً نمیتوانند این کار را انجام دهند. [37]
علاوه بر مدیریت خرابیهای کل دیسک، RAID-Z همچنین میتواند خرابی دادههای بیصدا را شناسایی و تصحیح کند ، و «دادههای خود درمانی» را ارائه میدهد: هنگام خواندن یک بلوک RAID-Z، ZFS آن را با جمع کنترلی خود مقایسه میکند، و اگر دیسکهای داده این کار را انجام دادند. پاسخ صحیح را بر نمی گرداند، ZFS برابری را می خواند و سپس متوجه می شود که کدام دیسک داده های بد را برگردانده است. سپس داده های آسیب دیده را تعمیر می کند و داده های خوبی را به درخواست کننده برمی گرداند. [37]
RAID-Z و mirroring به سخت افزار خاصی نیاز ندارند: برای قابلیت اطمینان به NVRAM نیاز ندارند و برای عملکرد خوب یا محافظت از داده ها به بافر نوشتن نیاز ندارند. با RAID-Z، ZFS با استفاده از دیسک های ارزان قیمت، ذخیره سازی سریع و قابل اعتمادی را فراهم می کند. [ ارتقاء؟ ] [37]
پنج حالت مختلف RAID-Z وجود دارد: striping (مشابه RAID 0، بدون افزونگی)، RAID-Z1 (مشابه RAID 5، اجازه می دهد تا یک دیسک خراب شود)، RAID-Z2 (شبیه به RAID 6، به دو دیسک اجازه می دهد تا Fail)، RAID-Z3 (پیکربندی RAID 7 [a] ، اجازه میدهد سه دیسک از کار بیفتد)، و mirroring (مشابه RAID 1، به همه دیسکها به جز یک امکان خرابی میدهد). [39]
نیاز به RAID-Z3 در اوایل دهه 2000 به وجود آمد زیرا درایوهای با ظرفیت چند ترابایتی رایج تر شدند. این افزایش ظرفیت - بدون افزایش سرعت خروجی متناظر - به این معنی بود که بازسازی یک آرایه به دلیل یک درایو ناموفق میتواند «به راحتی هفتهها یا ماهها» تکمیل شود. [38] در طول این مدت، دیسکهای قدیمیتر در آرایه تحت فشار بار کاری اضافی قرار میگیرند که میتواند منجر به خراب شدن دادهها یا خرابی درایو شود. با افزایش برابری، RAID-Z3 شانس از دست دادن داده ها را با افزایش سادگی کاهش می دهد. [40]
ZFS هیچ ابزاری معادل fsck (ابزار استاندارد چک کردن و تعمیر داده های یونیکس و لینوکس برای سیستم های فایل) ندارد. [41] در عوض، ZFS دارای یک عملکرد اسکراب داخلی است که به طور منظم تمام داده ها را بررسی می کند و فساد خاموش و سایر مشکلات را تعمیر می کند. برخی از تفاوت ها عبارتند از:
توصیه رسمی Sun/Oracle این است که دیسکهای سطح سازمانی را یکبار در ماه تمیز کنید و دیسکهای کالای ارزانتر را هفتهای یکبار تمیز کنید. [42] [43]
ZFS یک سیستم فایل 128 بیتی است، [44] [16] بنابراین می تواند داده های 1.84 × 10 19 برابر بیشتر از سیستم های 64 بیتی مانند Btrfs را آدرس دهی کند . حداکثر محدودیت های ZFS به گونه ای طراحی شده اند که هرگز در عمل با آنها مواجه نشوید. به عنوان مثال، پر کردن کامل یک zpool منفرد با 2 128 بیت داده، به درایو دیسک سخت 3×10 24 ترابایتی نیاز دارد. [45]
برخی از محدودیت های نظری در ZFS عبارتند از:
با Oracle Solaris، قابلیت رمزگذاری در ZFS [47] در خط لوله I/O تعبیه شده است. در طول نوشتن، یک بلوک ممکن است فشرده، رمزگذاری شود، جمع بندی شود و سپس کپی شود. خطمشی برای رمزگذاری در سطح مجموعه دادهها تنظیم میشود که مجموعههای داده (سیستمهای فایل یا ZVOL) ایجاد میشوند. کلیدهای بسته بندی ارائه شده توسط کاربر/مدیر را می توان در هر زمان بدون آفلاین کردن سیستم فایل تغییر داد. رفتار پیشفرض این است که کلید بستهبندی توسط هر مجموعه داده فرزند به ارث میرسد. کلیدهای رمزگذاری داده ها به طور تصادفی در زمان ایجاد مجموعه داده تولید می شوند. فقط مجموعه داده های نسل (عکس های فوری و کلون ها) کلیدهای رمزگذاری داده ها را به اشتراک می گذارند. [48] فرمانی برای تغییر به یک کلید رمزگذاری داده جدید برای کلون یا در هر زمان ارائه میشود - این دادههای موجود را دوباره رمزگذاری نمیکند، در عوض از مکانیزم کلید اصلی رمزگذاری شده استفاده میکند.
از سال 2019، [به روز رسانی]ویژگی رمزگذاری نیز به طور کامل در OpenZFS 0.8.0 موجود برای توزیعهای لینوکس دبیان و اوبونتو ادغام شده است. [49]
گزارشهای حکایتی کاربر نهایی از خرابی هنگام استفاده از رمزگذاری بومی ZFS وجود دارد. علت دقیقی مشخص نشده است. [50] [51]
ZFS بهطور خودکار ذخیرهسازی دادهها را در تمام vdevهای یک Pool (و همه دستگاههای هر vdev) بهگونهای اختصاص میدهد که به طور کلی عملکرد استخر را به حداکثر میرساند. ZFS همچنین استراتژی نوشتن خود را برای در نظر گرفتن دیسک های جدید اضافه شده به یک استخر، زمانی که آنها اضافه می شوند، به روز می کند.
به عنوان یک قاعده کلی، ZFS بر اساس فضای خالی هر vdev، نوشته ها را در بین vdev ها اختصاص می دهد. این تضمین میکند که vdevهایی که قبلاً دادههای کمتری دارند، هنگام ذخیره دادههای جدید، نوشتههای بیشتری داده میشود. این کمک می کند تا اطمینان حاصل شود که با استفاده بیشتر از استخر، وضعیت پر شدن برخی از vdev ها ایجاد نمی شود و باعث می شود نوشتن در تعداد محدودی از دستگاه ها انجام شود. همچنین به این معنی است که وقتی داده ها خوانده می شوند (و خواندن در اکثر موارد بسیار بیشتر از نوشتن است)، بخش های مختلف داده را می توان از هر چه بیشتر دیسک به طور همزمان خواند و عملکرد خواندن بسیار بالاتری را ارائه می دهد. بنابراین، به عنوان یک قاعده کلی، استخرها و vdev ها باید مدیریت شوند و فضای ذخیره سازی جدید اضافه شود، تا این وضعیت پیش نیاید که برخی از vdev ها در یک استخر تقریبا پر و برخی دیگر تقریبا خالی هستند، زیرا این کار باعث می شود استخر کارایی کمتری داشته باشد.
فضای آزاد در ZFS با استفاده از هم پراکنده می شود. ZFS مکانیزمی برای یکپارچه سازی فضای آزاد ندارد. زمانی که تکه تکه شدن فضای آزاد زیاد با استفاده بیش از حد از فضای دیسک همراه باشد، گزارشهای کاربر نهایی حکایتی از کاهش عملکرد وجود دارد. [52] [53]
استخرها می توانند لوازم یدکی داغ برای جبران دیسک های خراب داشته باشند. هنگام آینهسازی، دستگاههای بلوک را میتوان بر اساس شاسی فیزیکی گروهبندی کرد تا در صورت خرابی کل شاسی، سیستم فایل بتواند ادامه دهد.
ترکیب استخر ذخیرهسازی به دستگاههای مشابه محدود نمیشود، بلکه میتواند شامل مجموعههای موقت و ناهمگن از دستگاهها باشد، که ZFS بهطور یکپارچه با هم ترکیب میکند و متعاقباً در صورت نیاز فضا را به مجموعه دادهها (نمونههای سیستم فایل یا ZVOL) اختصاص میدهد. انواع دستگاه های ذخیره سازی خودسرانه را می توان به استخرهای موجود اضافه کرد تا اندازه آنها افزایش یابد. [54]
ظرفیت ذخیره سازی همه vdev ها برای همه نمونه های سیستم فایل در zpool در دسترس است. یک سهمیه را می توان برای محدود کردن فضایی که یک نمونه سیستم فایل می تواند اشغال کند تنظیم کرد، و می توان یک رزرو تنظیم کرد تا تضمین کند که فضا برای یک نمونه سیستم فایل در دسترس خواهد بود.
ZFS از لایه های مختلف کش دیسک برای سرعت بخشیدن به عملیات خواندن و نوشتن استفاده می کند. در حالت ایده آل، تمام داده ها باید در RAM ذخیره شوند، اما معمولاً بسیار گران است. بنابراین، داده ها به طور خودکار در یک سلسله مراتب برای بهینه سازی عملکرد در مقابل هزینه ذخیره می شوند. [55] اینها اغلب "استخرهای ذخیره سازی ترکیبی" نامیده می شوند. [56] دادههایی که اغلب در دسترس هستند در RAM ذخیره میشوند، و دادههایی که کمتر به آنها دسترسی پیدا میکند را میتوان در رسانههای کندتر، مانند درایوهای حالت جامد (SSD) ذخیره کرد. دادههایی که اغلب به آنها دسترسی نمییابد، کش نمیشوند و روی هارد دیسکهای کند باقی میمانند. اگر داده های قدیمی به طور ناگهانی زیاد خوانده شوند، ZFS به طور خودکار آنها را به SSD یا RAM منتقل می کند.
مکانیزمهای ذخیرهسازی ZFS شامل یکی برای خواندن و نوشتن است، و در هر مورد، دو سطح کش میتواند وجود داشته باشد، یکی در حافظه رایانه (RAM) و دیگری در ذخیرهسازی سریع (معمولاً درایوهای حالت جامد (SSD)). چهار کش
تعدادی کش دیگر، تقسیم کش و صف نیز در ZFS وجود دارد. به عنوان مثال، هر VDEV کش داده های خود را دارد و حافظه پنهان ARC بین داده های ذخیره شده توسط کاربر و ابرداده های مورد استفاده توسط ZFS با کنترل بر تعادل بین آنها تقسیم می شود.
در OpenZFS 0.8 و نسخههای جدیدتر، میتوان یک کلاس VDEV ویژه را پیکربندی کرد تا ترجیحاً ابردادههای سیستم فایل و بهطور اختیاری جدول Deduplication دادهها (DDT) و بلوکهای سیستم فایل کوچک ذخیره شود. [58] این اجازه می دهد، برای مثال، برای ایجاد یک VDEV ویژه در ذخیره سازی حالت جامد سریع برای ذخیره ابرداده، در حالی که داده های فایل معمولی در دیسک های در حال چرخش ذخیره می شود. این کار عملیات فشرده ابرداده مانند پیمایش سیستم فایل، اسکراب، و سیلور را بدون هزینه ذخیره کل فایل سیستم در ذخیره سازی حالت جامد، سرعت می بخشد.
ZFS از یک مدل شی تراکنشی کپی روی نوشتن استفاده می کند . همه نشانگرهای بلوک در سیستم فایل حاوی یک جمع کنترلی 256 بیتی یا هش 256 بیتی (در حال حاضر یک انتخاب بین Fletcher-2 ، Fletcher-4 ، یا SHA-256 ) [59] از بلوک هدف هستند، که زمانی که بلوک تأیید می شود، تأیید می شود. خواندن بلوک های حاوی داده های فعال هرگز در جای خود بازنویسی نمی شوند. در عوض، یک بلوک جدید تخصیص داده میشود، دادههای اصلاحشده روی آن نوشته میشود، سپس هر بلوک ابردادهای که به آن ارجاع میدهد به طور مشابه خوانده، تخصیص مجدد و نوشته میشود. برای کاهش هزینههای سربار این فرآیند، بهروزرسانیهای متعدد در گروههای تراکنش گروهبندی میشوند و حافظه پنهان نوشتن ZIL ( log intent ) زمانی استفاده میشود که معنای نوشتن همزمان مورد نیاز باشد. بلوکها بهصورت درختی چیده شدهاند، و همچنین جمعهای کنترلی آنها (به طرح امضای مرکل مراجعه کنید ).
مزیت کپی در نوشتن این است که، زمانی که ZFS دادههای جدید را مینویسد، بلوکهای حاوی دادههای قدیمی را میتوان حفظ کرد و امکان نگهداری یک نسخه فوری از سیستم فایل را فراهم میکند. عکسهای فوری ZFS سازگار هستند (کل دادهها را در یک نقطه زمانی منعکس میکنند)، و میتوانند بسیار سریع ایجاد شوند، زیرا تمام دادههای تشکیلدهنده عکس فوری از قبل ذخیره شدهاند، و از کل مخزن ذخیرهسازی اغلب چندین بار در ساعت عکسبرداری میشود. . آنها همچنین در فضا کارآمد هستند، زیرا هر گونه داده بدون تغییر بین سیستم فایل و عکس های فوری آن به اشتراک گذاشته می شود. عکسهای فوری ذاتاً فقط خواندنی هستند و این اطمینان را میدهند که پس از ایجاد تغییر نخواهند کرد، اگرچه نباید به عنوان تنها ابزار پشتیبانگیری به آنها اعتماد کرد. کل عکس های فوری و همچنین فایل ها و دایرکتوری ها در عکس های فوری قابل بازیابی هستند.
همچنین میتوان عکسهای فوری قابل نوشتن ("کلون") ایجاد کرد که منجر به دو سیستم فایل مستقل میشود که مجموعهای از بلوکها را به اشتراک میگذارند. همانطور که تغییرات در هر یک از سیستم های فایل شبیه سازی ایجاد می شود، بلوک های داده جدیدی ایجاد می شوند تا آن تغییرات را منعکس کنند، اما هر بلوک بدون تغییر، صرف نظر از تعداد کلون ها، همچنان به اشتراک گذاشته می شود. این یک اجرای اصل کپی روی نوشتن است .
سیستم های فایل ZFS را می توان به استخرهای دیگر منتقل کرد، همچنین در هاست های راه دور از طریق شبکه، زیرا دستور send نمایش جریانی از وضعیت سیستم فایل ایجاد می کند. این جریان می تواند محتویات کامل سیستم فایل را در یک عکس فوری مشخص توصیف کند یا می تواند یک دلتا بین عکس های فوری باشد. محاسبه جریان دلتا بسیار کارآمد است و اندازه آن به تعداد بلوک های تغییر یافته بین عکس های فوری بستگی دارد. این یک استراتژی کارآمد را فراهم می کند، به عنوان مثال، برای همگام سازی نسخه های پشتیبان خارج از سایت یا آینه های در دسترس بودن بالا از یک استخر.
خطبندی پویا در همه دستگاهها برای به حداکثر رساندن توان به این معنی است که با اضافه شدن دستگاههای اضافی به zpool، عرض نوار به طور خودکار گسترش مییابد تا آنها را در بر بگیرد. بنابراین، همه دیسکهای موجود در یک Pool استفاده میشوند که بار نوشتن را در آنها متعادل میکند. [60]
ZFS از بلوکهایی با اندازه متغیر استفاده میکند که اندازه پیشفرض آن ۱۲۸ کیلوبایت است. ویژگیهای موجود به سرپرست اجازه میدهد حداکثر اندازه بلوک مورد استفاده را تنظیم کند، زیرا بارهای کاری خاص با بلوکهای بزرگ به خوبی کار نمیکنند. اگر فشرده سازی داده ها فعال باشد، از اندازه بلوک های متغیر استفاده می شود. اگر بتوان یک بلوک را فشرده کرد تا در اندازه بلوک کوچکتر قرار بگیرد، اندازه کوچکتر روی دیسک استفاده میشود تا از فضای ذخیرهسازی کمتر و بهبود توان IO استفاده شود (البته به قیمت افزایش استفاده از CPU برای عملیات فشردهسازی و رفع فشردهسازی). [61]
در ZFS، دستکاری سیستم فایل در یک مخزن ذخیره سازی آسان تر از دستکاری حجم در یک فایل سیستم سنتی است. زمان و تلاش مورد نیاز برای ایجاد یا گسترش یک فایل سیستم ZFS به زمان ساخت یک فهرست جدید نزدیک تر از دستکاری حجم در برخی سیستم های دیگر است. [ نیازمند منبع ]
استخرها و سیستمهای فایل ZFS مرتبط با آنها را میتوان بین معماریهای پلتفرم مختلف، از جمله سیستمهایی که ترتیب بایتهای مختلف را پیادهسازی میکنند، جابهجا کرد. فرمت نشانگر بلوک ZFS ابرداده های سیستم فایل را به روش endian -adaptive ذخیره می کند. بلوکهای فراداده فردی با ترتیب بایت بومی سیستم که بلوک را مینویسد، نوشته میشود. هنگام خواندن، اگر endianness ذخیره شده با endianness سیستم مطابقت نداشته باشد، ابرداده در حافظه بایت مبادله می شود.
این بر داده های ذخیره شده تأثیر نمی گذارد. همانطور که در سیستمهای POSIX معمول است ، فایلها به عنوان آرایههای ساده از بایتها در برنامهها به نظر میرسند، بنابراین برنامههایی که دادهها را ایجاد میکنند و میخوانند، مسئول انجام این کار به روشی مستقل از endianness سیستم اصلی هستند.
قابلیتهای حذف مجدد دادهها در پایان اکتبر 2009 به مخزن منبع ZFS اضافه شد، [62] و بستههای توسعه OpenSolaris ZFS مربوطه از 3 دسامبر 2009 (بیلد 128) در دسترس هستند.
استفاده موثر از deduplication ممکن است به ظرفیت RAM بزرگ نیاز داشته باشد. توصیه ها بین 1 تا 5 گیگابایت رم برای هر ترابایت فضای ذخیره سازی است. [63] [64] [65] ارزیابی دقیق حافظه مورد نیاز برای حذف مجدد با مراجعه به تعداد بلوکهای منحصر به فرد در استخر، و تعداد بایتهای روی دیسک و RAM ("هسته") مورد نیاز برای ذخیره سازی انجام میشود. هر رکورد - این ارقام با دستورات داخلی مانند zpool
و گزارش می شوند zdb
. حافظه فیزیکی ناکافی یا فقدان حافظه نهان ZFS میتواند منجر به از بین رفتن حافظه مجازی در هنگام استفاده از دوبله شود، که میتواند باعث کاهش شدید عملکرد یا کاهش کامل حافظه شود. [ نیاز به ذکر منبع ] از آنجایی که کپیبرداری در زمان نوشتن اتفاق میافتد، همچنین بسیار به CPU فشرده است و همچنین میتواند به طور قابل توجهی سرعت سیستم را کاهش دهد.
سایر فروشندگان ذخیره سازی از نسخه های اصلاح شده ZFS برای دستیابی به نسبت فشرده سازی داده بسیار بالا استفاده می کنند . دو نمونه در سال 2012 GreenBytes [66] و Tegile بودند . [67] در ماه مه 2014، اوراکل GreenBytes را برای فناوری حذف و تکرار ZFS خریداری کرد. [68]
همانطور که در بالا توضیح داده شد، به دلیل نیاز به منابع سنگین (به ویژه RAM) و تأثیر بر عملکرد (مخصوصاً هنگام نوشتن)، معمولاً حذف مجدد توصیه نمی شود، به جز در شرایط خاصی که سیستم و داده ها به خوبی برای این تکنیک صرفه جویی در فضا مناسب هستند.
ZFS با ابزارهایی مانند fsck عرضه نمی شود ، زیرا خود سیستم فایل برای تعمیر خود طراحی شده است. تا زمانی که یک استخر ذخیره سازی با توجه کافی به طراحی ذخیره سازی و افزونگی داده ها ساخته شده بود، ابزارهای اساسی مانند fsck هرگز مورد نیاز نبودند. با این حال، اگر استخر به دلیل سختافزار ضعیف، طراحی ناکافی یا افزونگی، یا اتفاق ناگوار، تا حدی که ZFS قادر به نصب استخر نبود، بهطور سنتی، هیچ ابزار پیشرفتهتری دیگری وجود نداشت که به کاربر نهایی اجازه دهد. تلاش برای نجات بخشی از داده های ذخیره شده از یک استخر به شدت خراب.
ZFS مدرن در طول زمان به طور قابل توجهی در این وضعیت بهبود یافته است و به این کار ادامه می دهد:
شرکت اوراکل توسعه عمومی ZFS و OpenSolaris را پس از خرید Sun در سال 2010 متوقف کرد . برخی از توسعه دهندگان آخرین نسخه عمومی OpenSolaris را به عنوان پروژه Illumos منتشر کردند. به دلیل مزایای قابل توجه موجود در ZFS، آن را به چندین پلتفرم مختلف با ویژگی ها و دستورات مختلف منتقل شده است. برای هماهنگی تلاش های توسعه و جلوگیری از تکه تکه شدن، OpenZFS در سال 2013 تاسیس شد.
به گفته مت آرنس، یکی از معماران اصلی ZFS، بیش از 50 درصد از کد OpenSolaris ZFS اصلی از سال 2019 در OpenZFS با مشارکتهای جامعه جایگزین شده است و «Oracle ZFS» و «OpenZFS» را از نظر سیاسی و فناوری ناسازگار میکند. [87]
در ژانویه 2010، شرکت اوراکل Sun Microsystems را خریداری کرد و به سرعت توزیع OpenSolaris و مدل توسعه منبع باز را متوقف کرد. [95] [96] در آگوست 2010، اوراکل ارائه بهروزرسانیهای عمومی برای کد منبع مخزن سیستم عامل/شبکه سولاریس را متوقف کرد و عملاً Solaris 11 را به یک سیستم عامل اختصاصی منبع بسته تبدیل کرد. [97]
در پاسخ به تغییر چشمانداز Solaris و OpenSolaris، پروژه illumos از طریق وبینار [98] در روز پنجشنبه، 3 آگوست 2010، به عنوان تلاش جامعه برخی از مهندسان اصلی Solaris برای ادامه توسعه نسخه منبع باز Solaris راهاندازی شد و تکمیل شد. منبع باز آن بخش هایی که قبلاً توسط Sun منبع باز نیستند. [99] illumos به عنوان یک بنیاد، بنیاد Illumos، در ایالت کالیفرنیا به عنوان یک انجمن تجاری 501(c)6 تاسیس شد. طرح اولیه به صراحت بیان می کرد که illumos توزیع یا فورک نخواهد بود. با این حال، پس از اینکه اوراکل اعلام کرد که OpenSolaris را متوقف میکند، برنامههایی برای فورک نسخه نهایی Solaris ON انجام شد که به illumos اجازه میدهد تا به یک سیستم عامل خاص خود تبدیل شوند. [100] به عنوان بخشی از OpenSolaris، یک نسخه منبع باز از ZFS بنابراین در illumos یکپارچه بود.
ZFS به طور گسترده در پلتفرم های متعدد و همچنین سولاریس مورد استفاده قرار گرفت. بنابراین، در سال 2013، هماهنگی کار توسعه بر روی نسخه منبع باز ZFS به یک پروژه چتر، OpenZFS منتقل شد . چارچوب OpenZFS به هر طرف علاقهمند اجازه میدهد تا به طور مشترک پایگاه کد اصلی ZFS را توسعه دهد، در حالی که به صورت جداگانه هر کد اضافی خاصی را که ZFS برای عملکرد و ادغام در سیستمهای خود به آن نیاز دارد، حفظ کند.
توجه: نسخه سولاریس در حال توسعه توسط Sun از زمان انتشار Solaris 10 در سال 2005 ، با نام رمز «نوادا» بود و از همان پایگاه کد OpenSolaris مشتق شده بود . "Solaris Nevada" نام رمز نسل بعدی سیستم عامل Solaris است که در نهایت جانشین Solaris 10 می شود و این کد جدید به طور متوالی در نسخه های جدید OpenSolaris "Nevada" کشیده شد. [101] OpenSolaris اکنون متوقف شده است و OpenIndiana از آن جدا شده است . [102] [103] ساخت نهایی (b134) OpenSolaris توسط Oracle (2010-نوامبر-12) به عنوان مسیر ارتقاء به Solaris 11 Express منتشر شد .
فهرست سیستمعاملها، توزیعها و افزونههایی که از ZFS پشتیبانی میکنند، نسخه zpool که از آن پشتیبانی میکند و ساخت Solaris که بر اساس آنها ساخته شدهاند (در صورت وجود):
بزرگترین پیشوند SI که ما دوست داشتیم "zetta" بود ("yotta" نامعلوم بود)
بنابراین ما در نهایت تصمیم گرفتیم که نام را به ZFS برگردانیم، که هیچ چیزی را نشان نمی دهد.
دستگاههای مجازی را نمیتوان تودرتو کرد، بنابراین یک دستگاه مجازی mirror یا raidz فقط میتواند حاوی فایلها یا دیسکها باشد. آینه آینه (یا ترکیبات دیگر) مجاز نیست.