跳至内容

高可用 GlusterFS 集群

先决条件

  • 熟练使用命令行编辑器(本例中使用 vi
  • 对从命令行发出命令、查看日志和其他一般的系统管理员职责有很高的熟悉度
  • 所有命令都以 root 用户或 sudo 身份运行

简介

GlusterFS 是一个分布式文件系统。

它允许将海量数据分布存储在具有极高可用性的服务器集群中。

它由需要安装在服务器集群所有节点上的服务器端组成。

客户端可以通过 glusterfs 客户端或 mount 命令访问数据。

GlusterFS 可以有两种模式运行

  • 复制模式:集群中的每个节点都拥有所有数据。
  • 分布式模式:无数据冗余。如果存储发生故障,故障节点上的数据将丢失。

这两种模式可以结合使用,在拥有正确数量的服务器时提供一个复制且分布式的ファイルシステム。

数据存储在 brick 中。

Brick 是 GlusterFS 中存储的基本单位,由受信任存储池中服务器上的一个导出目录表示。

测试平台

我们虚构的平台包含两台服务器和一台客户端,全部为 Rocky Linux 服务器。

  • 节点 1:node1.cluster.local - 192.168.1.10
  • 节点 2:node2.cluster.local - 192.168.1.11
  • 客户端 1:client1.clients.local - 192.168.1.12

注意

确保集群服务器之间的带宽充足。

集群中的每台服务器都有第二个磁盘用于数据存储。

磁盘准备

我们将在集群的两台服务器上创建一个新的 LVM 逻辑卷,并将其挂载到 /data/glusterfs/vol0

sudo pvcreate /dev/sdb
sudo vgcreate vg_data /dev/sdb
sudo lvcreate -l 100%FREE -n lv_data vg_data
sudo mkfs.xfs /dev/vg_data/lv_data
sudo mkdir -p /data/glusterfs/volume1

注意

如果您的服务器上没有 LVM,请使用以下命令安装它。

sudo dnf install lvm2

现在我们可以将该逻辑卷添加到 /etc/fstab 文件中。

/dev/mapper/vg_data-lv_data /data/glusterfs/volume1        xfs     defaults        1 2

并挂载它。

sudo mount -a

由于数据存储在名为 brick 的子卷中,我们可以在这个新的数据空间中创建一个专用于它的目录。

sudo mkdir /data/glusterfs/volume1/brick0

安装

在编写本文档时,原始 CentOS Storage SIG 存储库已不再可用,而 RockyLinux 存储库尚未可用。

但是,我们将(暂时)使用存档版本。

首先,需要在两台服务器上添加 Gluster (版本 9) 的专用存储库。

sudo dnf install centos-release-gluster9

注意

稍后,当 Rocky 方面准备就绪后,我们可以更改此软件包的名称。

由于 repo 列表和 url 不再可用,让我们更改 /etc/yum.repos.d/CentOS-Gluster-9.repo 的内容。

[centos-gluster9]
name=CentOS-$releasever - Gluster 9
#mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=$releasever&repo=storage-gluster-9
baseurl=https://dl.rockylinux.org/vault/centos/8.5.2111/storage/x86_64/gluster-9/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Storage

现在我们准备安装 glusterfs 服务器。

sudo dnf install glusterfs glusterfs-libs glusterfs-server

防火墙规则

服务正常运行需要一些规则。

sudo firewall-cmd --zone=public --add-service=glusterfs --permanent
sudo firewall-cmd --reload

sudo firewall-cmd --zone=public --add-port=24007-24008/tcp --permanent
sudo firewall-cmd --zone=public --add-port=49152/tcp --permanent
sudo firewall-cmd --reload

名称解析

您可以让 DNS 处理集群中服务器的名称解析,也可以通过在每个服务器的 /etc/hosts 文件中插入记录来减轻服务器的负担。这也能在 DNS 故障期间保持运行。

192.168.10.10 node1.cluster.local
192.168.10.11 node2.cluster.local

启动服务

废话不多说,我们开始启动服务。

sudo systemctl enable glusterfsd.service glusterd.service
sudo systemctl start glusterfsd.service glusterd.service

我们现在可以加入两个节点到同一个池中了。

此命令只需在一个节点上执行一次(此处为 node1)。

sudo gluster peer probe node2.cluster.local
peer probe: success

验证。

node1 $ sudo gluster peer status
Number of Peers: 1

Hostname: node2.cluster.local
Uuid: c4ff108d-0682-43b2-bc0c-311a0417fae2
State: Peer in Cluster (Connected)
Other names:
192.168.10.11
node2 $ sudo gluster peer status
Number of Peers: 1

Hostname: node1.cluster.local
Uuid: 6375e3c2-4f25-42de-bbb6-ab6a859bf55f
State: Peer in Cluster (Connected)
Other names:
192.168.10.10

我们现在可以创建一个具有 2 个副本的卷。

$ sudo gluster volume create volume1 replica 2 node1.cluster.local:/data/glusterfs/volume1/brick0/ node2.cluster.local:/data/glusterfs/volume1/brick0/
Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this. See: https://docs.gluster.org/en/latest/Administrator-Guide/Split-brain-and-ways-to-deal-with-it/.
Do you still want to continue?
 (y/n) y
volume create: volume1: success: please start the volume to access data

注意

正如返回命令所述,一个 2 节点集群并非最理想的防止脑裂的方案。但这足以满足我们的测试平台。

我们现在可以启动卷以访问数据。

sudo gluster volume start volume1

volume start: volume1: success

检查卷状态。

$ sudo gluster volume status
Status of volume: volume1
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1.cluster.local:/data/glusterfs/v
olume1/brick0                               49152     0          Y       1210
Brick node2.cluster.local:/data/glusterfs/v
olume1/brick0                               49152     0          Y       1135
Self-heal Daemon on localhost               N/A       N/A        Y       1227
Self-heal Daemon on node2.cluster.local     N/A       N/A        Y       1152

Task Status of Volume volume1
------------------------------------------------------------------------------
There are no active volume tasks
$ sudo gluster volume info

Volume Name: volume1
Type: Replicate
Volume ID: f51ca783-e815-4474-b256-3444af2c40c4
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node1.cluster.local:/data/glusterfs/volume1/brick0
Brick2: node2.cluster.local:/data/glusterfs/volume1/brick0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

状态必须为“Started”。

我们可以开始对卷进行一些访问限制。

sudo gluster volume set volume1 auth.allow 192.168.10.*

就是这么简单。

客户端访问

有几种方法可以从客户端访问我们的数据。

首选方法。

sudo dnf install glusterfs-client
sudo mkdir /data
sudo mount.glusterfs node1.cluster.local:/volume1 /data

无需配置额外的存储库。客户端已包含在基本存储库中。

创建一个文件,并检查它是否存在于集群的所有节点上。

在客户端上。

sudo touch /data/test

在两台服务器上。

$ ll /data/glusterfs/volume1/brick0/
total 0
-rw-r--r--. 2 root root 0 Feb  3 19:21 test

很好!但是如果节点 1 失败了会怎样?它是挂载远程访问时指定的节点。

让我们停止节点一。

sudo shutdown -h now

检查节点 2 上的状态。

$ sudo gluster peer status
Number of Peers: 1

Hostname: node1.cluster.local
Uuid: 6375e3c2-4f25-42de-bbb6-ab6a859bf55f
State: Peer in Cluster (Disconnected)
Other names:
192.168.10.10
[antoine@node2 ~]$ sudo gluster volume status
Status of volume: volume1
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node2.cluster.local:/data/glusterfs/v
olume1/brick0                               49152     0          Y       1135
Self-heal Daemon on localhost               N/A       N/A        Y       1152

Task Status of Volume volume1
------------------------------------------------------------------------------
There are no active volume tasks

节点 1 已离线。

在客户端上。

$ ll /data/test
-rw-r--r--. 1 root root 0 Feb  4 16:41 /data/test

文件仍然在那里。

连接时,glusterfs 客户端会收到一个它可以访问的节点列表,这解释了我们刚刚看到的透明切换。

结论

虽然目前没有可用的存储库,但使用 CentOS 为 GlusterFS 提供的存档存储库仍然有效。如上所述,GlusterFS 的安装和维护非常简单。使用命令行工具是一个相当直接的过程。GlusterFS 将有助于创建和维护用于数据存储和冗余的高可用集群。您可以在官方文档页面上找到更多关于 GlusterFS 和工具使用的信息。

作者:Antoine Le Morvan

贡献者:Steven Spencer, Ganna Zhyrnova