LVM ابزارهای بی نظیری همانند Snapshot و Thin Provisioning را داراست. در پست قبل در مورد snapshot توضیح دادیم در این مقاله قصد داریم نحوه ایجاد volume های thin provisioning در lvm را توضیح دهیم.
thin provisioning چیست ؟
thin provisioning در lvm برای ایجاد virtual disk ها درون یک thin pool مورد استفاده قرار میگیرد. فرض کنید که من یک ظرفیت storage 15 GB در سرور خود دارم همچنین 2 کلاینت که هر کدام 5 گیگابایت storage دارند نیز موجود هستند. شما کلاینت سوم هستید و درخواست 5 گیگابایت storage دارید در نتیجه ما باید برای شما 5 گیگابایت کامل (Thick Volume) فراهم کنیم. اما شما ممکن است از این 5 GB تنها 2 GB را مصرف کنید و 3 GB آن خالی خواهد ماند که بعدا میتوانید آن را پر کنید.
اما آنچه که ما در thin provisioning انجام میدهیم این است که یک thin pool درون یک volume group بزرگ تعریف میکنیم و یک thin volume درون آن thing pool نیز تعریف خواهیم کرد. به طوری که هر فایلی که شما write میکنید ذخیره خواهد شد و storage شما 5 GB نمایش داده خواهد شد. اما 5 GB کامل برای کل دیسک اختصاص داده نخواهد شد. پروسه یکسانی برای کلاینت های دیگر نیز انجام خواهد شد همانطور که گفتم 2 کلاینت دیگر دارم و شما سومین کلاینت من هستید.
خب حالا کل GB که من برای کلاینت ها اختصاص دادم 15 GB بود و اگر کس دیگری پیش من بیاید و از من درخواست 5 GB داشته باشد میتوانم به او هم فضا اختصاص دهم؟ بله میتوانم. در thin provisioning میتوانم 5 GB برای هر 4 کلاینت اختصاص بدهم در حالیکه تنها 15 GB دارم.
هشدار : اگر از 15 GB بیشتر provisioning داشته باشیم در حقیقت over provisioning نامیده میشود.
نحوه کار آن چگونه است؟ و چگونه برای کلاینت های جدید storage فراهم میکند؟
من برای شما 5 GB فراهم کردم اما شما ممکن است تنها 2 GB استفاده کنید و 3 GB آزاد خواهد ماند. در thick provisioning نمی توانیم این کار را انجام دهیم زیرا در ابتدا تمامی فضا را به خودش اختصاص میدهد.
اما در thin provisioning من برای شما 5 GB تعریف میکنم که کل فضا را اختصاص نمیدهد. در حالی که یک volume تعریف میشود و تنها تا مرز 5 GB با توجه به حجم اطلاعات شما پیشرفت میکند. امیدوارم منظورم رو متوجه شده باشید. همانند شما دیگر کلاینت ها نیز تمامی حجم خود را استفاده نخواهند کرد در نتیجه شانس برای اضافه کردن 5 GB به یک کلاینت جدید وجود خواهد داشت که به آن over provisioning میگویند.
اما اجباریست که هر گونه افزایش volume مانیتور شود و اگر این کار صورت نگیرد احتمال دارد که فاجعه ای رخ دهد. در صورتی over provisioning رخ میدهد که هر 4 کلاینت اطلاعات خود را به صورت کامل در فضای خود پر کنند و از حد 15 GB فراتر روند و این باعث بروز مشکل در volume خواهد شد.
تجهیزات و تنظیمات سرور :
سیستم عامل : CentOS 6.5 با LVM
Server IP : 192.168.0.200
مرحله اول :
ایجاد thin pool و volume ها :
در ابتدا سایز زیادی از volume group نیاز داریم در اینجا من volume group با فضای 15 GB ایجاد کردم و با استفاده از دستور زیر volume group را لیست خواهم کرد :
سپس سایز logical volume در دسترس را قبل از ایجاد thin pool و volume ها بررسی میکنیم :
همانطور که میبینید تنها logical volume های پیش فرض برای سیستم عامل و swap در خروجی کامند lvs موجود هستند.
ایجاد یک thin pool :
برای ایجاد یک thin pool به ازای 15 GB در volume group با نام vg_thin دستور زیر را اجرا میکنیم :
آپشن L- : سایز volume group
آپشن thinpool- : برای ایجاد یک thinpool
tp_tecmint_pool : نام انتخابی برای thin pool
vb_thin : نام volume grop که برای ایجاد pool نیاز داریم.
برای دریافت اطلاعات بیشتر دستور lvdisplay را اجرا میکنیم :
اینجا ما virtual thin volume ها را در این thin pool ایجاد نکرده ایم همانطور که در تصویر میبینیم allocated pool data مقدار 0.00٪ را نمایش میدهد.
ایجاد thin volume :
اکنون میتوانیم thin volume ها را درون thin pool با کمک دستور lvcreate به همراه آپشن v- (یعنی virtual) تعریف کنیم :
من یک thin virtual volume با نام thin_vol_client1 درون tp_tecmint_pool در vg_thin volume group خودم ایجاد کردم اکنون با استفاده از دستور زیر لیست logical volume ها را میبینیم :
اکنون thin volume بالا ایجاد شد میخواهم 2 عدد thin volume برای 2 کلاینت دیگر ایجاد کنم. در اینجا شما میبینید که 3 عدد thin volume تحت pool (با نام tp_tecmint_pool) ایجاد شده است. در نتیجه از این نکته میفهمیم که من تمام 15 گیگابایت pool را استفاده کردم :
ایجاد فایل سیستم :
اکنون mount point ها را ایجاد میکنیم و این 3 عدد thin volume را به آنها mount کرده و یکسری فایل در آنها کپی میکنیم :
با دستور زیر دایرکتوری های ایجاد شده را لیست میکنیم :
با استفاده از دستور mkfs برای این thin volume های ایجاد شده فایل سیستم میسازیم :
تمام 3 عدد volume کلاینت ها را به mount point های ایجاد شده با استفاده از دستور زیر mount میکنیم :
با استفاده از دستور df لیست mount point ها را مشاهده میکنیم :
اینجا میتوانیم ببینیم که هر 3 عدد volume کلاینت ها mount شده اند و در نتیجه تنها 3 درصد از اطلاعات در volume هر کلاینت استفاده شده است. بنابراین فایل های بیشتری به هر 3 عدد mount point از دسکتاپ خودم اضافه میکنم تا فضای بیشتری پر کنم :
اکنون mount point ها را لیست کرده و فضای استفاده شده در هر کدام را بررسی میکنیم همچنین thin pool را برای مشاهده سایز استفاده شده در pool را لیست میکنیم :
دستور بالا هر 3 عدد mount point به همراه سایز آنها به درصد نمایش میدهد :
در حالی که thin pool را بررسی میکنیم میبینیم که تنها 30٪ از data جمعا write شده است. که این میزان کل هر 3 عدد virtual volume کلاینت ها میباشد.
over provisioning :
اکنون چهارمین کلاینت از من درخواست 5 GB درخواست فضای storage میکند آیا می توانم به او بدهم؟ از آنجایی که قبلا 15 گیگابایت pool را به 3 کلاینتم دادم آیا ممکن است بتوان 5 GB بیشتر به کلاینت دیگری داد؟ اینجاست که از over provisioning استفاده میکنیم که به معنای دادن فضا بیشتر از آن چیزیست که داریم.
با دستور زیر 5 GB برای کلاینت چهارم میسازیم و سایز را نیز با دستور lvs بررسی میکنیم :
من تنها 15 GB در pool دارم اما 4 عدد volume درون thin-pool ایجاد کردم که تا 20 GB پیش میرود. اگر همه 4 کلاینت شروع به write دیتا بر روی volume هایشان کنند تا فضا را پر کنند در آن زمان ما با وضعیت بحرانی روبه رو خواهیم شد و اگر چنین نشود مشکلی پیش نخواهد آمد.
من فایل سیستم در thin_vol_client4 ایجاد کردم سپس تحت /mnt/client4/ مانت کردم و یک سری فایل در آن کپی کردم :
در تصویر بالا ما میتوانیم ببینیم که کل فضای استفاده شده در کلاینت چهارم جدید ایجاد شده بالغ بر 89.34٪ میباشد و سایز thin pool استفاده شده 59.19٪ است. اگر همه این یوزر ها بدین گونه دیتا روی volume هایشان write نکنند pool لبریز نمیشود و در نتیجه به مشکل برنخواهد خورد. برای جلوگیری از لبریز شدن pool ما نیاز داریم که سایز thin pool را افزایش دهیم.
مهم : thin pool ها تنها یک logical volume هستند بنابراین اگر بخواهیم سایز thin pool را افزایش دهیم میتوانیم کامند های یکسانی مانند آنجه برای افزایش logical volume ها استفاده کردیم به کار ببریم اما دقت کنید که سایز thin pool را نمیتوان کم کرد :
اینجا میتوانیم ببینیم که چگونه logical thin pool با نام tp_tecmint_pool را افزایش دهیم :
سپس سایز thin pool را لیست خواهیم کرد :
قبلا سایز tp_tecmint_pool برابر با 15 GB بود و چهار عدد thin volume که تا 20 گیگابایت over provisioning داشتن. اکنون تا 30 GB ان را افزایش دادیم در نتیجه over provisioning ما normal شد و thin volume ها محال است که لبریز شود و به دنبال آن به مشکل بربخورند. به این طریق حتی میتوان thin volume های بیشتری به pool اضافه کرد.
همچنین توصیه میشود مطالعه کنید :
بخش اول : آموزش کامل پارتیشن بندی هارد با LVM
بخش دوم : How to Extend/Reduce LVM’s in Linux
بخش سوم : How to Take Snapshot of Logical Volume and Restore in LVM
بخش پنجم : Manage Multiple LVM Disks using Striping I/O
بخش ششم : Migrating LVM Partitions to New Logical Volume (Drive)
در اینجا دیدیم چگونه با استفاده از یک سایز بزرگ از volume group یک thin pool بسازیم و درون آن thin volume را با استفاده از over provisioning ایجاد کنیم و حتی pool را افزایش دهیم. در مطلب بعدی خواهیم دید که چگونه یک lvm striping ایجاد کنیم.
با ما بمانید ....
موفق باشید
محمد هابیلی
thin provisioning چیست ؟
thin provisioning در lvm برای ایجاد virtual disk ها درون یک thin pool مورد استفاده قرار میگیرد. فرض کنید که من یک ظرفیت storage 15 GB در سرور خود دارم همچنین 2 کلاینت که هر کدام 5 گیگابایت storage دارند نیز موجود هستند. شما کلاینت سوم هستید و درخواست 5 گیگابایت storage دارید در نتیجه ما باید برای شما 5 گیگابایت کامل (Thick Volume) فراهم کنیم. اما شما ممکن است از این 5 GB تنها 2 GB را مصرف کنید و 3 GB آن خالی خواهد ماند که بعدا میتوانید آن را پر کنید.
اما آنچه که ما در thin provisioning انجام میدهیم این است که یک thin pool درون یک volume group بزرگ تعریف میکنیم و یک thin volume درون آن thing pool نیز تعریف خواهیم کرد. به طوری که هر فایلی که شما write میکنید ذخیره خواهد شد و storage شما 5 GB نمایش داده خواهد شد. اما 5 GB کامل برای کل دیسک اختصاص داده نخواهد شد. پروسه یکسانی برای کلاینت های دیگر نیز انجام خواهد شد همانطور که گفتم 2 کلاینت دیگر دارم و شما سومین کلاینت من هستید.
خب حالا کل GB که من برای کلاینت ها اختصاص دادم 15 GB بود و اگر کس دیگری پیش من بیاید و از من درخواست 5 GB داشته باشد میتوانم به او هم فضا اختصاص دهم؟ بله میتوانم. در thin provisioning میتوانم 5 GB برای هر 4 کلاینت اختصاص بدهم در حالیکه تنها 15 GB دارم.
هشدار : اگر از 15 GB بیشتر provisioning داشته باشیم در حقیقت over provisioning نامیده میشود.
نحوه کار آن چگونه است؟ و چگونه برای کلاینت های جدید storage فراهم میکند؟
من برای شما 5 GB فراهم کردم اما شما ممکن است تنها 2 GB استفاده کنید و 3 GB آزاد خواهد ماند. در thick provisioning نمی توانیم این کار را انجام دهیم زیرا در ابتدا تمامی فضا را به خودش اختصاص میدهد.
اما در thin provisioning من برای شما 5 GB تعریف میکنم که کل فضا را اختصاص نمیدهد. در حالی که یک volume تعریف میشود و تنها تا مرز 5 GB با توجه به حجم اطلاعات شما پیشرفت میکند. امیدوارم منظورم رو متوجه شده باشید. همانند شما دیگر کلاینت ها نیز تمامی حجم خود را استفاده نخواهند کرد در نتیجه شانس برای اضافه کردن 5 GB به یک کلاینت جدید وجود خواهد داشت که به آن over provisioning میگویند.
اما اجباریست که هر گونه افزایش volume مانیتور شود و اگر این کار صورت نگیرد احتمال دارد که فاجعه ای رخ دهد. در صورتی over provisioning رخ میدهد که هر 4 کلاینت اطلاعات خود را به صورت کامل در فضای خود پر کنند و از حد 15 GB فراتر روند و این باعث بروز مشکل در volume خواهد شد.
تجهیزات و تنظیمات سرور :
سیستم عامل : CentOS 6.5 با LVM
Server IP : 192.168.0.200
مرحله اول :
ایجاد thin pool و volume ها :
در ابتدا سایز زیادی از volume group نیاز داریم در اینجا من volume group با فضای 15 GB ایجاد کردم و با استفاده از دستور زیر volume group را لیست خواهم کرد :
کد PHP:
# vgcreate -s 32M vg_thin /dev/sdb1
سپس سایز logical volume در دسترس را قبل از ایجاد thin pool و volume ها بررسی میکنیم :
کد PHP:
# vgs
# lvs
همانطور که میبینید تنها logical volume های پیش فرض برای سیستم عامل و swap در خروجی کامند lvs موجود هستند.
ایجاد یک thin pool :
برای ایجاد یک thin pool به ازای 15 GB در volume group با نام vg_thin دستور زیر را اجرا میکنیم :
کد PHP:
# lvcreate -L 15G --thinpool tp_tecmint_pool vg_thin
آپشن thinpool- : برای ایجاد یک thinpool
tp_tecmint_pool : نام انتخابی برای thin pool
vb_thin : نام volume grop که برای ایجاد pool نیاز داریم.
برای دریافت اطلاعات بیشتر دستور lvdisplay را اجرا میکنیم :
کد PHP:
# lvdisplay vg_thin/tp_tecmint_pool
اینجا ما virtual thin volume ها را در این thin pool ایجاد نکرده ایم همانطور که در تصویر میبینیم allocated pool data مقدار 0.00٪ را نمایش میدهد.
ایجاد thin volume :
اکنون میتوانیم thin volume ها را درون thin pool با کمک دستور lvcreate به همراه آپشن v- (یعنی virtual) تعریف کنیم :
کد PHP:
# lvcreate -V 5G --thin -n thin_vol_client1 vg_thin/tp_tecmint_pool
کد PHP:
# lvs
اکنون thin volume بالا ایجاد شد میخواهم 2 عدد thin volume برای 2 کلاینت دیگر ایجاد کنم. در اینجا شما میبینید که 3 عدد thin volume تحت pool (با نام tp_tecmint_pool) ایجاد شده است. در نتیجه از این نکته میفهمیم که من تمام 15 گیگابایت pool را استفاده کردم :
ایجاد فایل سیستم :
اکنون mount point ها را ایجاد میکنیم و این 3 عدد thin volume را به آنها mount کرده و یکسری فایل در آنها کپی میکنیم :
کد PHP:
# mkdir -p /mnt/client1 /mnt/client2 /mnt/client3
با استفاده از دستور mkfs برای این thin volume های ایجاد شده فایل سیستم میسازیم :
کد PHP:
# mkfs.ext4 /dev/vg_thin/thin_vol_client1 && mkfs.ext4 /dev/vg_thin/thin_vol_client2 && mkfs.ext4 /dev/vg_thin/thin_vol_client3
تمام 3 عدد volume کلاینت ها را به mount point های ایجاد شده با استفاده از دستور زیر mount میکنیم :
کد PHP:
# mount /dev/vg_thin/thin_vol_client1 /mnt/client1/ && mount /dev/vg_thin/thin_vol_client2 /mnt/client2/ && mount /dev/vg_thin/thin_vol_client3 /mnt/client3/
کد PHP:
# df -h
اینجا میتوانیم ببینیم که هر 3 عدد volume کلاینت ها mount شده اند و در نتیجه تنها 3 درصد از اطلاعات در volume هر کلاینت استفاده شده است. بنابراین فایل های بیشتری به هر 3 عدد mount point از دسکتاپ خودم اضافه میکنم تا فضای بیشتری پر کنم :
اکنون mount point ها را لیست کرده و فضای استفاده شده در هر کدام را بررسی میکنیم همچنین thin pool را برای مشاهده سایز استفاده شده در pool را لیست میکنیم :
کد PHP:
# df -h
# lvdisplay vg_thin/tp_tecmint_pool
دستور بالا هر 3 عدد mount point به همراه سایز آنها به درصد نمایش میدهد :
کد PHP:
13% of datas used out of 5GB for client1
29% of datas used out of 5GB for client2
49% of datas used out of 5GB for client3
over provisioning :
اکنون چهارمین کلاینت از من درخواست 5 GB درخواست فضای storage میکند آیا می توانم به او بدهم؟ از آنجایی که قبلا 15 گیگابایت pool را به 3 کلاینتم دادم آیا ممکن است بتوان 5 GB بیشتر به کلاینت دیگری داد؟ اینجاست که از over provisioning استفاده میکنیم که به معنای دادن فضا بیشتر از آن چیزیست که داریم.
با دستور زیر 5 GB برای کلاینت چهارم میسازیم و سایز را نیز با دستور lvs بررسی میکنیم :
کد PHP:
# lvcreate -V 5G --thin -n thin_vol_client4 vg_thin/tp_tecmint_pool
# lvs
من تنها 15 GB در pool دارم اما 4 عدد volume درون thin-pool ایجاد کردم که تا 20 GB پیش میرود. اگر همه 4 کلاینت شروع به write دیتا بر روی volume هایشان کنند تا فضا را پر کنند در آن زمان ما با وضعیت بحرانی روبه رو خواهیم شد و اگر چنین نشود مشکلی پیش نخواهد آمد.
من فایل سیستم در thin_vol_client4 ایجاد کردم سپس تحت /mnt/client4/ مانت کردم و یک سری فایل در آن کپی کردم :
کد PHP:
# lvs
در تصویر بالا ما میتوانیم ببینیم که کل فضای استفاده شده در کلاینت چهارم جدید ایجاد شده بالغ بر 89.34٪ میباشد و سایز thin pool استفاده شده 59.19٪ است. اگر همه این یوزر ها بدین گونه دیتا روی volume هایشان write نکنند pool لبریز نمیشود و در نتیجه به مشکل برنخواهد خورد. برای جلوگیری از لبریز شدن pool ما نیاز داریم که سایز thin pool را افزایش دهیم.
مهم : thin pool ها تنها یک logical volume هستند بنابراین اگر بخواهیم سایز thin pool را افزایش دهیم میتوانیم کامند های یکسانی مانند آنجه برای افزایش logical volume ها استفاده کردیم به کار ببریم اما دقت کنید که سایز thin pool را نمیتوان کم کرد :
کد PHP:
# lvextend
کد PHP:
# lvextend -L +15G /dev/vg_thin/tp_tecmint_pool
سپس سایز thin pool را لیست خواهیم کرد :
کد PHP:
# lvs
قبلا سایز tp_tecmint_pool برابر با 15 GB بود و چهار عدد thin volume که تا 20 گیگابایت over provisioning داشتن. اکنون تا 30 GB ان را افزایش دادیم در نتیجه over provisioning ما normal شد و thin volume ها محال است که لبریز شود و به دنبال آن به مشکل بربخورند. به این طریق حتی میتوان thin volume های بیشتری به pool اضافه کرد.
همچنین توصیه میشود مطالعه کنید :
بخش اول : آموزش کامل پارتیشن بندی هارد با LVM
بخش دوم : How to Extend/Reduce LVM’s in Linux
بخش سوم : How to Take Snapshot of Logical Volume and Restore in LVM
بخش پنجم : Manage Multiple LVM Disks using Striping I/O
بخش ششم : Migrating LVM Partitions to New Logical Volume (Drive)
در اینجا دیدیم چگونه با استفاده از یک سایز بزرگ از volume group یک thin pool بسازیم و درون آن thin volume را با استفاده از over provisioning ایجاد کنیم و حتی pool را افزایش دهیم. در مطلب بعدی خواهیم دید که چگونه یک lvm striping ایجاد کنیم.
با ما بمانید ....
موفق باشید
محمد هابیلی