دوستان خوبم، سلام.
یه بحثی اینروزا خیلی داغه و اونم Storage هست. طی حدود شش سالی که تجربه دارم خیلی سلوشن برای ذخیرهسازی دیدم. با بیشترشون کار نکردم چون معمولا یه بار کانفیگ میشده و دیپلوی و دیگه لازم نمیشده که باهاشون سرو کله زد. البته در مورد بیشترشون مطالعه کردم برای اینکه از مکانیزم کار کردنشون اطلاع پیدا کنم. اصولا یه مقوله خیلی قدیمی به اسم Raid راه گشای خیلی از مشکلاته و همهچی بر مبنای Riad بوجود اومده. تا اینکه یه گروهی از توسعه دهندگان لینوکس یه پروژهای شروع کردن به اسم LVM که خیلی بهتر و خیلی خلاقانه تر طراحی شده بود یه لایه بالاتر ازدیسک فیزیکی کار میکرد و خیلی خیلی مشخصههای بیشتر. حتما در موردش مطالعه کنید اگه تا امروز نکردید! امروز میخوام یه فایل سیستم که توسط اوراکل طراحی شد و بعدها به صورت لایبرری متنباز بیرون اومد را بهتون معرفی کنم. ZFS خیلی غوله و خیلی هم راه دست.
طبق معمول لازمه که نصبش کنیم. من برای این مقاله یه وایگرانت باکس Oracle Linux نصب کردم(رایگان هست و میتونید حالش رو ببرید) و میخوام روی اون یه سناریو معمولی پیدا کنم. همزمان که مینویسم دارم به این فکر میکنم که چه سناریوهایی میشه پیاده کرد و شاید چند تا مقاله دیگه هم براش بنویسیم ولی الان فقط یه سری دستورات اولیه و یه سناریو ساده رو پوشش میدیم، حتما اگه عمری باقی باشه سناریوهای جالب تری هم ارائه میدیم.
$ vagrant box add --name OracleLinux/73 http://yum.oracle.com/boxes/oraclelinux/ol73/ol73.box
البته شما به هر دلیلی میتونید از هر توزیعه دیگهای که دوست دارید استفاده کنید.
خوب بریم که رفتیم.
$ vagrant init OracleLinux/73 $ vagrant up $ vagrant ssh
$ sudo yum install http://download.zfsonlinux.org/epel/zfs-release.<dist>.noarch.rpm
$ gpg --quiet --with-fingerprint /etc/pki/rpm-gpg/RPM-GPG-KEY-zfsonlinux
pub 2048R/F14AB620 2013-03-21 ZFS on Linux <zfs@zfsonlinux.org>
Key fingerprint = C93A FFFD 9F3F 7B03 C310 CEB6 A9D5 A1C0 F14A B620
sub 2048R/99685629 2013-03-21
ZFS به عنوان یک Kernel Module نصب میشه. من ترجیح میدم یک بار reboot کنم تا اگه ماژول به درستی نصب شده باشه:
$ sudo yum install zfs && sudo systemctl reboot -i
من دوست دارم همیشه بعد از نصب هرچیزی یه بار آزمایش کنم که آیا درست کار میکنه یا نه! پس:
# lsmod |grep zfs
zfs 1195533 0
zcommon 46278 1 zfs
znvpair 80974 2 zfs,zcommon
zavl 6925 1 zfs
zunicode 323159 1 zfs
spl 266655 5 zfs,zcommon,znvpair,zavl,zunicode
بیایید یکم باهاش بازی کنیم. قبلش ولی باید بدونیم که تو دنیای ZFS به کلاسترهایی که درست میکنیم pool گفته میشه.در واقع pool معادلیه برای Volume Group در lvm. من برای این پست ۸ تا vdisk به virtual machine اضافه کردم:
# ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 Aug 23 18:33 /dev/sda
brw-rw---- 1 root disk 8, 1 Aug 23 18:33 /dev/sda1
brw-rw---- 1 root disk 8, 2 Aug 23 18:33 /dev/sda2
brw-rw---- 1 root disk 8, 16 Aug 23 18:33 /dev/sdb
brw-rw---- 1 root disk 8, 32 Aug 23 18:33 /dev/sdc
brw-rw---- 1 root disk 8, 48 Aug 23 18:33 /dev/sdd
brw-rw---- 1 root disk 8, 64 Aug 23 18:33 /dev/sde
brw-rw---- 1 root disk 8, 80 Aug 23 18:33 /dev/sdf
brw-rw---- 1 root disk 8, 96 Aug 23 18:33 /dev/sdg
brw-rw---- 1 root disk 8, 112 Aug 23 18:33 /dev/sdh
brw-rw---- 1 root disk 8, 128 Aug 23 18:33 /dev/sdi
brw-rw---- 1 root disk 8, 144 Aug 23 18:33 /dev/sdj
brw-rw---- 1 root disk 8, 160 Aug 23 18:33 /dev/sdk
همانطور که گفتیم باید یه pool درست کنیم. فکر میکنم کسانی که قبلا با freeNAS کار کردند درک بهتری دارند که داریم چی کار میکنیم، ولی نگران نباشید وقتی باهاش کار میکنیم ملموس و ملموس تر میشه.
برای pool ساختن zfs یک دستور create داره که در واقع sub command هست. فکر کنم همه با این کانسپت در لینوکس آشنا هستیم. همزمان با استفاده از سویچ -f باید یک اسم براش مشخص کنیم. به جز این میتونیم یه پارامتر دیگه هم بدیم که مشابه raidlvl هست. من الان از mirror که معادل raid-10 هست استفاده کردم ولی همه raidlvl ها ممکن هست اینجا موقتا ازش رد میشم( پست بعدی)
# zpool create -f ashkan mirror sdb sdc sdd sde mirror sdf sdg sdh sdi
تقریبا کارمون تمام شده و این یعنی pool ایجاد شده. قبلش اجازه بدید خروجی کار را ببینیم.
# zpool status
pool: ashkan
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
ashkan ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sdf ONLINE 0 0 0
sdg ONLINE 0 0 0
sdh ONLINE 0 0 0
sdi ONLINE 0 0 0
errors: No known data errors
خوب میبنید که همهچیز روبهراه هست و خطایی هم پیدا نکرده. میشه از pool ها لیست هم گرفت:
# zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
ashkan 191M 238K 191M 0% 1.00x ONLINE -
وقتی برای اولین بار حدود بهار ۹۵ با zfs تو شرکت متبوعم؛ که در زمانش آنجا کار میکردم آشنا شدم، خیلی به نظرم جذاب میومد یکی از دلایلش این بود که کار کردن باهاش خیلی راحت بود و فقط کافی بود یه سری مفاهیم بنیادی مثل اینکه raid چیه ، lvm چیه و اصلا چرا هستند و غیره بلد میبودم و براحتی میتونستم باهاش کار میکردم. خیلی وقتها گرهگشا شد و بعدها در خیلی پروژه ها برای اینکه از سردرد و سرو کله زدن با Raid فرار کنم یا بخوام از هر بار برای هر VG از lvm create یا lvm add استفاده کنم خیلی سریع این سلوشن رو پیشنهاد میدادم معمولا با یک دموی کوتاه و مختصر خیلی سریع هم مورد تایید قرار میگرفت. خیلی خوبه و راحت و دمهدسته!
یه display filesystems اجرا کنیم ببینیم چی میشه؟!
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
8.4G 1.2G 6.9G 15% /
tmpfs 230M 0 230M 0% /dev/shm
/dev/sda1 485M 54M 406M 12% /boot
ashkan 191M 128K 191M 1% /ashkan
بهههله. خودش mount کرده به یه زیردایرکتوری از روت به اسم خودش. تصور کنید این چه قدر میتونه کمک کنه زمانی که میخواهید یه اسکریپت بنویسید برای Provisioning و این اینجوری مینونید یه متغیر تعریف کنید و بعدش هر جوری بخواهید میتونید طی اسکریپت ازش استفاده کنید. من که خیلی از کار کردن باهاش لذت میبرم و یکی از دلایلش هم همین فیچر هست. یک لایبرری پایتونی براش پیدا کردم که خیلی کمکم کرده و صلاح میدونم حتما بهش اشاره کنم چون اگه از هر دوی اینها باهم بهره بگیرید خیلی خیلی کارتون راحت تر هم خواهد شد ولی زحمت مطلاعه کتابخونه دیگه با خودتون چون هنوز به این درجه از عرفان نرسیدم که بتونم cookbook بنویسم و از طرفی امکانش هم به خیلی دلایل نیست که اسکریپتهای خودم را پست کنم. اما فعلا یه خورده باهاش کار کنید خودتون خیلی سریع استاد میشید. منم در اسرع وقت یه سری پست دیگه از zfs مینویسم.
راستی اگه از پستم خوشتون اومد و دوست داشتید حتما با دوستان و همکارانتون هم به اشتراک بگذارید و از من با اشتراکش در شبکههای اجتماعیتون حمایت کنید.
بـه آمــوختن چون فــروتن شـــوي سخن هــاي دانندگــان بشنوي
مگوي آن سخن، كاندر آن سود نيست كز آن آتشت بهره جز دود نيستقردوسی بزرگ