Studio环境的LVM+XFS存储

备注

最初我选择 Studio环境的Btrfs存储 ,主要考虑到Btrfs文件系统接近ZFS的特性,结合了卷管理和文件系统的高级特性,灵活并且充分利用好磁盘空间。在 MacBook Pro上运行Ubuntu 采用Btrfs构建libvirt卷和Docker卷,确实非常方便管理和维护。

不过, ThinkPad X220上运行Arch Linux 实践中,我为了体验技术,启用了Btrfs的磁盘透明压缩功能。这次尝试似乎带来了不稳定的因素,Btrfs出现csum错误。目前我还不确实是否是因为SSD磁盘存在硬件故障。

从Red Hat Enterprise Linux 8开始,Red Hat放弃了Btrfs支持,这对于企业运行RHEL/CentOS环境,实际上已经变相阻止了Btrfs。原因可能比较复杂,一方面是Btrfs的高级特性(如RAID)一直不稳定,另一方面可能和Oracle和Red Hat的存储竞争策略冲突相关。

Red Hat Enterprise Linux推荐的默认文件系统是XFS,XFS文件系统是数据库本地磁盘首选的文件系统。

方案选择

  • 存储分区需要能够灵活调整,所以需要采用LVM卷管理来划分磁盘分区

  • 需要有高性能文件系统,对SSD存储优化,并适合大型应用运行

LVM + XFS是适合数据库应用运行的Linux存储组合,并且也是Red Hat主推的用于取代ZFS和Btrfs的 Stratis项目 底层技术堆栈。所以,我选择这个存储技术组合。

LVM卷管理

逻辑卷管理(Logical Volume Management)工具使用了内核 Device Mapper 功能来提供系统分区无关的底层磁盘布局。通过LVM抽象存储就能够获得”虚拟分区”,已及方便的扩展和收缩功能。

虚拟分区允许添加或移除一个分区的底层磁盘,这样就无需担忧磁盘空间不足。

LVM构建基础概念:

  • 物理卷(Physical volume, PV): Unix块设备节点。通常是磁盘、MBR或GPT分区,loopback文件,device mapper设备(例如,dm-crypt)。在物理卷上保存了LVM头部(LVM header)

  • 卷组(Volume group, VG): PV组成卷足用于提供逻辑卷LV的容器。PV是通过VG提供给LV使用的。

  • 逻辑卷(Logical volume, LV): 逻辑分区是在VG中表述并由PE组成的,LV是一个Unix块设备,类似物理分区,也就是可以直接用文件系统格式化。

  • 物理扩展(Physical extent): 物理扩展PE时在PV上的最小连续扩展(默认4MB),可以分配给LV,你可以将PE视为PV的一部分,被分配给LV。

安装软件包

  • 安装 lvm2 软件包:

    sudo pacman -S lvm2
    

创建分区

  • 使用parted划分分区,参数采用 --align

    parted -a optimal /dev/sda
    
  • 创建分区3:

    mkpart primary 51.7GB 100%
    
  • 设置分区名和启用分区LVM:

    name 3 store
    set 3 lvm on
    
  • 最后检查:

    print
    

显示输出:

Model: ATA INTEL SSDSC2KW51 (scsi)
Disk /dev/sda: 512GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  512MB   511MB   fat16              boot, esp
 2      512MB   51.7GB  51.2GB  ext4
 3      51.7GB  512GB   460GB                store lvm

以上分区3将作为数据存储的LVM卷。对于修改系统磁盘 /dev/sda 分区,则建议重启一次操作系统以便刷新。或者通过 partprobe 刷新分区。

创建物理卷

  • 初始化物理卷:

    pvcreate /dev/sda3
    

备注

如果有多个设备,可以一起初始化,例如:

pvcreate /dev/sdd1 /dev/sde1 /dev/sdf1
  • 检查物理卷:

    pvdispaly
    

显示:

"/dev/sda3" is a new physical volume of "<428.78 GiB"
--- NEW Physical volume ---
PV Name               /dev/sda3
VG Name
PV Size               <428.78 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               HYPqoi-s2Ga-r2c9-upv6-Q3by-DFf3-NJe9BT

卷组管理

  • 在物理卷上构建卷组:

    vgcreate store /dev/sda3
    

备注

这里将卷组命名为 store

当物理卷用于创建卷组的时候,它的磁盘空间默认被划分为以4MB为单位的 extent 。这个 extent 是用于逻辑卷增长和缩减的最小大小。 extent 的数量不会影响逻辑卷的I/O性能。

  • 如果要扩展卷组,可以新的物理卷加入到卷组,例如,以下在卷组 vg1 中添加 /dev/sdf1 物理卷来扩展卷组的大小:

    vgextend vg1 /dev/sdf1
    

逻辑卷

  • store 卷组上创建 home 逻辑卷:

    lvcreate -L 100G -n home store
    
  • 检查逻辑卷 lvdisplay 显示如下:

    --- Logical volume ---
    LV Path                /dev/store/home
    LV Name                home
    VG Name                store
    LV UUID                gIwomd-B9x2-MRNP-o2Jd-diqn-Tgji-N70rP4
    LV Write Access        read/write
    LV Creation host, time zcloud, 2019-10-05 23:02:59 +0800
    LV Status              available
    # open                 0
    LV Size                100.00 GiB
    Current LE             25600
    Segments               1
    Allocation             inherit
    Read ahead sectors     auto
    - currently set to     256
    Block device           254:0
    
  • 同样再创建一个用于libvirt的逻辑卷,一个用于docker的逻辑卷,一个用于docker容器和虚拟机等共享的存储:

    lvcreate -L 128G -n libvirt store
    lvcreate -L 128G -n docker store
    lvcreate -L 128G -n store store
    

备注

Docker 卷 是Docker持久化数据的存储共享卷,单独划分 store 存储,可以在这个存储下构建不同的隔离目录给Docker共享。

Docker支持quota可以用来限制容器可用空间,如果要强制隔离,则可以利用LVM卷来实现。

详细的 store 卷部署使用请参考 Docker 卷从Dockerfile构建Docker镜像 中配置Docker使用共享卷部分。

XFS

备注

详细XFS相关请参考 XFS文件系统XFS性能优化

  • 安装XFS管理工具 xfsprogs

    sudo pacman -S xfsprogs
    
  • 格式化LVM卷:

    mkfs.xfs /dev/store/home
    mkfs.xfs /dev/store/libvirt
    mkfs.xfs /dev/store/docker
    mkfs.xfs /dev/store/store
    

备注

Docker OverlayFS存储引擎 要求 xfs 文件系统启用 d_type=true 选项,也就是 xfs_info 检查文件系统输出信息中有 ftype=1 。现代XFS文件系统默认都启用了 ftype=1

  • 配置 /etc/fstab

    /dev/mapper/store-home  /home  xfs  defaults  0 1
    /dev/mapper/store-libvirt  /var/lib/libvirt  xfs  defaults  0 1
    /dev/mapper/store-docker  /var/lib/docker  xfs  defaults  0 1
    /dev/mapper/store-store  /store  xfs  defaults  0 1
    
  • 挂载目录(注意,请使用root用户的单用户状态登陆,避免普通用户登陆影响/home目录修改):

    mount /home
    mount /var/lib/libvirt
    mount /var/lib/docker
    mount /store
    

备注

实际我的操作是采用root用户登陆后,将上述两个XFS文件系统先挂载到临时目录下,将数据迁移到新建的XFS文件系统中,然后再切换目录挂载来完成的。请参考 在Studio中使用btrfs文件系统 中切换 libvirt 目录到btrfs文件系统步骤。

参考