Lustre集群部署-基于zfs的多机集群

1. 前言

本文详细介绍如何在almalinux8.9上联网部署基于zfs的lustre主备模式的多机集群。系统环境如下:

lustre:         2.15.4
linux os:       almalinux 8.9
linux kernel:   4.18.0-513.5.1.el8_9.x86_64

   

2. 集群规划

mgt      192.168.3.11:192.168.3.12
mdt0     192.168.3.11:192.168.3.12
ost0     192.168.3.11:192.168.3.12
client   192.168.3.13

   

3. 系统设置

该部分服务端和客户端都需要设置。

3.1. 防火墙设置

3.1.1. 关闭防火墙

systemctl stop firewalld.service
systemctl disable firewalld.service

3.2. selinux设置

3.2.1. 关闭selinux

sed -i.org 's|SELINUX=enforcing|SELINUX=disabled|g' /etc/selinux/config

3.2.2. 重启机器

reboot

3.2.3. 检查selinux状态

getenforce

如果输出结果是disabled,表明selinux已经关闭。

3.3. yum源配置

3.3.1. 添加Lustre yum源

/etc/yum.repos.d目录下新增lustre-online.repo文件并添加以下内容:

[lustre-server-2.15.4]
name=Lustre Server v2.15.4 Packages
baseurl=https://downloads.whamcloud.com/public/lustre/lustre-2.15.4/el8.9/server/
enabled=1
gpgcheck=0

[lustre-client-2.15.4]
name=Lustre Client v2.15.4 Packages
baseurl=https://downloads.whamcloud.com/public/lustre/lustre-2.15.4/el8.9/client/
enabled=0
gpgcheck=0

[e2fsprogs-1.47.0.wc5]
name=e2fsprogs v1.47.0.wc5 Packages
baseurl=https://downloads.whamcloud.com/public/e2fsprogs/1.47.0.wc5/el8/
enabled=0
gpgcheck=0

Lustre server和Lustre client的yum源不能同时打开,rpm包会产生冲突。所以在服务端和客户端安装软件时,需要按需关闭相应的yum源。

3.3.2. 添加epel yum源

/etc/yum.repos.d目录下新增epel-online.repo文件并添加以下内容:

[epel]
name=Extra Packages for Enterprise Linux 8 - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/$basearch
enabled=1
priority=3
gpgcheck=0
countme=1

   

4. 安装软件

因为Lustre是内核态文件系统,所有的软件包都需要与编译时的kernel版本匹配。Lustre提供2种安装方式:dkmskmod

dkms方式安装后会依据当前kernel版本执行编译操作,编译出针对当前kernel版本的kmod,这种方式的好处在于可以在任何kernel版本上动态编译和安装。但是坏处也很明显,因为需要编译,所以安装起来可能很慢。而kmod方式是已经提前编译好的kmod,但这种方式只与当时编译时的kernel版本适配。

Lustre官方rpm仓库只提供了zfs的dkms rpm包,没有提供zfs的kmod rpm包。而关于Lustre的rpm包既有dkms rpm包,也有kmod rpm包。所以如果采用kmod方式安装,则需要自行编译zfs。下文以kmod方式安装zfs和lustre步骤。

4.1. 服务端

4.1.1. 启动和关闭相应的YUM源

dnf config-manager --enable appstream baseos extras epel
dnf config-manager --enable lustre-server-2.15.4
dnf config-manager --disable lustre-client-2.15.4 e2fsprogs-1.47.0.wc5
dnf clean all && dnf makecache

4.1.2. 查看Lustre的依赖版本

Lustre的每个发布版本的源码文件ChangeLog中都会说明所发行软件的版本以及依赖的软件版本信息,通过2.15.4的ChangeLog文件可以查看到如下版本信息:

* Server primary kernels built and tested during release cycle:
  4.18.0-513.9.1.el8   (RHEL8.9)
* ldiskfs needs an ldiskfs patch series for that kernel, ZFS does not
* Client primary kernels built and tested during release cycle:
  4.18.0-513.9.1.el8   (RHEL8.9)
* Recommended e2fsprogs version: 1.47.0-wc5 or newer
* Recommended ZFS version: 2.1.11

由此可以得知,Lustre 2.15.4依赖kernel 4.18.0-513.9.1.el8e2fsprogs 1.47.0-wc5ZFS 2.1.11

4.1.3. 安装kernel

kernel 4.18.0-513.9.1.el8是almalinux 8.9系统默认的内核版本,理论上是不需要再重新安装kernel的,如果因为某些原因导致内核版本不一致,可以通过以下命令重新安装内核。

dnf install --allowerasing kernel-`uname -r` kernel-modules-`uname -r` kernel-tools-`uname -r` kernel-core-`uname -r`

4.1.4. 安装zfs

kmod方式安装的zfs需要自行编译源码,openzfs提供了关于zfs详细文档,详细内容参考https://openzfs.github.io/openzfs-docs,本文不再介绍如何编译,并且假设已经提前编译好了,然后执行以下命令安装。

dnf localinstall kmod-zfs libzfs5 libzpool5 zfs

4.1.5. 安装lustre

dnf install kmod-lustre kmod-lustre-osd-zfs lustre lustre-osd-zfs-mount

4.2. 客户端

4.2.1. 启动和关闭相应的YUM源

dnf config-manager --enable appstream baseos extras epel
dnf config-manager --enable lustre-client-2.15.4
dnf config-manager --disable lustre-server-2.15.4 e2fsprogs-1.47.0.wc5
dnf clean all && dnf makecache

4.2.2. 安装kernel

kernel 4.18.0-513.9.1.el8是almalinux 8.9系统默认的内核版本,理论上是不需要再重新安装kernel的,如果因为某些原因导致内核版本不一致,可以通过以下命令重新安装内核。

dnf install --allowerasing kernel-`uname -r` kernel-modules-`uname -r` kernel-tools-`uname -r` kernel-core-`uname -r`

4.2.3. 安装lustre

dnf install kmod-lustre-client lustre-client

   

5. 集群部署

5.1. 服务端

5.1.1. 加载zfs和lustre内核模块

modprobe -v zfs
modprobe -v lustre

5.1.2. 配置网络

lustre集群内部通过LNet网络通信,LNet支持InfiniBand and IP networks。本案例采用TCP模式。

5.1.2.1. 初始化配置lnet

lnetctl lnet configure

默认情况下lnetctl lnet configure会加载第一个up状态的网卡,所以一般情况下不需要再配置net,可以使用lnetctl net show命令列出所有的net配置信息,如果没有符合要求的net信息,需要按照下面步骤添加。

5.1.2.2. 添加tcp

lnetctl net add --net tcp --if enp0s8

如果lnetctl lnet configure已经将添加了tcp,使用lnetctl net del删除tcp,然后用lnetctl net add重新添加。

5.1.2.3. 查看添加的tcp

lnetctl net show --net tcp

5.1.2.4. 保存到配置文件

lnetctl net show --net tcp >> /etc/lnet.conf

5.1.2.5. 开机自启动lnet服务

systemctl enable lnet

注:所有的服务端都需要执行以上操作。

5.1.3. 部署MGS服务

5.1.3.1. 创建mgtpool

zpool create -f -O canmount=off -o multihost=on -o cachefile=none mgtpool /dev/sdb
  • 容灾模式下使用zpool创建pool时,必须要开启了multihost功能支持。multihost要求为每一个host提供不同的hostid,如果不提供,该命令执行失败。在每一个host上执行zgenhostid $(hostid)便可以生成不同的hostid。
  • 使用zpool创建pool池可以同时绑定多个磁盘,并采用raid0模式来存储数据。如果需要对pool扩容,必须使用zpool add添加磁盘到指定的pool中。

5.1.3.2. 创建mgt

mkfs.lustre --mgs \
--servicenode=192.168.3.11@tcp \
--servicenode=192.168.3.12@tcp \
--backfstype=zfs \
--reformat mgtpool/mgt

mgtpool/mgtmgtpool的一个逻辑卷,逻辑卷的数量和容量都是可以通过zfs命令控制。
servicenode参数指定当前创建的mgt能够在哪些节点上被使用(容灾)。该参数的数量没有限制。可以将多个servicenode参数合并成一个,比如上面的参数可以改写成--servicenode=192.168.3.11@tcp:192.168.3.12@tcp

5.1.3.3. 启动mgs服务

mkdir -p /lustre/mgt/mgt
mount -t lustre mgtpool/mgt /lustre/mgt/mgt -v

5.1.4. 部署MDS服务

5.1.4.1. 创建mdtpool

zpool create -f -O canmount=off -o multihost=on -o cachefile=none mdtpool /dev/sdc

5.1.4.2. 创建mdt

mkfs.lustre --mdt \
--fsname fs00 \
--index 0 \
--mgsnode 192.168.3.11@tcp \
--mgsnode 192.168.3.12@tcp \
--servicenode 192.168.3.11@tcp \
--servicenode 192.168.3.12@tcp \
--backfstype=zfs \
--reformat mdtpool/mdt0
  • 如果mgs服务有多个,必须要同时指定多个mgsnode,而且第一个mgsnode必须是primary mgs。
  • 对于每一个lustre文件系统,mdt index序号必须从0开始,0代表整个文件系统的根目录。
  • mdtpool/mdt0mdtpool的一个逻辑卷,使用mount挂载一个逻辑卷,表示启动一个mds服务。如果想要在同一个节点上启动多个mds,则需要在mdtpool中再申请一个逻辑卷,此时--reformat参数可以省略,--index必须递增。
  • 一个mds可以同时管理多个逻辑卷,只需要在--reformat参数后同时指定多个逻辑卷。

5.1.4.3. 启动mds服务

mkdir -p /lustre/mdt/mdt0
mount -t lustre mdtpool/mdt0 /lustre/mdt/mdt0 -v

5.1.5. 部署OSS服务

5.1.5.1. 创建ostpool

zpool create -f -O canmount=off -o multihost=on -o cachefile=none ostpool /dev/sdd

5.1.5.2. 创建ost

mkfs.lustre --ost \
--fsname fs00 \
--index 0 \
--mgsnode 192.168.3.11@tcp \
--mgsnode 192.168.3.12@tcp \
--servicenode 192.168.3.11@tcp \
--servicenode 192.168.3.12@tcp \
--backfstype=zfs \
--reformat ostpool/ost0

5.1.5.3. 启动oss服务

mkdir -p /lustre/ost/ost0
mount -t lustre ostpool/ost0 /lustre/ost/ost0 -v

   

5.2. 客户端

5.2.1. 加载lustre内核模块

modprobe -v lustre

5.2.2. 配置网络

lustre集群内部通过LNet网络通信,LNet支持InfiniBand and IP networks。本案例采用TCP模式。

5.2.2.1. 初始化配置lnet

lnetctl lnet configure

默认情况下lnetctl lnet configure会加载第一个up状态的网卡,所以一般情况下不需要再配置net,可以使用lnetctl net show命令列出所有的net配置信息,如果没有符合要求的net信息,需要按照下面步骤添加。

5.2.2.2. 添加tcp

lnetctl net add --net tcp --if enp0s8

如果lnetctl lnet configure已经将添加了tcp,使用lnetctl net del删除tcp,然后用lnetctl net add重新添加。

5.2.2.3. 查看添加的tcp

lnetctl net show --net tcp

5.2.2.4. 保存到配置文件

lnetctl net show --net tcp >> /etc/lnet.conf

5.2.2.5. 开机自启动lnet服务

systemctl enable lnet

注:所有的客户端都需要执行以上操作。

5.2.3. 挂载文件系统

mkdir -p /mnt/fs00
mount -t lustre 192.168.3.11@tcp:192.168.3.12@tcp:/fs00 /mnt/fs00 -v

   

6. 参考资料