使用 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