使用MinIO部署一个网络文件系统(NFS)

  一直以来服务器的文件存储一直是个问题,尤其是最近面对大模型训练和微调的需求,单节点的存储就不太够用了,因此在下载Laion5B这种超大规模数据集之前需要一个文件存储系统来保存数据集,而NFS(Network File System)就是一个很好的选择,鉴于别人的推荐,使用了MinIO来部署NFS,虽然MinIO本身不是NFS系统,但是通过S3映射等操作,可以实现NFS的功能,本博客就介绍整个安装过程。

  以下所有过程均在Ubuntu 20.04系统下完成,同样的逻辑适合于其他系统,但是操作可能有所不同。

准备工作

格式化磁盘并自动挂载:

  首先需要将搭建NFS所用到的磁盘进行格式化,并将其挂载到系统中,如果是单机多块盘也是类似的操作。

# 通过fdisk -l命令查看磁盘信息,可以看到磁盘是/dev/sdb,/dev/sdc等,正常情况下,/dev/sda是系统盘,/dev/sdb及其之后的盘是数据盘,搭建MinIO用的就是后面的数据盘。
sudo fdisk -l

# 格式化磁盘,这里以两块数据盘/dev/sdb和/dev/sdc为例:
sudo mkfs.ext4 /dev/sdb
sudo mkfs.ext4 /dev/sdc

# 创建挂载目录, 注意这里的/MinIO目录需要和后面MinIO的工作目录一致,所以建议创建一个MinIO的工作目录/MinIO, 然后在该文件夹下创建所有的挂载目录:
sudo mkdir /MinIO/data1
sudo mkdir /MinIO/data2

# 获取磁盘UUID:
sudo blkid
# 显示信息如下:
/dev/sdb: UUID="xxxxx" TYPE="ext4"
/dev/sdc: UUID="xxxxx" TYPE="ext4"

# 挂载磁盘: 这里我们用修改系统挂载文件的方式来实现挂载,如果是手动挂载,重启系统后可能无法自动挂载
sudo vim /etc/fstab
# 在/etc/fstab文件末尾添加如下内容,其中UUID为上面获取到的磁盘UUID:
UUID="xxxxx" /MinIO/data1 ext4 defaults 0 0
UUID="xxxxx" /MinIO/data2 ext4 defaults 0 0


# 保存并退出,然后执行以下命令使修改生效:
sudo mount -a

服务器间的时间同步:

  以三台服务器(lab1:192.168.1.100, lab2:192.168.1.101, lab3:192.168.1.102)为例,需要进行三台服务器间的时间同步工作:

# 在全部服务器上安装ntp和ntpdate包:
sudo apt-get update
sudo apt-get install ntp ntpdate

# 在lab1服务器上完成同步时间设置,其他两台机器将同步这台机器的时间:
# 修改lab1服务器的/etc/ntp.conf文件,添加如下内容:
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0
fudge 127.127.1.0 stratum 10

# 最后在其他两台服务器lab2和lab3上关闭时间同步,再同步lab1的时间
sudo service ntp stop
sudo ntpdate 192.168.1.100
# 将同步时间命令放在crontab中,每天早上8点同步一次:
sudo crontab -e
# 在crontab文件末尾添加如下内容:
0 8 * * * sudo ntpdate 192.168.1.100

配置服务器的hosts文件:

  配置三台服务器之间的hosts,方便后续使用:

# 在lab1, lab2, lab3服务器上编辑/etc/hosts文件,添加如下内容:
192.168.1.100 lab1
192.168.1.101 lab2
192.168.1.102 lab3

关闭服务器防火墙:

  关闭服务器防火墙,允许NFS的通信:

# 在三台服务器上关闭防火墙:
sudo ufw disable

服务器上设置打开文件的数量限制:

  设置服务器上打开文件的数量限制,避免出现“Too many open files”错误:

# 在三台服务器上修改/etc/security/limits.conf文件,添加如下内容:
*    - nofile 65535
root - nofile 65535

安装并配置MinIO

安装MinIO

  安装MinIO的过程比较简单,可以直接参考MinIO安装的官方文档, 需要注意的是所有搭建MinIO的服务器都需要安装MinIO,即需要在lab1, lab2, lab3服务器上都安装MinIO。

# 下载MinIO安装包:
wget https://dl.min.io/server/minio/release/linux-amd64/minio

# 赋予执行权限:
sudo chmod +x minio

# 移动到/usr/local/bin目录下:
sudo mv minio /usr/local/bin

# 创建MinIO的工作目录, 注意这里和前面的挂载目录的位置是一致的:
sudo mkdir /MinIO

配置MinIO

  这部分设置可能会存在问题,由于MinIO需要在几台服务器上共同启动,然而其等待其他服务器启动时,会导致MinIO的服务报错直接中断,因此这里提供两种配置和启动的方法:(1)比较简单的是第一种,也是本人目前采用的方式,通过Tmux将MinIO服务在后台启动,同时也可以随时切到Tmux的窗口进行查看;(2)将MinIO配置成一个启动服务,方便开机自动启动,但是笔者尝试这种方法面临前面说的问题,所以没有成功。

通过Tmux启动MinIO:

  通过Tmux将MinIO服务在后台启动,可以随时切到Tmux的窗口进行查看,也可以通过命令行查看MinIO的运行日志。

# 安装Tmux:
sudo apt-get install tmux

# 创建Tmux窗口:
tmux new -s minio

# 配置MinIO的存储卷,这里是创建了一个专用环境变量配置文件的,也可以直接创建在profile或者.bashrc文件中:
sudo vim /etc/default/minio
# 将以下内容写入到/det/defalut/minio文件中:
# MINIO_VOLUMES变量更改说名:本示例使用3台服务器,每台服务器分2个磁盘供minio服务使用,所有这里要把所有节点使用的所有数据目录都写上
MINIO_VOLUMES="http://192.168.1.100:9000/MinIO/data1 http://192.168.1.100:9000/MinIO/data2 http://192.168.1.101:9000/MinIO/data1 http://192.168.1.101:9000/MinIO/data2 http://192.168.1.102:9000/MinIO/data1 http://192.168.1.102:9000/MinIO/data2"
MINIO_OPTS="--console-address :9001"    #minio服务监听端口号
MINIO_ROOT_USER=minioadmin     #minio网页端的登录账号
MINIO_ROOT_PASSWORD=minioadmin      #minio网页端的登录密码
MINIO_PROMETHEUS_AUTH_TYPE="public"
# MINIO_PROMETHEUS_URL="http://192.168.10.148:9090"     #配置prometheus监控的服务器地址
# MINIO_SERVER_URL="http://192.168.192.163:9000"       #负载均衡地址,没有负载均衡就不要放开注释

# 激活环境变量:
source /etc/default/minio

# 在Tmux窗口中启动MinIO服务:
minio server $MINIO_OPTS $MINIO_VOLUMES

# 退出Tmux窗口:
Ctrl+b d
通过系统服务方式启动MinIO:

  将MinIO配置成一个启动服务,方便开机自动启动,但是笔者尝试这种方法面临前面说的问题,所以没有成功。

# 创建环境变量文件同前面的方法一致,这里不再赘述。将所需的环境变量写入到/det/defalut/minio文件中

# 创建服务的系统管理文件:
sudo vim /etc/systemd/system/minio.service
# 写入以下内容:
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local

User=root
Group=root
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

Restart=always

LimitNOFILE=65536

TasksMax=infinity

TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# 将该服务设置为开机启动并且启动该服务:
sudo systemctl enable minio --now

查看并使用MinIO:

  启动MinIO服务后,可以通过浏览器访问http://服务器IP:9000,输入MinIO的登录账号和密码,即可访问MinIO的网页端,可以上传、下载、管理文件。

  本博客上述内容均是MinIO基本配置的过程,其他还有一些监控和更多的控制配置,并没有进行配置,例如Prometheus监控和MinIO的客户端mc的使用等,如果需要这些功能可能需要进一步进行配置。

将MinIO映射到NFS

  由于配置了MinIO之后,只能通过同步MinIO或者通过mc交互来上传和下载MinIO的数据,和我们最初搭建NFS服务的想法相悖,因此搭建好MinIO之后,还需要进一步将其映射为NFS,方便计算节点访问数据和使用这部分存储。

# 在MinIO创建Access Keys,可以通过访问MinIO的网页(http://服务器IP:9000)来创建:
# 点击左侧的"Access Keys",然后点击"Create Access Key"按钮,创建新的Access Key和Secret Key
# 这里我们假定创建了一个名为"admin"的Access Key,其对应的Secret Key为"miniotest"

# 在计算节点服务器上安装fuse和s3fs工具:
sudo apt update
sudo apt install fuse s3fs

# 创建存储凭证文件:
echo "admin:miniotest" > ~/.passwd-s3fs
chmod 600 ~/.passwd-s3fs

# 创建本地目录,用于挂载MinIO的存储桶:
mkdir /home/minio-mount

# 挂载MinIO的存储桶:
# allow_other: 允许其它用户操作
# umask=000,实际上就是权限为777
# bucket名为bucket1,这个桶需要在MinIO(http://服务器IP:9000)中手动创建
s3fs -o passwd_file=$HOME/.passwd-s3fs -o url=http://192.168.1.100:9000 -o allow_other -o nonempty -o no_check_certificate -o use_path_request_style -o umask=000 bucket1 /home/minio-mount

# 查看挂载情况:
df -h
# 如果显示/home/minio-mount已挂载,则表示挂载成功

# 测试写入速度,通过写入1G左右的文件来测试最终MinIO的写入速度,在校园网这种环境下,非同一机房,写入速度大概能达到50M/s,当然这个速度和具体的设备和网络环境有关系,这里只是作为参考:
dd if=/dev/random of=/home/minio-mount/test.bin bs=1M count=1000

  至此,MinIO已经部署完成,同时将其映射到了计算节点的/home/minio-mount目录下,可以方便计算节点访问MinIO的数据,向这个目录写入或者读取均是向MinIO文件存储服务器写入和读取。享受超大存储带来的愉悦吧!!!


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以其他方式联系。

💰

×

Help us with donation