XFS文件系统快速起步

安装和修复XFS

  • 安装XFS管理工具 xfsprogs

    sudo pacman -S xfsprogs
    
  • 如果需要修复XFS文件系统,需要先umount之后再修复:

    umount /dev/sda3
    xfs_repair -v /dev/sda3
    

XFS在线元数据检验(scrub)

警告

XFS的scrub可以用来检验元数据,但是这是一个试验性质程序。

xfs_scrub 会查询内核有有关XFS文件系统所有元数据独爱想。元数据记录被扫描检查明显损坏值然后交叉应用另一个元数据。目的是通过检查单个元数据记录相对于文件系统中其他元数据的一致性来建立对整个文件系统一致性的合理信心。如果存在完整的冗余数据结构,则可以从其他元数据重建损坏的元数据。

通过启动和激活 xfs_scrub_all.timer 来周期性检查在线XFS文件系统的元数据。

XFS元数据校验

xfsprogs 3.2.0引入了一个磁盘格式v5包含了元数据校验和机制,称为”自描述元数据”(Self-Describing Metadata),基于CRC32,提供了对于元数据的附加保护,避免电源故障时发生意外。从xfsprogs 3.2.3开始默认激活了校验,不过对于比较旧哦内核,可以通过 -m crc=0 关闭校验:

mkfs.xfs -m crc=0 /dev/target_partition

XFS性能

在RAID设备上使用XFS时候,有可能通过使用 largeio , swalloc 参数值增加来提高性能。参考:

备注

MarkLogic Server是面向文档的No-SQL数据库,上文提供了XFS优化策略可以参考实践。

XFS条带大小和宽度

如果文件系统建立在条代化的RAID之上,通过 mkfs.xfs 命令参数设置特定条带大小可以显著提升性能。XFS有时能够检查出底层软RAID的分布,但是对于硬件RAID,请参考 how to calculate the correct sunit,swidth values for optimal performance

XFS案例

以下案例在LVM上创建XFS文件系统

  • 创建GPT分区:

parted -s /dev/nvme0n1 mklabel gpt
parted -s -a optimal /dev/nvme0n1 mkpart primary 0% 100%
parted -s /dev/nvme0n1 set 1 lvm on
parted -s /dev/nvme0n1 name 1 db_data

如果有多个NVMe磁盘,依次执行:

多个磁盘分区
for i in {0..2};do
    parted -s /dev/nvme0n${i} mklabel gpt
    parted -s -a optimal /dev/nvmd0n${i} mkpart primary 0% 100%
    parted -s /dev/nvmd0n${i} set 1 lvm on
    parted -s /dev/nvmd0n${i} name 1 db_data
done
  • 完成后检查磁盘:

    lsblk
    

输出类似:

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0  3.5T  0 disk
└─nvme0n1p1 259:2    0  3.5T  0 part
nvme0n2     259:0    0  3.5T  0 disk
└─nvme0n2p1 259:2    0  3.5T  0 part
nvme0n3     259:0    0  3.5T  0 disk
└─nvme0n3p1 259:2    0  3.5T  0 part
...
  • 创建逻辑卷:

创建条代化LVM卷
pvcreate /dev/nvme0n{0..2}p1
vgcreate vg_db /dev/nvme0n{0..2}p1

lvcreate -n vl_log -l 10%FREE -i 3 -I 128k vg_db
lvcreate -n vl_data -l 100%FREE -i 3 -I 128k vg_db

说明:

  • -i 3 表示使用3块磁盘作为volume group,这样条带化会分布到3个磁盘上

  • -I 128k 表示使用 128k 作为条带化大小,也可以使用单纯数字 128 默认单位就是 k

  • -l 表示扩展百分比,这里采用了 10%FREE100%FREE 表示空闲空间的10%和100% ; 另外一种常用的扩展大小表示是使用 -L 参数,则直接表示扩展多少容量,例如 -L 10G 表示扩展 10GB 空间

备注

Striped Logical Volume in Logical volume management (LVM) 提供了一个条带化LVM卷的构建案例,我在后续LVM实践案例中将参考。

  • 创建文件系统:

    mkfs.xfs -n ftype=1 /dev/vg_db/vl_log
    mkfs.xfs -n ftype=1 /dev/vg_db/vl_data
    

说明:

-n ftype=1 是XFS在overlay文件系统时候存储附加元数据时候必须使用的,这个参数在 RHEL 7.4 之后XFS模式激活 ftype=1 ,详情参考RHEL 7文档,在 Docker installation on RHEL 7.2 and file system requirement 可以看到,docker容器要求XFS格式化成 fytpe=1 才能正常用于 /var/lib/docker 正常工作。

  • 创建挂载配置:

    echo "/dev/vgdb/log    /dbdata/log   xfs defaults,noatime,nodiratime,PeepOpenquota 0 0" >> /etc/fstab
    echo "/dev/vgdb/data   /dbdata/data  xfs defaults,noatime,nodiratime,PeepOpenquota 0 0" >> /etc/fstab
    
  • 挂载目录:

    mkdir -p /dbdata/{log,data}
    mount -a
    

参考