2

GlusterFS 部署简记

 3 years ago
source link: https://blog.eastonman.com/blog/2020/12/glusterfs/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

GlusterFS 部署简记

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

本文从实验性的角度阐述在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的原因之一。

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

Reference

浏览量: 230

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK