LVM:重要名詞
下面這一段是直接取用LVM官方說明,這裡只做簡單的中文翻譯.
Physical Volume (PV)
A physical volume is typically a hard disk, though it may well just be a device that 'looks' like a hard disk (eg. a software raid device).
這就是硬碟切割出來的實體partition(/dev/sdb1,/dev/sdc1)
volume group (VG)
The Volume Group is the highest level abstraction used within the LVM. It gathers together a collection of Logical Volumes and Physical Volumes into one administrative unit.
接下來再由多個 PV(/dev/sdb1,/dev/sdc1)建立出的磁區再組合成一個虛擬的磁碟(/dev/volum00,將來使用時這就像是/dev/sda一個真實的磁碟機一樣,但不同於一般磁碟機的是他的大小是可以縮放)
Logical Volume (LV)
The equivalent of a disk partition in a non-LVM system. The LV is visible as a standard block device; as such the LV can contain a file system (eg. /home).
由VG這個虛擬磁碟所切割出來的 partition(/dev/volum00/LVOL1,將來使用時就像/dev/sda1一個真實的磁區一樣,但不同於一般磁區他是可以縮放的)
Physical Extent (PE)
Each physical volume is divided chunks of data, known as physical extents, these extents have the same size as the logical extents for the volume group.
PE就如同是磁碟機在格式化時,每個block的大小.而 PE系統預設大小為4M而一個VG最多可以擁有65534個PE,所以當系統預設時,ㄧ個VG最大尺寸為65534*4M大概為256G.對於現在大硬碟的狀況下很快就無法再延伸了.所以建議在設定PE時指定大小.除了預設的4M外只要是2的倍數在8k-16GB都是可以的範圍.
LVM 的整個架構如下:
整個架構就是將許多的 partition(/dev/sdb1 /dev/sdc1) 組成一個虛擬的磁碟(/dev/vg).之後就可以將它動態切割成你需要大小的 partition(/dev/vg/lv1,/dev/vg/lv2).就可以像一般的 partition 來使用.
系統是否有支援 LVM2
先來檢查檢查你的系統是否有支援 LVM 的功能, RHEL5 預設就包含 LVM 的功能.目前 LVM 是第二版,不過這邊還是稍微談一下 LVM2 ,它是由 3 項東西組合而成.
1. 有將 device-mapper 的功能編譯進核心或是模組,這些功能在中的 Multi-device support (RAID and LVM) 下.
[root@benjr ~]# cat /boot/config-kernel-version | grep -i BLK_DEV_DM CONFIG_BLK_DEV_DM=m |
2.device-mapper 的 library (libdevmapper)
[root@benjr ~]# rpm -aq |grep -i device-mapper device-mapper-version |
3.LVM2 工具組
[root@benjr ~]# rpm -aq |grep -i lvm lvm2-version |
Physical Volume (PV) 的建立
PV 的建立如同切割 partition 使用 #system-config-lvm 選擇要建立 PV 的硬碟 sdb 選擇要 "initialize Entity.這也是可以透過指令來完成 請參考指令版的使用方式 http://benjr.tw/?q=node/55
Volume Group (VG) 的建立
有了 PV 就可以開始建立 VG ,在 Unallocated Volumes 找到剛剛建立的 PV,選擇 "Create new Volume Group" 開始建立 VG 主要的選項有5個.
Volume Group Name:
名稱會決定了將來 voulme 裝置名稱(/dev/Volume Group Name/Logical Volume Name).
Maximum Physical Volumes:
通常空間不夠時我們會去串接其他硬碟(PV),這裡就決定了 PV 的最大數量,預設256也絕對夠用了.
Maximum Logical Volumes:
這裡可以設定會來 LV 的多寡,預設是 256,因該都夠使用了不需要特別去修改.
Physical Extent Size:
PE 會限制住 VG 的大小,所以這裡就可以考慮將 PE 設大一點.只要是2的倍數在8k-1GB都是可以的範圍,預設值為 4M.
Clustered:
如果你的 volume 使用在 Cluster 叢集環境才需要勾選,一般我們都是把它當作本地端硬碟所以不需要勾選.
Logical Volume (LV) 的建立
剛建立好 VG 的 vg1 在 Volume Groups 就會看到,現在就可以來建立 LV,點選 "Create New Logical Voumes"
LV name:
名稱會決定了將來 voulme 裝置名稱(/dev/Volume Group Name/Logical Volume Name)
LV Properties:
LVM 提供了三種硬碟對應( mapping )方式,1.Linear 2.Mirrored 3.Striped 預設是 Linear 如果系統只有單獨一個 PV(Physical Volume) 時的唯一選擇.當你系統 VG(Volume Group) 是由多個 PV(Physical Volume) 時就可以使用另外兩種 2.Mirrored 3.Striped 他們跟 RAID 的概念一致,你可以把它想像成 Soft RAID 的 方式.Mirrored 就像是 RAID 1 ,Striped 就像是 RAID 0.
1.Linear
我的環境是利用兩個硬碟 sdb1,sdc1組合成一個 Linear LVM Disk,資料的讀寫時系統會依序下去,當 sdb1 空間用完時才會寫到 sdc1 的硬碟裡面.
2.Mirrored
我的環境是利用兩個硬碟 sdb1,sdc1組合成一個 Mirrored LVM Disk,當資料的讀寫時系統會同時在 sdb1 sdc1 都寫入相同的資料.這就像是 RAID 1.適用於當資料不能遺失的重要資料.
3.Striped
我的環境是利用兩個硬碟 sdb1,sdc1組合成一個 Striped LVM Disk,當資料的讀寫時系統會依序sdb1 ,sdc1 交錯寫入.這就像是 RAID 0.因為資料是交錯的寫入所以在讀寫時可以快速從不同硬碟讀到所需的資料.也因此適用於當負載比較重的資料儲存庫.
Size:
就要這一個 LV(Logic Volume) 需要多大的空間,因為 LVM 的空間是可以依據實據需求做大小的改變,所以這邊你可以隨時做修改.單位有:1.Extents 2.Gigabytes 3.Megabytes 4.Kilobytes.除了 Extents 外其他都是依據我們常在規劃的資料單位(G/M/K Bytes,1G=109 ,1M=1061K=103) 還記得剛剛在切割 Physical Extent Size 時有設定一個大小,Extents 就是用這為單位.剛剛預設單位為 4MBytes.
User remaining:
就是將VG(volume group)所有剩下的空間都規劃成 LV(Logical Volume)
Filesystem:
在切割完成 LV 需要格式化這邊就是可以選擇格式化的檔案格式,預設是不做格式化 None,其他的可以使用的有 Ext3 / Ext2 / GFS(local) / GFS(Clusterd) ,Global File System 不做本範疇的討論中,用最一般的 Ext3 即可.
Mount point:
這邊還可以選擇在格式劃完成後要將這 LV(Logical Volume) 掛載(mount)到哪個目錄下面."mount when rebooted" 直是在下一次開機後還是會自動幫我們這一個 LV(Logical Vloume) 掛載到指定的目錄下,主要他也是將他寫入到 /etc/fstab 檔案中.當目錄不存在時系統會詢問是否要產生 say "yes" 就會幫我們所有的動作都做完.
動態縮放 LV (Logical Volume)磁碟系統大小
前面一直強調 LVM(Logical Volume Manager) 和傳統的硬碟他最大的優點就是可以依據實際需求再縮放硬碟空間大小,下面就可以看到他一樣可以透過 #system-config-lvm 這一隻工作完成縮放空間.原本我剛剛建立的 LV1 空間大小可以看到是 20 GByte 現在可能資料量多了不符合使用所以我要將它放大一倍.變成 40 Gbyte.
轉換的時間會依據 LV(Logical Volume) 空間大小而有所不同,你可以看到空間的確變大了,我們甚至於是在線上就將硬碟的空間增大,不需要重新格式化或是重新掛載它.
[root@benjr ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 19G 6.4G 12G 36% / tmpfs 1005M 0 1005M 0% /dev/shm /dev/mapper/vg1-lv1 20G 173M 19G 1% /share #放大 LV(Logical Volume) 之後 [root@benjr ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 19G 6.4G 12G 36% / tmpfs 1005M 0 1005M 0% /dev/shm /dev/mapper/vg1-lv1 40G 177M 38G 1% /share |
同樣的縮小也是一樣的方式,不過在縮小時需先將它離線 (#umount) ,縮小後再重新掛載上線,但是切記縮小的空間總和不能小於原先硬碟實際使用空間.系統是透過指令 "resize2fs" 來放大縮小硬碟空間,他會去檢查我們的動作是否符合真實硬碟使用空間,如果你硬要將空間縮小到比原先硬碟實際使用的空間還是小,它是不會允許這樣的做法. 系統會給我們警告 "/sbin/resize2fs:No space left on device while trying to resize /dev/vg1/lv1" 並將動作中斷.
動態縮放 VG(Volume Group)磁碟系統大小
LV(Logical Volume) 雖然可以放大但是當 VG(Volume Group) 的空間也用完時 LV(Logical Volume) 放大的功能就無用武之地,此時可以將 VG(Volume Group) 放大,方式很簡單只要在你的系統多增加一塊實體的硬碟並將它加入原先建立好的 VG(Volume Group.目前我的系統除了 /dev/sdb 外還有一顆 /dev/sdc ,這一個硬碟還未經過 PV 的建立,我可以在 "Uninitialized Entities" 找到.第一步將它初始化選擇要 "initialize Entity.切割 sdc 的 partition 並建立 PV(Physical Volume) .
建立好 PV(Physical Volume) 現在將這一個硬碟加到原先建立好的 VG(Volume Group).剛切割好 PV 會存放在 "Unallocated Volumes".選擇 "Add to existing volume Group" 並將它加入到原先建立好的 vg1.
回到 Volume Groups 就可以看到 Physical View 的變成 sdb1 + sdc1 所組合而成.你也可以在 "Properties for Volume Group" 的 "Volume Group Size" 的確變大了,所以 LV(Logical Volume) 又可以再放大了.
LVM mapping modes (linear/striped/mirrored)
前面介紹 LV Properties 時說到 LVM 提供了三種硬碟對應( mapping )方式,1.Linear 2.Mirrored 3.Striped 預設是 Linear 剛剛前面的範例都是使用 Linear ,如果系統只有單獨一個 PV(Physical Volume) 時的唯一選擇.當你系統 VG(Volume Group) 是由多個 PV(Physical Volume) 時就可以使用另外兩種 2.Mirrored 3.Striped 他們跟 RAID 的概念一致,你可以把它想像成 Soft RAID 的 方式.Mirrored 就像是 RAID 1 ,Striped 就像是 RAID 0.
目前我的系統有三個硬碟分別切割成 sdb1 , sdc1 ,sdd1 並將他們組合在一起成為一個 VG(Volume Group).剛建立好 VG 的 vg1 在 Volume Groups 就會看到,現在就可以來建立 LV,點選 "Create New Logical Voumes" Mirrored 和 Striped 的 LV(Logical Volume) 各切一種出來.
Mirrored(RAID 1):
這邊有點要注意一下的是 Mirrored(RAID 1) 需要的 PV(Physical Volume) 是三顆,因為它還需要另外一顆 PV(Physical Volume) 存放 Mirrored Log,這是他預設的不能更改如果不想用到 Log 可以使用手動新增 #lvcreate -L 15G -m1 -n mirrored vg1 當有這個 Log 的時候系統會在每次重新開機都會先同步 mirror 的資料.
Striped(RAID 0):
Striped(RAID 0) 最少需要 2 個 PV(Physical Volume) 存在 VG(Volume Group) 中,這邊有三顆 PV(Physical Volume) 我通通都把他指定下去,stripesize 大小為(2的n次方,n=2 to 9).下面可以看到 LV(Logical Volume) 真正對應到實體 PV(Physical Volume) 的狀態.
實際的對應可以很清楚的看到 Mirrored 的資料是同時各存一塊在個別的 PV(Physical Volume) 在加上一個 PV(Physical Volume) 存放 Log.而 Striped 則是將資料分別打散到各個不同的 PV(Physical Volume) 以達到加速資料的存取.
測試一下效能,可以看到 striped 的效能的確較好.
[root@benjr ~]# hdparm -t /dev/vg1/mirrored Timing buffered disk reads: 182 MB in 3.01 seconds = 60.49 MB/sec HDIO_DRIVE_CMD(null) (wait for flush complete) failed: Inappropriate ioctl for device [root@benjr ~]# hdparm -t /dev/vg1/striped /dev/vg1/striped: Timing buffered disk reads: 702 MB in 3.01 seconds = 233.54 MB/sec HDIO_DRIVE_CMD(null) (wait for flush complete) failed: Inappropriate ioctl for device |
RHEL5 - LVM Snapshots
什麼是 snapshot ,基本上 snapshot 照字面的意思是快照,就如同它的意思它幫我們的 LV(Logical Volume) 照相.它可以幫 LV(Logical Volume) 記錄下當時 LV(Logical Volume) 的資料,但是它不是做備份,snapshot 採用的方式叫做寫時複寫(copy on write),當 LV(logical Volume) 產生一個 snapshot 時.LV(Logical Volume) 和 snapshot 同時都是指向同一筆資料,一開始 LV(Logical Volume) 和 snapshot 都是指向同一個區塊的資料,所以 snapshot 一開始自己磁區是空的.只有當 LV(Logical Volume) 的資料備有寫入會是修改時,才會將資料原始資料複製到 snapshot ,之後才將 LV(logical Volume) 的資料做寫入或是修改.
在使用 snapshot 需要模組 dm-snapshot.
[root@benjr ~]# modprobe dm-snapshot |
在建立 snapshot LV(logical Volume) 時要與原先的資料處於在同一個 VG(Volume Group),,建議空間為原資料 LV 大小的 15-20 %
snapshot 很適合用在資料庫備份先行將資料做 snapshot(快照),之後只要針對 snapshot 磁區做備份即可.原先的資料還是可以進行讀寫不會受到備份的影響,不需要在進行備份時還要將資料庫所在的目錄先行離線.LVM 1 sanpshot 只能夠唯讀不過在 LVM2 的 snapshot 就可以讀寫了.
Snapshot 的原理
snapshot 也是一個磁區 (partion) 但是一開始他並不佔有任何空間. snapshot 的作法是當原有的磁區 /dev/vg1/striped 資料有變動(新增,移除,變更)時,他會複製一份原始的檔案到 /dev/vg1/snapshot 磁區,然後才會讓更新的資料寫到原本的磁區.看一下下面的實驗吧!!
[root@benjr ~]# ls /database total 13 -rw-r--r-- 1 root root 1 Apr 2 00:28 a.test.file drwxr-xr-x 2 root root 12288 Apr 2 00:28 lost+found [root@benjr ~]# ls /backup total 13 -rw-r--r-- 1 root root 1 Apr 2 00:28 a.test.file drwxr-xr-x 2 root root 12288 Apr 2 00:28 lost+found |
可以到無論是 /database 或是 /backup的資料都是一樣,現在移除 /database/a.test.file 檔案.
[root@benjr ~]# rm /database/a.test.file [root@benjr ~]# ls /backup total 13 -rw-r--r-- 1 root root 1 Apr 2 00:28 a.test.file drwxr-xr-x 2 root root 12288 Apr 2 00:28 lost+found |
你還是可以發現檔案 a.test.file 還是存在於 /dev/vg1/snapshot 磁區.這時的 snapshot 也開始使用到磁區的空間了.
note: