为GlusterFS部署准备CentOS环境
CentOS目前依然是生产环境中常用的操作系统,虽然由于 RedHat Linux 产品策略变化,CentOS已经不再作为Red Hat Enterprise Linux的下游产品,而是作为上游产品的滚动(stream)版本,稳定性和可靠性有所下降。目前很多遗留生产环境依然在使用CentOS 7系列,这里我将实践部署的完整过程。
说明
根据 Gluster Community Packages 信息可以知道社区现在已经不再提供停止更新的CentOS 7系列的GlusterFS软件包,所以面对的第一个挑战就是自己 CentOS 7环境编译GlusterFS 11
准备
安装 pssh - 并行SSH 帮助批量执行命令
存储文件系统
磁盘存储是Gluster的基础:
Gluster是基于操作系统的文件系统构建的,底层需要构建一个文件系统
文件系统建议基于 Linux LVM逻辑卷管理 + XFS文件系统
Linux LVM逻辑卷管理 是非常轻薄的存储层,对性能几乎无影响,但是带来极大的存储管理灵活性: 可以实现存储磁盘空间在线扩容,以及存储快照(备份)
类似 Stratis - Linux存储系统 结合 Linux LVM逻辑卷管理 和 XFS文件系统 可以实现高级文件系统特性(类似 ZFS 和 Btrfs)
简化方案可以仅采用 XFS文件系统 构架一个架构清晰简洁的 GlusterFS 系统
项目实践采用了每个服务器 12 块 NVMe存储 磁盘
使用
fdisk -l
可以检查磁盘( NVMe存储 部分 ):
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文件系统 :
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
脚本:
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磁盘文件系统:
pscp -h hosts parted_xfs.sh /tmp/parted_xfs.sh
pssh -ih hosts /tmp/parted_xfs.sh
完成后在服务器上检查
df -h
可以看到12块已经格式化好 XFS文件系统 并挂载好的磁盘:
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
顺利完成,但是挂载报错:
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内核不兼容处理 (上文格式化脚本已经修订)