如何在Ubuntu20.04上使用GlusterFS创建冗余存储池

来自菜鸟教程
跳转至:导航、​搜索

本教程的早期版本由 Justin Ellingwood 编写。

介绍

在存储任何关键数据时,出现单点故障是非常危险的。 虽然许多数据库和其他软件允许您在单个应用程序的上下文中分散数据,但其他系统可以在文件系统级别上运行,以确保在将数据写入磁盘时将其复制到另一个位置。

GlusterFS 是一个网络连接的存储文件系统,它允许您汇集多台机器的存储资源。 反过来,这使您可以将分布在多台计算机中的多个存储设备视为一个更强大的单元。 GlusterFS 还让您可以自由创建不同类型的存储配置,其中许多在功能上类似于 RAID 级别。 例如,您可以跨集群中的不同节点对数据进行条带化,或者您可以实施冗余以获得更好的数据可用性。

目标

在本指南中,您将创建一个冗余集群存储阵列,也称为分布式文件系统,或者,正如 GlusterFS 文档中所提到的,一个 可信存储池 。 这将提供类似于网络上的镜像 RAID 配置的功能:每个独立的服务器将包含其自己的数据副本,允许您的应用程序访问任一副本,从而帮助分配您的读取负载。

这个冗余的 GlusterFS 集群将由两台 Ubuntu 20.04 服务器组成。 这将类似于具有镜像 RAID 的 NAS 服务器。 然后,您将从配置为 GlusterFS 客户端的第三台 Ubuntu 20.04 服务器访问集群。

关于安全运行 GlusterFS 的注意事项

当您将数据添加到 GlusterFS 卷时,该数据会同步到托管该卷的存储池中的每台机器。 默认情况下,节点之间的这种流量没有加密,这意味着它有可能被恶意行为者拦截。

因此,如果您要在生产中使用 GlusterFS,建议您在隔离网络上运行它。 例如,您可以将其设置为在 Virtual Private Cloud (VPC) 中运行,或者在每个节点之间运行 VPN。

如果您计划在 DigitalOcean 上部署 GlusterFS,您可以通过将服务器基础架构添加到 DigitalOcean 虚拟私有云来将其设置在隔离网络中。 有关如何设置的详细信息,请参阅我们的 VPC 产品文档


先决条件

要学习本教程,您需要三台运行 Ubuntu 20.04 的服务器。 每台服务器都应该有一个具有管理权限的非 root 用户,以及一个配置了 UFW 的防火墙。 要进行设置,请按照我们的 Ubuntu 20.04 初始服务器设置指南进行操作。

注意:如目标部分所述,本教程将引导您配置两台 Ubuntu 服务器作为存储池中的服务器,其余一台作为客户端,您将使用它访问这些节点。

为清楚起见,本教程将使用以下主机名引用这些机器:

主机名 存储池中的角色
gluster0 服务器
gluster1 服务器
gluster2 客户

应该在 gluster0gluster1 上运行的命令将分别具有蓝色和红色背景:



仅应在客户端 (gluster2) 上运行的命令将具有绿色背景:


可以或应该在多台机器上运行的命令将具有灰色背景:


第 1 步 — 在每台机器上配置 DNS 解析

在每台计算机之间设置某种主机名解析有助于管理 Gluster 存储池。 这样,当您必须在本教程后面的 gluster 命令中引用您的一台机器时,您可以使用易于记忆的域名甚至昵称来代替它们各自的 IP 地址。

如果您没有备用域名,或者您只是想快速设置一些东西,则可以改为在每台计算机上编辑 /etc/hosts 文件。 这是 Linux 机器上的一个特殊文件,您可以在其中静态配置系统以将文件中包含的任何主机名解析为静态 IP 地址。

注意:如果您想配置您的服务器以使用您拥有的域进行身份验证,您首先需要从域注册商处获取域名 - 例如 NamecheapEnom — 并配置适当的 DNS 记录。

为每台服务器配置 A 记录后,您可以跳到第 2 步。 遵循本指南时,请确保将 glusterN.example.comglusterN 替换为解析到示例命令中引用的相应服务器的域名。


如果您从 DigitalOcean 获得基础设施,您可以 将您的域名添加到 DigitalOcean 然后 为您的每台服务器 设置唯一的 A 记录。


使用您喜欢的文本编辑器,在 每台机器 上以 root 权限打开此文件。 在这里,我们将使用 nano

sudo nano /etc/hosts

默认情况下,该文件看起来像这样,删除了注释:

/etc/hosts

127.0.1.1 hostname hostname
127.0.0.1 localhost

::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

在您的其中一台 Ubuntu 服务器上,添加每个服务器的 IP 地址,后跟您希望在本地主机定义下方的命令中引用它们的任何名称。

在下面的示例中,每个服务器都有一个与 glusterN.example.com 对齐的长主机名和一个与 glusterN 对齐的短主机名。 您可以将每行的 glusterN.example.comglusterN 部分更改为您希望用于访问每个服务器的任何名称(或由单个空格分隔的名称)。 但请注意,本教程将自始至终使用这些示例:

注意:如果您的服务器是 Virtual Private Cloud 基础设施池的一部分,您应该在 /etc/hosts 文件中使用每个服务器的私有 IP 地址,而不是它们的公共 IP。


/etc/hosts

. . .
127.0.0.1       localhost
first_ip_address gluster0.example.com gluster0
second_ip_address gluster1.example.com gluster1
third_ip_address gluster2.example.com gluster2

. . .

将这些新行添加到一台机器的 /etc/hosts 文件后,将它们复制并添加到其他机器上的 /etc/hosts 文件中。 每个 /etc/hosts 文件应该包含相同的行,将服务器的 IP 地址链接到您选择的名称。

完成后保存并关闭每个文件。 如果您使用 nano,请按 CTRL + XY,然后按 ENTER

现在您已经在每台服务器之间配置了主机名解析,以后在设置存储池和卷时运行命令会更容易。 接下来,您将完成必须在每台服务器上完成的另一个步骤。 即,您将 Gluster 项目的官方个人软件包存档 (PPA) 添加到您的三个 Ubuntu 服务器中的每一个,以确保您可以安装最新版本的 GlusterFS。

第 2 步 — 在每台机器上设置软件源

尽管默认的 Ubuntu 20.04 APT 存储库确实包含 GlusterFS 软件包,但在撰写本文时它们还不是最新版本。 安装 GlusterFS 最新稳定版本(撰写本文时版本 7.6)的一种方法是将 Gluster 项目的官方 PPA 添加到您的三个 Ubuntu 服务器中的每一个。

通过在每个服务器 上运行以下命令 ,为 GlusterFS 包添加 PPA:

sudo add-apt-repository ppa:gluster/glusterfs-7

当系统提示您确认您确实要添加 PPA 时,按 ENTER

添加PPA后,刷新每个服务器的本地包索引。 这将使每个服务器都知道可用的新软件包:

sudo apt update

在将 Gluster 项目的官方 PPA 添加到每个服务器并更新本地包索引之后,您就可以安装必要的 GlusterFS 包了。 但是,由于您的三台机器中的两台将充当 Gluster 服务器,另一台将充当客户端,因此有两个单独的安装和配置过程。 首先,您将安装和设置服务器组件。

第 3 步 — 安装服务器组件并创建可信存储池

存储池 是从多个存储资源聚合的任意数量的存储容量。 在此步骤中,您将配置两个服务器 - gluster0gluster1 - 作为集群组件。

gluster0gluster1 上,通过键入以下命令安装 GlusterFS 服务器包:

sudo apt install glusterfs-server

出现提示时,按 Y,然后按 ENTER 确认安装。

安装过程会自动将 GlusterFS 配置为作为 systemd 服务运行。 但是,它不会自动启动服务或使其在启动时运行。

要启动 GlusterFS 服务 glusterd,请在 gluster0gluster1 上运行以下 systemctl start 命令:

sudo systemctl start glusterd.service

然后在两台服务器上运行以下命令。 这将使服务在服务器启动时启动:

sudo systemctl enable glusterd.service

之后,您可以在一个或两个服务器上检查服务的状态:

sudo systemctl status glusterd.service

如果服务启动并运行,您将收到如下输出:

Output● glusterd.service - GlusterFS, a clustered file-system server
   Loaded: loaded (/lib/systemd/system/glusterd.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-06-02 21:32:21 UTC; 32s ago
     Docs: man:glusterd(8)
 Main PID: 14742 (glusterd)
    Tasks: 9 (limit: 2362)
   CGroup: /system.slice/glusterd.service
           └─14742 /usr/sbin/glusterd -p /var/run/glusterd.pid --log-level INFO

假设您遵循 先决条件初始服务器设置指南 ,您将在每台机器上设置带有 UFW 的防火墙。 因此,您需要在每个节点上打开防火墙,然后才能在它们之间建立通信并创建存储池。

Gluster 守护程序使用端口 24007,因此您需要允许每个节点通过存储池中每个其他节点的防火墙访问该端口。 为此,请在 gluster0 上运行以下命令。 记得把gluster1_ip_address改成gluster1的IP地址:

sudo ufw allow from gluster1_ip_address to any port 24007

并在 gluster1 上运行以下命令。 同样,一定要把 gluster0_ip_address 改成 gluster0 的 IP 地址:

sudo ufw allow from gluster0_ip_address to any port 24007

您还需要允许您的客户端计算机 (gluster2) 访问此端口。 否则,稍后在尝试挂载卷时会遇到问题。 在 gluster0 和 gluster1 上运行以下命令 以打开此端口到您的客户端计算机:

sudo ufw allow from gluster2_ip_address to any port 24007

然后,为确保没有其他机器能够访问任一服务器上的 Gluster 端口,请将以下一揽子 deny 规则添加到 gluster0 和 gluster1

sudo ufw deny 24007

您现在已准备好在 gluster0gluster1 之间建立通信。 为此,您需要在其中一个节点上运行 gluster peer probe 命令。 使用哪个节点并不重要,但以下示例显示了在 gluster0 上运行的命令:

sudo gluster peer probe gluster1

本质上,此命令告诉 gluster0 信任 gluster1 并将其注册为其存储池的一部分。 如果探测成功,它将返回以下输出:

Outputpeer probe: success

您可以通过在任一节点上运行 gluster peer status 命令随时检查节点是否正在通信。 在此示例中,它在 gluster1 上运行:

sudo gluster peer status

如果从 gluster1 运行此命令,它将显示如下输出:

OutputNumber of Peers: 1

Hostname: gluster0.example.com
Uuid: a3fae496-c4eb-4b20-9ed2-7840230407be
State: Peer in Cluster (Connected)

此时,您的两台服务器正在通信并准备好相互创建存储卷。

第 4 步 — 创建存储卷

回想一下,本教程的主要目标是创建一个冗余存储池。 为此,您将设置一个具有副本功能的卷,允许您保留数据的多个副本并防止您的集群出现单点故障。

要创建卷,您将使用具有以下通用语法的 gluster volume create 命令:

sudo gluster volume create volume_name replica number_of_servers domain1.com:/path/to/data/directory domain2.com:/path/to/data/directory force

下面是这个 gluster volume create 命令的参数和选项的含义:

  • volume_name:这是创建后用来指代卷的名称。 以下示例命令创建一个名为 volume1 的卷。
  • replica number_of_servers:在卷名之后,您可以定义要创建的卷类型。 回想一下,本教程的目标是创建一个冗余存储池,因此我们将使用 replica 卷类型。 这需要一个参数来指示卷的数据将被复制到多少台服务器(在本教程的情况下为 2)。
  • domain1.com:/…domain2.com:/…:这些定义了 bricks 的机器和目录位置 — GlusterFS 对其基本存储单元的术语,包括任何机器上的任何目录作为较大卷的一部分或副本——组成 volume1。 以下示例将在两台服务器的根目录中创建一个名为 gluster-storage 的目录。
  • force:此选项将覆盖任何警告或选项,否则会出现并停止卷的创建。

按照本教程前面建立的约定,您可以运行此命令来创建卷。 请注意,您可以从 gluster0gluster1 运行它:

sudo gluster volume create volume1 replica 2 gluster0.example.com:/gluster-storage gluster1.example.com:/gluster-storage force

如果卷创建成功,您将收到以下输出:

Outputvolume create: volume1: success: please start the volume to access data

此时,您的卷已创建,但尚未激活。 您可以再次从任一 Gluster 服务器运行以下命令来启动该卷并使其可供使用:

sudo gluster volume start volume1

如果卷已正确启动,您将收到此输出:

Outputvolume start: volume1: success

接下来,检查卷是否在线。 从任一节点运行以下命令:

sudo gluster volume status

这将返回与此类似的输出:

OutputStatus of volume: volume1
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick gluster0.example.com:/gluster-storage 49152     0          Y       18801
Brick gluster1.example.com:/gluster-storage 49152     0          Y       19028
Self-heal Daemon on localhost               N/A       N/A        Y       19049
Self-heal Daemon on gluster0.example.com    N/A       N/A        Y       18822
 
Task Status of Volume volume1
------------------------------------------------------------------------------
There are no active volume tasks

根据这个输出,两台服务器上的砖都在线。

作为配置卷的最后一步,您需要在两台服务器上打开防火墙,以便您的客户端计算机能够连接并安装卷。 根据前面命令的示例输出,volume1 正在两台机器上的端口 49152 上运行。 这是 GlusterFS 为其初始卷的默认端口,您创建的下一个卷将使用端口 49153,然后是 49154,依此类推。

gluster0gluster1 上运行以下命令,以允许 gluster2 通过各自的防火墙访问此端口:

sudo ufw allow from gluster2_ip_address to any port 49152

然后,为了增加一层安全性,在 gluster0 和 gluster1 上为 上的卷端口添加另一个一揽子 deny 规则。 这将确保除您的客户端之外的任何机器都无法访问任一服务器上的卷:

sudo ufw deny 49152

现在您的卷已启动并正在运行,您可以设置客户端计算机并开始远程使用它。

第 5 步 — 安装和配置客户端组件

您的卷现在已配置好并可供您的客户端计算机使用。 不过,在开始之前,您需要在客户端计算机上安装您在步骤 1 中设置的 PPA 中的 glusterfs-client 包。 这个包的依赖包括一些 GlusterFS 的通用库和翻译模块以及它工作所需的 FUSE 工具。

gluster2 上运行以下命令:

sudo apt install glusterfs-client

您很快将在客户端计算机上安装远程存储卷。 但是,在您执行此操作之前,您需要创建一个挂载点。 传统上,它位于 /mnt 目录中,但可以在任何方便的地方使用。

为简单起见,在您的客户端计算机上创建一个名为 /storage-pool 的目录作为挂载点。 此目录名称以正斜杠 (/) 开头,将其放置在根目录中,因此您需要使用 sudo 权限创建它:

sudo mkdir /storage-pool

现在您可以挂载远程卷了。 不过,在此之前,请看一下您将用来执行此操作的 mount 命令的语法:

sudo mount -t glusterfs domain1.com:volume_name /path/to/mount/point

mount 是许多类 Unix 操作系统中的实用程序。 它用于挂载文件系统——从外部存储设备(如 SD 卡或 USB 记忆棒)到本教程中的网络附加存储——到机器现有文件系统上的目录。 您将使用的 mount 命令语法包括 -t 选项,它需要三个参数:要挂载的文件系统的 typedevice可以找到要挂载的文件系统的位置,以及将挂载卷的客户端上的 目录

请注意,在此示例语法中,设备参数指向一个主机名,后跟一个冒号,然后是卷名。 GlusterFS 抽象出每台主机上的实际存储目录,这意味着该命令不会挂载 /gluster-storage 目录,而是挂载 volume1 卷。

另请注意,您只需指定存储集群的一个成员。 这可以是任一节点,因为 GlusterFS 服务将它们视为一台机器。

在您的客户端计算机 (gluster2) 上运行以下命令,将卷挂载到您创建的 /storage-pool 目录:

sudo mount -t glusterfs gluster0.example.com:/volume1 /storage-pool

之后,运行 df 命令。 这将显示调用它的用户有权访问的文件系统的可用磁盘空间量:

df

此命令将显示 GlusterFS 卷已安装在正确的位置:

OutputFilesystem                    1K-blocks    Used Available Use% Mounted on
. . .
gluster0.example.com:/volume1  50633164 1938032  48695132   4% /storage-pool

现在,您可以继续测试您写入客户端卷的任何数据是否按预期复制到您的服务器节点。

第 6 步 — 测试冗余功能

现在您已将客户端设置为使用您的存储池和卷,您可以测试其功能。

在您的客户端计算机 (gluster2) 上,导航到您在上一步中定义的挂载点:

cd /storage-pool

然后创建一些测试文件。 以下命令在您的存储池中创建十个单独的空文件:

sudo touch file_{0..9}.test

如果您检查之前在每个存储主机上定义的存储目录,您会发现所有这些文件都存在于每个系统上。

gluster0 上:

ls /gluster-storage
Outputfile_0.test  file_2.test  file_4.test  file_6.test  file_8.test
file_1.test  file_3.test  file_5.test  file_7.test  file_9.test

同样,在 gluster1 上:

ls /gluster-storage
Outputfile_0.test  file_2.test  file_4.test  file_6.test  file_8.test
file_1.test  file_3.test  file_5.test  file_7.test  file_9.test

正如这些输出所示,您添加到客户端的测试文件也写入了您的两个节点。

如果存储集群中的某个节点出现故障,那么如果对文件系统进行任何更改,它可能会与存储池不同步。 在节点重新联机后对客户端挂载点执行读取操作将提醒节点获取任何丢失的文件:

ls /storage-pool

现在您已验证存储卷已正确安装并且可以将数据复制到集群中的两台机器,您可以锁定对存储池的访问。

第 7 步 — 限制冗余功能

此时,任何计算机都可以不受任何限制地连接到您的存储卷。 您可以通过设置 auth.allow 选项来更改此设置,该选项定义了应该有权访问卷的任何客户端的 IP 地址。

如果您使用 /etc/hosts 配置,您为每台服务器设置的名称将无法正确路由。 您必须改用静态 IP 地址。 另一方面,如果您使用 DNS 记录,您配置的域名将在此处使用。

在任一存储节点gluster0gluster1)上,运行以下命令:

sudo gluster volume set volume1 auth.allow gluster2_ip_address

如果命令成功完成,它将返回以下输出:

Outputvolume set: success

如果您需要在任何时候删除限制,您可以键入:

sudo gluster volume set volume1 auth.allow *

这将再次允许来自任何机器的连接。 这是不安全的,但对调试问题很有用。

如果您有多个客户端,您可以同时指定它们的 IP 地址或域名(取决于您使用的是 /etc/hosts 还是 DNS 主机名解析),以逗号分隔:

sudo gluster volume set volume1 auth.allow gluster_client1_ip,gluster_client2_ip

您的存储池现已配置、保护并可供使用。 接下来,您将学习一些命令,这些命令将帮助您获取有关存储池状态的信息。

第 8 步 — 使用 GlusterFS 命令获取有关存储池的信息

当您开始更改 GlusterFS 存储的某些设置时,您可能会对可用的选项、哪些卷处于活动状态以及哪些节点与每个卷相关联感到困惑。

您的节点上有许多不同的命令可用于检索此数据并与您的存储池交互。

如果您需要有关每个卷的信息,请运行 gluster volume info 命令:

sudo gluster volume info
OutputVolume Name: volume1
Type: Replicate
Volume ID: a1e03075-a223-43ab-a0f6-612585940b0c
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gluster0.example.com:/gluster-storage
Brick2: gluster1.example.com:/gluster-storage
Options Reconfigured:
auth.allow: gluster2_ip_address
transport.address-family: inet
storage.fips-mode-rchecksum: on
nfs.disable: on
performance.client-io-threads: off

同样,要获取有关此节点连接到的任何对等点的信息,您可以键入:

sudo gluster peer status
Number of Peers: 1

Hostname: gluster0.example.com
Uuid: cb00a2fc-2384-41ac-b2a8-e7a1793bb5a9
State: Peer in Cluster (Connected)

如果您想了解每个节点如何执行的详细信息,您可以通过键入以下内容来分析卷:

sudo gluster volume profile volume_name start

此命令完成后,您可以通过键入以下内容获取收集的信息:

sudo gluster volume profile volume_name info
OutputBrick: gluster0.example.com:/gluster-storage
--------------------------------------------
Cumulative Stats:
 %-latency   Avg-latency   Min-Latency   Max-Latency   No. of calls         Fop
 ---------   -----------   -----------   -----------   ------------        ----
      0.00       0.00 us       0.00 us       0.00 us             30      FORGET
      0.00       0.00 us       0.00 us       0.00 us             36     RELEASE
      0.00       0.00 us       0.00 us       0.00 us             38  RELEASEDIR
 
    Duration: 5445 seconds
   Data Read: 0 bytes
Data Written: 0 bytes
 
Interval 0 Stats:
 %-latency   Avg-latency   Min-Latency   Max-Latency   No. of calls         Fop
 ---------   -----------   -----------   -----------   ------------        ----
      0.00       0.00 us       0.00 us       0.00 us             30      FORGET
      0.00       0.00 us       0.00 us       0.00 us             36     RELEASE
      0.00       0.00 us       0.00 us       0.00 us             38  RELEASEDIR
 
    Duration: 5445 seconds
   Data Read: 0 bytes
Data Written: 0 bytes
. . .

如前所示,要获得在每个节点上运行的所有 GlusterFS 相关组件的列表,请运行 gluster volume status 命令:

sudo gluster volume status
OutputStatus of volume: volume1
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick gluster0.example.com:/gluster-storage 49152     0          Y       19003
Brick gluster1.example.com:/gluster-storage 49152     0          Y       19040
Self-heal Daemon on localhost               N/A       N/A        Y       19061
Self-heal Daemon on gluster0.example.com    N/A       N/A        Y       19836
 
Task Status of Volume volume1
------------------------------------------------------------------------------
There are no active volume tasks

如果您要管理 GlusterFS 存储卷,最好进入 GlusterFS 控制台。 这将允许您与 GlusterFS 环境进行交互,而无需在所有操作之前键入 sudo gluster

sudo gluster

这将为您提供一个提示,您可以在其中键入命令。 help 是一个让自己有方向感的好方法:

help
Output peer help                - display help for peer commands
 volume help              - display help for volume commands
 volume bitrot help       - display help for volume bitrot commands
 volume quota help        - display help for volume quota commands
 snapshot help            - display help for snapshot commands
 global help              - list global commands

完成后,运行 exit 退出 Gluster 控制台:

exit

这样,您就可以开始将 GlusterFS 与您的下一个应用程序集成。

结论

通过完成本教程,您将拥有一个冗余存储系统,允许您同时写入两个单独的服务器。 这对于许多应用程序很有用,并且即使在一台服务器出现故障时也可以确保您的数据可用。