跳至内容

使用 GlusterFS 的高可用性集群

先决条件

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

介绍

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

它允许将大量数据存储在具有非常高可用性的服务器集群中。

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

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

GlusterFS 可以以两种模式运行

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

如果您拥有正确的服务器数量,则这两种模式可以一起使用来提供复制和分布式文件系统。

数据存储在砖块中。

砖块是 GlusterFS 中的基本存储单元,它由受信任存储池中服务器上的导出目录表示。

测试平台

我们虚构的平台包含两台服务器和一台客户端,所有都是 Rocky Linux 服务器。

  • 第一个节点:node1.cluster.local - 192.168.1.10
  • 第二个节点:node2.cluster.local - 192.168.1.11
  • Client1: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 存储 SIG 存储库已不再可用,RockyLinux 存储库也尚未可用。

但是,我们将使用(目前)存档版本。

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

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

状态必须为“已启动”。

我们已经可以稍微限制对卷的访问权限

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 故障怎么办?它是在挂载远程访问时指定的节点。

让我们停止节点 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