بلاگ/راه‌اندازی ZFS روی سرور اختصاصی: ساخت Pool، Snapshot و چرا به LVM و mdadm ترجیح داده می‌شود
به‌روز شده

راه‌اندازی ZFS روی سرور اختصاصی: ساخت Pool، Snapshot و چرا به LVM و mdadm ترجیح داده می‌شود

1405/08/110 بازدید
راه‌اندازی ZFS روی سرور اختصاصی: ساخت Pool، Snapshot و چرا به LVM و mdadm ترجیح داده می‌شود

راه‌اندازی ZFS روی سرور اختصاصی: ساخت Pool، Snapshot و چرا به LVM و mdadm ترجیح داده می‌شود

اگر روی سرور اختصاصی با چند دیسک کار می‌کنید و مدیریت جداگانهٔ RAID با mdadm و volume با LVM برایتان دردسر شده، ZFS همهٔ این کار را در یک فایل‌سیستم انجام می‌دهد. در این مقاله نصب ZFS، ساخت pool با RAID-Z و گرفتن snapshot را قدم‌به‌قدم روی یک سرور اختصاصی لینوکس می‌بینیم و در آخر با جدول مقایسه می‌کنیم که چرا خیلی از ادمین‌ها دیگر سراغ LVM و mdadm نمی‌روند.

نمای کلی ZFS روی سرور اختصاصی

ZFS چیست و چه فرقی با فایل‌سیستم‌های معمولی دارد

ZFS هم فایل‌سیستم است و هم volume manager؛ یعنی کاری که در یک سرور معمولی بین mdadm (ساخت RAID از چند دیسک)، LVM (مدیریت volume) و ext4/XFS (فایل‌سیستم) تقسیم می‌شود، در ZFS یک لایه واحد انجام می‌دهد. این یکپارچگی چند فایده مستقیم دارد:

  • هر بلوک داده با checksum ذخیره می‌شود، پس خرابی خاموش دیسک (bit rot) قبل از این‌که به backup سرایت کند شناسایی می‌شود.
  • Snapshot و clone بر پایهٔ copy-on-write هستند، یعنی گرفتن یک snapshot چند ثانیه طول می‌کشد، نه چند ساعت.
  • فشرده‌سازی (lz4/zstd) و دیدوپ روی خود فایل‌سیستم انجام می‌شود، بدون نیاز به ابزار جدا.

روی لینوکس، ZFS معمولا به شکل ماژول کرنل (OpenZFS) نصب می‌شود و روی توزیع‌هایی مثل Ubuntu Server و Debian پشتیبانی رسمی دارد.

قبل از نصب: چه چیزهایی روی سرور اختصاصی باید چک کنید

پیش از نصب، چند نکته را روی سرور اختصاصی بررسی کنید:

  • کنترلر دیسک: اگر کارت RAID سخت‌افزاری (hardware RAID) روی سرور نصب است، آن را به حالت HBA یا JBOD بگذارید تا دیسک‌های خام مستقیم به ZFS داده شوند. ZFS خودش RAID را مدیریت می‌کند و دوباره‌کاری با RAID سخت‌افزاری باعث مشکلات شناسایی خرابی می‌شود.
  • تعداد دیسک: برای RAID-Z1 حداقل سه دیسک، برای RAID-Z2 حداقل چهار دیسک لازم است (جدول بعدی را ببینید).
  • رم: ZFS برای cache خودش (به‌نام ARC) از رم استفاده می‌کند. برای مصرف سبک چیزی در حد چند گیگابایت کافی است، اما برای load سنگین یا دیدوپ، رم بیشتر نتیجهٔ بهتری می‌دهد.
  • ECC یا non-ECC: ZFS روی رم بدون ECC هم کار می‌کند، فقط در صورت خرابی رم همان مزیت checksum محدود می‌شود. اگر پلن سرور اختصاصی‌تان گزینهٔ ECC دارد، همان را انتخاب کنید.

نصب ZFS روی اوبونتو و دبیان

روی Ubuntu Server (از نسخه 20.04 به بعد ماژول در کرنل آمده):

apt update
apt install zfsutils-linux

روی Debian باید اول repository مربوط به contrib را فعال کنید:

apt install -y dpkg-dev linux-headers-$(uname -r) linux-image-amd64
apt install -y zfs-dkms zfsutils-linux

بعد از نصب، بررسی کنید ماژول لود شده:

zfs version

ساخت Pool با RAID-Z

Pool واحد اصلی ذخیره‌سازی در ZFS است؛ یک یا چند دیسک را به هم گروه می‌کند. فرض کنید چهار دیسک خام /dev/sdb تا /dev/sde روی سرور اختصاصی دارید:

zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde

این دستور یک pool به نام tank با RAID-Z2 می‌سازد. برای مانیتور کردن سلامت pool:

zpool status tank

ساختار Pool در ZFS: چند دیسک خام گروه‌شده در یک vdev با RAID-Z

فرق سطح‌های RAID-Z در همین جا مشخص می‌شود:

سطححداقل دیسکتحمل خرابی هم‌زمانمناسب برای
RAID-Z1۳یک دیسکدیسک‌های کوچک، بودجهٔ محدود
RAID-Z2۴دو دیسکاکثر سرورهای production
RAID-Z3۵سه دیسکآرشیو حساس، دیسک‌های ظرفیت بالا

برای یک دیتاست داخل pool و فعال کردن فشرده‌سازی:

zfs create tank/data
zfs set compression=lz4 tank/data
zfs set atime=off tank/data

خاموش کردن atime یک کار کوچک و واقعی است که روی سرورهای با I/O زیاد سرعت را حس‌کردنی بالا می‌برد، چون هر خوانده‌شدن فایل دیگر باعث نوشتن متادیتا نمی‌شود.

گرفتن و بازگردانی Snapshot

Snapshot در ZFS یک کپی فقط‌خواندنی و لحظه‌ای از دیتاست است، بدون کپی واقعی داده (فقط بلوک‌های تغییریافته بعدا فضا می‌گیرند):

zfs snapshot tank/data@before-upgrade

لیست snapshot‌های یک دیتاست:

zfs list -t snapshot tank/data

اگر بعد از یک آپدیت یا تغییر اشتباه نیاز به برگشت داشتید:

zfs rollback tank/data@before-upgrade

برای انتقال یا بکاپ‌گیری از یک snapshot به سرور دیگر (مثلا یک سرور اختصاصی دوم در لوکیشن دیگر):

zfs send tank/data@before-upgrade | ssh user@backup-server zfs receive backup-pool/data

این دستور فقط تفاوت بلوک‌ها را منتقل می‌کند، پس برای sync تدریجی بین دو سرور خیلی سریع‌تر از rsync روی حجم بالا عمل می‌کند.

چرا ZFS به LVM و mdadm ترجیح داده می‌شود

LVM و mdadm سال‌ها استاندارد مدیریت storage روی لینوکس بودند و هنوز هم جایی که فقط یک volume ساده لازم دارید کار می‌کنند. اما وقتی checksum، snapshot سریع یا resilver (بازسازی بعد از تعویض دیسک) مهم است، تفاوت‌ها خودشان را نشان می‌دهند:

ویژگیZFSLVM + mdadm
Checksum روی دادهدارد، هر بلوکندارد (فقط metadata در برخی حالت‌ها)
Snapshotcopy-on-write، چند ثانیهمعمولا کند، فضای جداگانه لازم دارد
فشرده‌سازی داخلیدارد (lz4/zstd)ندارد، باید جدا انجام شود
بازسازی بعد تعویض دیسکفقط بلوک‌های استفاده‌شدهکل دیسک، حتی فضای خالی
اضافه کردن دیسک به RAIDمحدودتر (باید vdev جدید اضافه کرد)ساده‌تر با mdadm --grow
پیچیدگی مدیریت روزمرهیک ابزار (zfs/zpool)دو ابزار جدا با تنظیمات مستقل

نکتهٔ مهم همین ردیف آخر جدول است: resilver در mdadm کل دیسک را از اول تا آخر می‌خواند، حتی اگر فضای خالی باشد. ZFS فقط بلوک‌هایی که داده دارند را بازسازی می‌کند، پس روی دیسک‌های بزرگ با فضای خالی زیاد، زمان بازسازی به‌طور محسوس کوتاه‌تر است.

در عوض، گسترش یک RAID-Z با اضافه‌کردن یک دیسک تکی به همان راحتی mdadm نیست؛ معمولا باید یک vdev جدید به pool اضافه کنید. اگر برنامه‌تان این است که هر چند ماه یک دیسک تکی به سرور اضافه کنید، این محدودیت را از قبل در نظر بگیرید.

نگهداری: مصرف رم و scrub دوره‌ای

ARC (کش ZFS) به‌طور پیش‌فرض می‌تواند تا نیمی از رم سرور را بگیرد. برای محدود کردنش:

echo "options zfs zfs_arc_max=4294967296" >> /etc/modprobe.d/zfs.conf

عدد بالا معادل ۴ گیگابایت است؛ بسته به رم سرور اختصاصی‌تان تنظیم کنید و بعد از ری‌بوت اعمال می‌شود.

برای چک‌کردن سلامت داده‌ها به‌صورت دوره‌ای:

zpool scrub tank
zpool status tank

یک scrub ماهانه (با cron) معمولا کافی است تا خرابی خاموش دیسک قبل از این‌که مشکل واقعی بشود کشف شود.

انتخاب سرور اختصاصی مناسب برای ZFS

ZFS خودش به سخت‌افزار خاصی وابسته نیست؛ چیزی که بیشتر اهمیت دارد تعداد و نوع دیسک‌هاست. اگر دنبال سرور اختصاصی ارزان با یک یا دو دیسک هستید، RAID-Z1 یا حتی یک pool تک‌دیسکی (بدون redundancy، فقط برای checksum و snapshot) هم جایز است. برای کارهای production با نیاز به resilver سریع‌تر، RAID-Z2 روی سرور اختصاصی آلمان یا ایران گزینهٔ معقول‌تری است. سرور اختصاصی ترکیه و سرور اختصاصی اروپا هم برای کاربرانی که لتنسی نزدیک به اروپای شرقی یا خاورمیانه می‌خواهند مطرح می‌شوند؛ مشخصات و قیمت دقیق هر پلن را از صفحهٔ سرور اختصاصی آریانت ببینید چون بسته به لوکیشن فرق دارد.

اگر هنوز بین VPS و سرور اختصاصی مانده‌اید، این راهنما تفاوت‌ها را برای تصمیم‌گیری بهتر توضیح می‌دهد — نکتهٔ کوتاه همین‌جا: ZFS روی VPS هم قابل نصب است، اما چون معمولا به دیسک‌های مجازی اشتراکی دسترسی دارید نه دیسک خام، بخشی از مزیت resilver سریع و تشخیص خرابی فیزیکی را از دست می‌دهید.

نتیجه‌گیری

ZFS برای کسی که چند دیسک روی سرور اختصاصی دارد و checksum، snapshot سریع و فشرده‌سازی داخلی می‌خواهد، گزینهٔ راحت‌تری نسبت به ترکیب LVM و mdadm است؛ قیمتش کمی سخت‌تر بودن گسترش pool با یک دیسک تکی است. اگر سرور اختصاصی مناسب برای این سناریو لازم دارید، پلن‌های سرور اختصاصی آریانت در چند لوکیشن قابل بررسی است.

سؤالات متداول

آیا ZFS روی سرور با یک دیسک هم کار می‌کند؟ بله، pool را بدون RAID-Z می‌سازید. redundancy در سطح دیسک نخواهید داشت، اما checksum و snapshot همچنان فعال است.

گرفتن snapshot چقدر فضا اشغال می‌کند؟ در لحظهٔ گرفتن تقریبا هیچ فضایی اشغال نمی‌شود؛ فضا فقط برای بلوک‌هایی که بعدا در دیتاست اصلی تغییر می‌کنند مصرف می‌شود، چون snapshot نسخهٔ قدیمی آن بلوک را نگه می‌دارد.

آیا می‌شود از LVM روی ZFS هم استفاده کرد؟ معمولا لازم نیست؛ خود ZFS با دیتاست‌ها همان کار volume manager را انجام می‌دهد. مخلوط‌کردن دو لایه باعث پیچیده‌تر شدن troubleshooting می‌شود.

ARC چقدر رم مصرف می‌کند؟ به‌طور پیش‌فرض تا نیمی از رم سرور، اما با zfs_arc_max در /etc/modprobe.d/zfs.conf قابل محدود کردن است.