بسیاری از شما با LVM یا Logical Volume Manage آشنا هستید. در صورتی که آشنا نیستید مقاله Logical Volume Manager را مطالعه کنید. LVM امکانی را در اختیار ما قرار می دهد با نام snapshot .

این ویژگی به ما کمک می کند تا از یک Logical Volume در لحظه مورد نظر خود تصویری تهیه کنیم. این حجم جدید قابل خواندن و نوشتن است و در موارد زیادی مانند پشتیبانی گیری و تست سرویس و نرم افزار می تواند مورد استفاده قرار گیرد. در این مقاله به تحلیل نحوه کار LVM Snapshot خواهیم پرداخت.

ساخت یک Logical Volum

من از دو پارتیشن یک گیگابایتی بر روی سیستمم به عنوان محیط تست استفاده کرده ام و مراحل کار را بر روی آنها انجام می دهم

pvcreate /dev/sda[78]
vgcreate vg-test /dev/sda[78]
lvcreate -L 800M -n lv-test vg-test

 اکنون یک logical volume ساخته شده است

# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv-test vg-test -wi-a----- 1.27g

جدول device mapper به شکل زیر خواهد بود

# dmsetup table
vg--test-lv--test: 0 1638400 linear 8:7 2048

نوبت به ساخت یک snapshot از logical volume ساخته شده است. فرمول دقیقی برای اندازه یک snapshot نیست. ولی لازم نیست بیشتر از حجم logical volume اصلی باشد. زیرا که تنها داده هایی که تغییر می کنند را ذخیره می کند.

lvcreate -s -n snap0 -L 100M /dev/vg-test/lv-test

نتیجه خواهد شد:

# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv-test vg-test owi-a-s--- 800.00m
snap0 vg-test swi-a-s--- 100.00m lv-test 0.00

پس از ساخت snapshot به device mapper نگاهی بیندازید

# dmsetup table
vg--test-snap0-cow: 0 204800 linear 8:7 1640448
vg--test-lv--test: 0 1638400 snapshot-origin 253:2
vg--test-lv--test-real: 0 1638400 linear 8:7 2048
vg--test-snap0: 0 1638400 snapshot 253:2 253:3 P 8

ما انتظار داشتیم که دو device ببینیم ولی اکنون چهار device داریم. نسبت آین device ها به هم به شکل زیر است

 lvm حجم vg--test-lv--test ما را به vg--test-lv--test-real تغییر نام داده است و یک دیوایس جدید با نام vg--test-lv--test ساخته است. و کاربر به طور غیر محصوص با این device جدید کار می کند.

device جدید دیگر با نام vg--test-snap0-cow  همان snapshot اصلی ما با حجم 100MB است که محتوای snapshot را نگهداری می کند.

و device جدید دیگر vg--test-snap0 همان device ای است که کاربر با آن کار می کند

خواندن داده از حجم اصلی
زمانی که کاربر سعی می کند تا از  vg--test-lv--test داده بخواند این درخواست به vg--test-lv--test-real هدایت می شود

نوشتن داده بر روی حجم واقعی
کاربر بر روی vg--test-lv--test داده ای می نویسد. داده اصلی ابتدا از روی vg--test-lv--test-real به vg--test-snap0-cow نوشته می شود (این دلیل اصلی آن است که این device به نام cow یا Copy-on-Write خوانده می شود)  سپس داده اصلی بر روی vg--test-lv--test-real نوشته می شود. اگر کاربر مجدد داده ای بریزد و مقدار قبلی را ویرایش کند این مقدار تنها در vg--test-lv--test-real تغییر خواهد کرد و vg--test-snap0-cow دیگر تغییر نمی کند و همان داده اصلی را نگه می دارد. با این کار داده های زمان گرفتن شدن snapshot تغییر نکرده در اختیار ماست.

خواندن از snapshot
زمانی که کاربر سعی می کند تا از vg--test-snap0 داده‌ای بخواند، یک بررسی اتقاق می افتد که آیا این داده ای که کاربر درخواست داده است، همان بخشی از داده است که به vg--test-snap0-cow کپی شده است ؟ اگر چنین باشد از vg--test-snap0-cow داده خوانده می شود و در غیر این صورت از vg--test-lv--test-real

چند نکته مهم

  • snapshot در زمان ساخت با هر اندازه ای که تغریف شود خالی است. در نتیجه ساخت آن سریع و در لحظه است
  • snapshot کپی داده هایی را که در vg--test-lv--test-real تغییر کرده است را نگه می دارد. بنابراین به مرور زمان برزگتر می شود، ولی هیچگاه به اندازه دیسک اصلی حجم اشغال نمی کند. لازم نیست فضای در نظر گرفته شده برای snapshot برابر حجم اصلی باشد. تنها باید حجم تغییرات را پیش بینی نموده و حجم را بر مبنای آن انتخاب کنید
  • اگر حجم انتخاب شده برای snapshot به اندازه کافی بزرگ نباشد تا همه داده های تغییر کرده را ذخیره کند، snapshot بلافاصله پاک شده و ناپدید می شود
  • زمانی که یک LV یک یا چند snapshot داشته باشد، بازدهی کمتری خواهد داشت. هر زمان که کارتان با snapshot تمام شد آن را پاک کنید

 

منبع: https://www.clevernetsystems.com/lvm-snapshots-explained/