GlusterFS 部署简记

本文从实验性的角度阐述在Debian 10 (Buster) 上部署Gluster FS的过程,力求步骤简便,能够由一个人很快地完成。为了达到这个目的,本文尽量使用Debian官方repo中的包,避免编译,并使用ansible统一执行命令。

预计阅读时间: 9 分钟

本文从实验性的角度阐述在Debian 10 (Buster) 上部署Gluster FS的过程,力求步骤简便,能够由一个人很快地完成。为了达到这个目的,本文尽量使用Debian官方repo中的包,避免编译,并使用ansible统一执行命令。

开始之前

什么是Gluster FS

摘录一段GlusterFS官网的介绍。

Gluster is a free and open-source scalable network filesystem

Gluster is a scalable network filesystem. Using common off-the-shelf hardware, you can create large, distributed storage solutions for media streaming, data analysis, and other data- and bandwidth-intensive tasks. Gluster is free.

Gluster | Storage for your cloud

这段介绍的大意是:GlusterFS是一个分布式的文件系统,是一个网络文件系统,适合在数据和带宽密集型应用中使用。

我认为GlusterFS除了以上描述中的场景,还适用于HPC集群的场景下。相较于HPC领域传统的Lustre和BeeGFS之类的文件系统,GlusterFS具有以下优势:

  • 持续的维护更新(我认为这一点最为重要)。像Lustre这样应用广泛的HPC基础设施,竟然维护者几经转换,社区十分混乱,虽然仍有持续的更新,但是这样的项目状态实在难以称之为优秀的项目。
  • 优秀的生态。开源社区对GlusterFS的大量关注使得它拥有数量众多的资料、文章,各大Linux发行版也都有官方的预编译包。
  • 相对优秀的性能。虽然没有做过对比测试,但是GlusterFS在其他应用场景下表现出的性能十分的不俗,相信在HPC这样的计算密集型应用场景下也应当有不错的表现。
  • 使用FUSE挂载。另一个我觉得相对优势巨大的特性是GlusterFS的挂载方式是基于FUSE的,也就是在用户空间挂载,相较于Lustre需要重新编译内核或者使用dkms,GlusterFS的挂载方式无疑提供了更高的解耦合,更加利于故障恢复之类的情况。

基本概念

  • Brick: 存储的基本单元,类似于Linux上块设备(block device)的概念
  • Volume: 卷是bricks的逻辑集合,类似于LVM中的Volume
  • GFID: 每个GlusterFS中的文件或者目录都有一个128bit的数字标识称为GFID
  • glusterd: Gluster的管理守护进程,需要运行在所有的提供Volume的服务器上
  • glusterfsd: 用于挂载GlusterFS Volume的守护进程
  • Namespace: 名称空间是被创建的一个抽象容器或环境用来保存唯一标识符号
  • Quorum: 设置一个可信的存储池中最多失效的主机节点数量
  • Quota: 允许通过目录或者卷设置对磁盘空间使用的限制
  • Distributed: 分布卷
  • Replicated: 副本卷
  • Distributed Replicated: 分布式复制卷
  • Geo-Replication: 异地备份为站点通过局域网、广域网、互联网提供一个连续的异步的和增量复制服务
  • Metedata: 元数据定义为关于数据的数据描述信息,GlusterFS没有专门区分元数据的存储
  • Extended Attributes: 扩展属性是文件系统的一个特性
  • FUSE: 用户空间的文件系统是一个用于类Unix操作系统的可加载内核模块,以允许非特权用户在使用内核代码的情况下创建自己的文件系统。实现了在用户空间下运行文件系统代码

Ansible

本次安装会使用到Ansible,Ansible是一个强大的工具,有关信息参见Ansible官网,此处就不赘述了。

安装GlusterFS

按照官方的教程,第一步是添加APT源的公钥

wget -O - https://download.gluster.org/pub/gluster/glusterfs/LATEST/rsa.pub | apt-key add -

但是实际操作时这个LATEST需要被替换为实际上的最新大版本号,比如撰写事最新的版本是8,于是实际执行的命令是:

ansible all -m shell -a "wget -O - https://download.gluster.org/pub/gluster/glusterfs/LATEST/rsa.pub | apt-key add -" --become

接下来是添加APT源

ansible -m shell -a "echo deb https://download.gluster.org/pub/gluster/glusterfs/LATEST/Debian/10/amd64/apt buster main > /etc/apt/sources.list.d/gluster.list" --become

然后就可以安装了。由于我的情况是在四台机器都同时作为服务端和客户端,于是直接全部都安装。

ansible -m shell -a "apt update; apt-get install -y glusterfs-server glusterfs-cli" --become

在我的环境中安装完成后会自动运行glusterd并加入systemd开机自启,至此我们已经安装完全部的软件了。接下来就是配置。

构建集群

在任意节点上运行

sudo gluster peer probe <another node hostname>

就可以将两个节点构成集群,这个peer probe理论上是双向的,也就是无需在另一台节点上再执行一遍。但是有一点需要注意,这些节点需要提前配置好hostname和hosts文件,使得它们之间均可以使用hostname互访。当然配置一个dns也是可以的,不过就不在本文的讨论范围内了。

使用gluster peer status可以查看此时的集群情况。以下是我的环境中执行的情况。注意,此时的Connected仅代表单向的联通,如果没有提前配置好hostname的话需要注意其它机器的可访问情况。否则创建Volume的时候将会出错。

easton@main:~$ sudo gluster peer status
Number of Peers: 3

Hostname: node3
Uuid: 24460b94-03a2-48ea-ab29-ec2cbdd2a008
State: Peer in Cluster (Connected)

Hostname: node1
Uuid: e079d8e3-5972-4801-9525-04f8050b9b6f
State: Peer in Cluster (Connected)

Hostname: node2
Uuid: 84074def-a277-469b-942c-19963113b0c4
State: Peer in Cluster (Connected)

创建Volume

GlusterFS中Volume支持许多Brick的组合方式,类似于RAID中的RAID0、RAID1、RAID10等概念,但是不支持RAID5或者ZFS中RAIDZ之类的方式。

此处我们直接创建一个4个副本的镜像卷

sudo gluster volume create <volume name> replica 4 main{1..3}:/data/gluster main:/data/gluster

Gluster CLI 支持展开{n..m}这样的写法。如果之前创建过同样名字的Volume但是错误了,此时将无法重新创建,添加force参数可以解决此问题。

创建完的Volume需要Start才能够被挂载

sudo gluster volume <volume name> start

使用gluster volume info可以查看Volume的信息。

easton@main:~$ sudo gluster volume info

Volume Name: home
Type: Replicate
Volume ID: 73fa38da-a3f9-4a97-838b-352fd7b7ff9a
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: node1:/data/gluster
Brick2: node2:/data/gluster
Brick3: node3:/data/gluster
Brick4: main:/data/gluster
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

挂载GlusterFS

挂载GlusterFS十分的简单

sudo mount -t glusterfs <server hostname>:/<volume name> <mount point>

对于我来说是这样的

sudo mount -t glusterfs main:/home /mnt/home

GlusterFS还提供NFS挂载的支持。但是由于NFS不支持InfiniBand之类的RDMA技术,在HPC领域很少使用,于是不推荐使用NFS挂载。

此时我们可以制造一些故障检验GlusterFS的可靠性,比如我们把main服务器关闭以后,在node3节点依然可以正常访问文件,对文件的修改也在main服务器上线后同步到了main的目录下。

有一点值得注意的是,在main服务器关闭后三个node花费了相当长的一段时间(5-10秒)才确认main服务器下线并选举出新的主服务器,这在某些即时性要求较高的商业应用场景下是比较大的问题,但是在HPC场景下我认为这不是一个特别大的问题。

后记

此次安装GlusterFS起因是需要因陋就简地在实验室搭建一个集群供测试使用,搭建前也进行了分布式文件系统的调研,最终选择了GlusterFS,原因见以上GlusterFS的优势部分。

GlusterFS的安装可以说是相当方便了,加上前期的调研和安装操作系统,总共花去了我4-5个小时的时间,如果采用传统的Lustre方案,只能使用CentOS作为宿主操作系统,因为在别的发行版中Lustre都从内核中移除了,从4.xx开始就被Kernel移除了,理由是“糟糕的代码“,这也是我抛弃Lustre的原因之一。

后记2

在使用中发现GlusterFS并未区分元数据的设计导致执行各种目录操作极为耗时,小文件操作性能也很差,如果在GlusterFS上执行./configure可能永远也执行不完😂。后来我把集群上家目录的文件系统更换成了BeeGFS,解决了这个架构问题。

Reference

Easton Man
Easton Man
文章: 37

一条评论

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注