为GlusterFS部署准备CentOS环境

CentOS目前依然是生产环境中常用的操作系统,虽然由于 RedHat Linux 产品策略变化,CentOS已经不再作为Red Hat Enterprise Linux的下游产品,而是作为上游产品的滚动(stream)版本,稳定性和可靠性有所下降。目前很多遗留生产环境依然在使用CentOS 7系列,这里我将实践部署的完整过程。

说明

准备

存储文件系统

磁盘存储是Gluster的基础:

项目实践采用了每个服务器 12 块 NVMe存储 磁盘

  • 使用 fdisk -l 可以检查磁盘( NVMe存储 部分 ):

fdisk -l 检查 NVMe存储 信息部分( nvme0n1 )
Disk /dev/nvme0n1: 3840.0 GB, 3840000000512 bytes, 7500000001 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt
Disk identifier: 5C0E8F1E-1C1A-4144-BA57-74D5E87390FC


#         Start          End    Size  Type            Name
  • 可以手工命令在每台服务器,对每个NVME磁盘进行分区并构建 XFS文件系统 :

命令行 NVMe存储 分区并格式化成 XFS文件系统 文件系统(这里仅展示 nvme0n1 ,实际需要对12块磁盘重复完成上述操作)
parted -a optimal /dev/nvme0n1 mkpart primary 0% 100%
parted -a optimal /dev/nvme0n1 name 1 gluster_brick0
mkfs.xfs -i size=512 /dev/nvme0n1

备注

参数解析:

  • -a optimal 可以通过 parted 的自动4k对齐,这个参数非常重要,可以避免4k没有对齐对存储性能的影响

  • parted 的命令 mkpart primary 0% 100% 可以将磁盘整个创建一个主分区

  • parted 的命令 name 1 gluster_brick0 是将分区命名成gluster相关

  • mkfs.xfs -i size=512 格式化XFS文件系统

警告

mkfs.xfs``(从 ``xfsprogs 3.2.4 版开始)默认创建的XFS superblock v5版本,不兼容于 RHEL 7/CentOS 7 的3.10内核,需要在格式化时候增加 -m crc=0,finobt=0 来强制格式化成 XFS superblock v4。详见 xfs内核不兼容处理

  • 由于手工对一块块磁盘分区和格式化非常繁琐,所有可以准备一个脚本 parted_xfs.sh 脚本:

对12块 NVMe存储 批量进行分区和格式化xfs的脚本 parted_xfs.sh
for i in {0..11};do
    if [ ! -d /data/brick${i} ];then mkdir -p /data/brick${i};fi
    parted -s -a optimal /dev/nvme${i}n1 mklabel gpt
    # 如果随机遇到以下报错,显示磁盘设备busy无法分区,则添加sleep 1避免上一个parted命令还没处理完就发起下一个parted
    # Error: Error informing the kernel about modifications to partition /dev/nvme1n1p1 -- Device or resource busy.  This means Linux won't know about any changes you made to /dev/nvme1n1p1 until you reboot -- so you shouldn't mount it or use it in any way before rebooting.
    # Error: Failed to add partition 1 (Device or resource busy)
    sleep 1
    parted -s -a optimal /dev/nvme${i}n1 mkpart primary xfs 0% 100%
    parted -s -a optimal /dev/nvme${i}n1 name 1 gluster_brick${i}
    sleep 1
    mkfs.xfs -f -i size=512 /dev/nvme${i}n1p1
    # 如果内核版本低于3.16,则只支持 xfs superblock v4
    # mkfs.xfs (xfsprogs 3.2.4 )默认格式化是 superblock v5,需要增加 -m crc=0,finobt=0 来格式化成 xfs superblock v4:
    # mkfs.xfs -f -i size=512 -m crc=0,finobt=0 /dev/nvme${i}n1p1
    fstab_line=`grep "/dev/nvme${i}n1p1" /etc/fstab`
    if [ ! -n "$fstab_line"  ];then echo "/dev/nvme${i}n1p1 /data/brick${i} xfs rw,inode64,noatime,nouuid 1 2" >> /etc/fstab;fi
    mount /data/brick${i}
done

通过 pssh - 并行SSH 分发到各个服务器上执行,就可以获得12块分区、格式化和挂载一气呵成的GlusterFS磁盘文件系统:

通过 pssh - 并行SSH 批量完成分区、格式化和挂载
pscp -h hosts parted_xfs.sh /tmp/parted_xfs.sh

pssh -ih hosts /tmp/parted_xfs.sh
  • 完成后在服务器上检查 df -h 可以看到12块已经格式化好 XFS文件系统 并挂载好的磁盘:

分区和格式化、挂载好的12块磁盘的文件系统
Filesystem       Size  Used Avail Use% Mounted on
devtmpfs          63G     0   63G   0% /dev
tmpfs             63G   66M   63G   1% /dev/shm
tmpfs             63G  2.2M   63G   1% /run
tmpfs             63G     0   63G   0% /sys/fs/cgroup
/dev/sda3         49G   21G   27G  44% /
/dev/sda5        167G  1.4G  157G   1% /home
/dev/sda2        976M  181M  728M  20% /boot
/dev/nvme0n1p1   3.5T  3.7G  3.5T   1% /data/brick0
/dev/nvme1n1p1   3.5T  3.7G  3.5T   1% /data/brick1
/dev/nvme2n1p1   3.5T  3.7G  3.5T   1% /data/brick2
/dev/nvme3n1p1   3.5T  3.7G  3.5T   1% /data/brick3
/dev/nvme4n1p1   3.5T  3.7G  3.5T   1% /data/brick4
/dev/nvme5n1p1   3.5T  3.7G  3.5T   1% /data/brick5
/dev/nvme6n1p1   3.5T  3.7G  3.5T   1% /data/brick6
/dev/nvme7n1p1   3.5T  3.7G  3.5T   1% /data/brick7
/dev/nvme8n1p1   3.5T  3.7G  3.5T   1% /data/brick8
/dev/nvme9n1p1   3.5T  3.7G  3.5T   1% /data/brick9
/dev/nvme10n1p1  3.5T  3.7G  3.5T   1% /data/brick10
/dev/nvme11n1p1  3.5T  3.7G  3.5T   1% /data/brick11

wrong fs type, bad option, bad superblock

这里我遇到一个错误, mkfs.xfs 顺利完成,但是挂载报错:

挂载XFS文件系统报错 wrong fs type, bad option, bad superblock
mount: wrong fs type, bad option, bad superblock on /dev/nvme0n1p1,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

解决方法见 xfs内核不兼容处理 (上文格式化脚本已经修订)