Skip to content

Instantly share code, notes, and snippets.

@archsh
Last active July 7, 2022 08:33
Show Gist options
  • Save archsh/09a0b10f74da053ba874575fab155af5 to your computer and use it in GitHub Desktop.
Save archsh/09a0b10f74da053ba874575fab155af5 to your computer and use it in GitHub Desktop.
Using lvmcache on CentOS6

目标

  1. 使用SSD加速系统IO;
  2. 通过LVMCACHE来将SSD作为HDD的CACHE使用;

确认安装版本是否支持lvmcache:

lvm 命令

[root@localhost mnt]# lvm segtypes

(看输出里面有cache,cache-pool即表示支持了)

dm_cache驱动

[root@localhost mnt]# modprobe dm_cache

(看是否能够加载成功,如果失败,则表示不支持)

升级以支持lvmcache:

[root@localhost mnt]# yum update kernel kernel-headers lvm2 lvm2-libs

升级完后要重启系统,重启会自动以新升级的kernel重启

LVMCACHE 开干

创建VG

根据你机器的磁盘,创建好相关的PV,包括SSD、HDD。这里假设你有5块HDD,分别是sdb1、sdc1、sdd1、sde1、sdf1;假设你有两块SSD,分别是:sdg1、sdh1

[root@localhost mnt]# pvcreate /dev/sdb1 ...... /dev/sdh1

创建VG

创建一个VG,包含所有的PV(当然也包含SSD在内)

[root@localhost mnt]# vgcreate vg0 /dev/sdb1 /dev/sdc1 /dev/sdd1 ....

lvmcache限制了cache和cachemeta必须在同一个vg下面,所以创建一个vg就可以了。

创建磁盘LV

[root@localhost mnt]# lvcreate -n data -l 100%FREE vg0 /dev/sdb1 .../dev/sdf1

创建磁盘(data)LV的时候注意后面加上pv的列表,限制lv只在指定的pv上创建。如果需要创建stripped模式的LV,请加上-iN(N为pv数量)参数。

创建cache LV

[root@localhost mnt]# lvcreate -n cache -L 100G vg0 /dev/sdg1 /dev/sdh1

创建cache LV的时候注意加上SSD的pv列表,限制该LV只在SSD的PV上面创建。如果需要创建stripped模式的LV,请加上-iN(N为pv数量)参数。

创建cachemeta LV

[root@localhost mnt]# lvcreate -n cachemeta -L 1G vg0 /dev/sdg1 /dev/sdh1

创建cachemeta LV的时候注意加上SSD的pv列表,限制该LV只在SSD的PV上面创建。如果需要创建stripped模式的LV,请加上-iN(N为pv数量)参数。

创建Cachepool

[root@localhost mnt]# lvconvert --type cache-pool --poolmetadata vg0/cachemeta vg0/cache
[root@localhost mnt]# lvs -a vg0
  LV              VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  cache           vg0  Cwi---C---  1.00g                                                    
  [cache_cdata]   vg0  Cwi-------  1.00g                                                    
  [cache_cmeta]   vg0  ewi------- 64.00m                                                    
  data            vg0  -wi-a----- 15.99g                                                    
  [lvol0_pmspare] vg0  ewi------- 64.00m 

创建Cache LV

[root@localhost mnt]# lvconvert --type cache --cachepool vg0/cache vg0/data
[root@localhost mnt]# lvs -a vg0
  LV              VG   Attr       LSize  Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert
  [cache]         vg0  Cwi---C---  1.00g                0.01   0.24            0.00            
  [cache_cdata]   vg0  Cwi-ao----  1.00g                                                       
  [cache_cmeta]   vg0  ewi-ao---- 64.00m                                                       
  data            vg0  Cwi-a-C--- 15.99g [cache]        0.01   0.24            0.00            
  [data_corig]    vg0  owi-aoC--- 15.99g                                                       
  [lvol0_pmspare] vg0  ewi------- 64.00m 

默认是writethrough模式,要改为writeback模式加参数: --cachemode writeback。

[root@localhost mnt]# lvconvert --type cache --cachemode writeback --cachepool vg0/cache vg0/data
  Logical volume vg0/data is now cached.
[root@localhost ~]# lvs -o+cache_mode vg0/data
  LV   VG   Attr       LSize  Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert Cachemode
  data vg0  Cwi-aoC--- 15.99g [cache]        100.00 0.36            0.00             writeback

格式化和挂载Cache LV

[root@localhost mnt]# mkfs.ext4 /dev/vg0/data
[root@localhost mnt]# mount -t ext4 /dev/vg0/data /mnt/

其他

Cache动态绑定与分离

lvmcache可以动态的绑定或者分离cache,并不会影响lvm区里面的数据。

分离Cache

[root@localhost mnt]# lvconvert --splitcache vg0/data

上面命令把vg0/data这个lv的cache去掉了。比如:

[root@localhost ~]# lvs -a vg0
  LV              VG   Attr       LSize  Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert
  [cache]         vg0  Cwi---C---  1.00g                100.00 0.36            0.00            
  [cache_cdata]   vg0  Cwi-ao----  1.00g                                                       
  [cache_cmeta]   vg0  ewi-ao---- 64.00m                                                       
  data            vg0  Cwi-a-C--- 15.99g [cache]        100.00 0.36            0.00            
  [data_corig]    vg0  owi-aoC--- 15.99g                                                       
  [lvol0_pmspare] vg0  ewi------- 64.00m                                                       
[root@localhost ~]# lvconvert --splitcache vg0/data
  Flushing cache for data.
  Logical volume vg0/data is not cached and cache pool vg0/cache is unused.
[root@localhost ~]# lvs -a vg0
  LV              VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  cache           vg0  Cwi---C---  1.00g                                                    
  [cache_cdata]   vg0  Cwi-------  1.00g                                                    
  [cache_cmeta]   vg0  ewi------- 64.00m                                                    
  data            vg0  -wi-a----- 15.99g                                                    
  [lvol0_pmspare] vg0  ewi------- 64.00m

绑定Cache

绑定Cache的方式与前面创建Cache LV的方式一样:

[root@localhost mnt]# lvconvert --type cache --cachepool vg0/cache vg0/data
[root@localhost mnt]# lvs -a vg0
  LV              VG   Attr       LSize  Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert
  [cache]         vg0  Cwi---C---  1.00g                0.01   0.24            0.00            
  [cache_cdata]   vg0  Cwi-ao----  1.00g                                                       
  [cache_cmeta]   vg0  ewi-ao---- 64.00m                                                       
  data            vg0  Cwi-a-C--- 15.99g [cache]        0.01   0.24            0.00            
  [data_corig]    vg0  owi-aoC--- 15.99g                                                       
  [lvol0_pmspare] vg0  ewi------- 64.00m 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment