如何在Ubuntu18.04上使用GlusterFS创建冗余存储池
本教程的早期版本由 Justin Ellingwood 编写。
介绍
在存储任何关键数据时,出现单点故障是非常危险的。 虽然许多数据库和其他软件允许您在单个应用程序的上下文中分散数据,但其他系统可以在文件系统级别上运行,以确保在将数据写入磁盘时将其复制到另一个位置。
GlusterFS 是一个网络连接的存储文件系统,它允许您汇集多台机器的存储资源。 反过来,这使您可以将分布在多台计算机中的多个存储设备视为一个更强大的单元。 GlusterFS 还让您可以自由创建不同类型的存储配置,其中许多在功能上类似于 RAID 级别。 例如,您可以跨集群中的不同节点对数据进行条带化,或者您可以实施冗余以获得更好的数据可用性。
目标
在本指南中,您将创建一个冗余集群存储阵列,也称为分布式文件系统,或者,正如 GlusterFS 文档中所提到的,一个 可信存储池 。 这将提供类似于网络上的镜像 RAID 配置的功能:每个独立的服务器将包含其自己的数据副本,允许您的应用程序访问任一副本,从而帮助分配您的读取负载。
这个冗余的 GlusterFS 集群将由两台 Ubuntu 18.04 服务器组成。 这将类似于具有镜像 RAID 的 NAS 服务器。 然后,您将从配置为 GlusterFS 客户端的第三台 Ubuntu 18.04 服务器访问集群。
关于安全运行 GlusterFS 的注意事项
当您将数据添加到 GlusterFS 卷时,该数据会同步到托管该卷的存储池中的每台机器。 默认情况下,节点之间的这种流量没有加密,这意味着它有可能被恶意行为者拦截。
因此,如果您要在生产中使用 GlusterFS,建议您在隔离网络上运行它。 例如,您可以将其设置为在 Virtual Private Cloud (VPC) 中运行,或者在每个节点之间运行 VPN。
如果您计划在 DigitalOcean 上部署 GlusterFS,您可以通过将服务器基础架构添加到 DigitalOcean 虚拟私有云来将其设置在隔离网络中。 有关如何设置的详细信息,请参阅我们的 VPC 产品文档。
先决条件
要学习本教程,您将需要三台运行 Ubuntu 18.04 的服务器。 每台服务器都应该有一个具有管理权限的非 root 用户,以及一个配置了 UFW 的防火墙。 要进行此设置,请按照我们的 Ubuntu 18.04 初始服务器设置指南进行操作。
注意:如目标部分所述,本教程将引导您配置两台 Ubuntu 服务器作为存储池中的服务器,其余一台作为客户端,您将使用它访问这些节点。
为清楚起见,本教程将使用以下主机名引用这些机器:
主机名 | 存储池中的角色 |
---|---|
gluster0 | 服务器 |
gluster1 | 服务器 |
gluster2 | 客户 |
应该在 gluster0 或 gluster1 上运行的命令将分别具有蓝色和红色背景:
仅应在客户端 (gluster2) 上运行的命令将具有绿色背景:
可以或应该在多台机器上运行的命令将具有灰色背景:
第 1 步 — 在每台机器上配置 DNS 解析
在每台计算机之间设置某种主机名解析有助于管理 Gluster 存储池。 这样,当您必须在本教程后面的 gluster
命令中引用您的一台机器时,您可以使用易于记忆的域名甚至昵称来代替它们各自的 IP 地址。
如果您没有备用域名,或者您只是想快速设置一些东西,则可以改为在每台计算机上编辑 /etc/hosts
文件。 这是 Linux 机器上的一个特殊文件,您可以在其中静态配置系统以将文件中包含的任何主机名解析为静态 IP 地址。
注意:如果您想配置您的服务器以使用您拥有的域进行身份验证,您首先需要从域注册商处获取域名 - 例如 Namecheap 或Enom — 并配置适当的 DNS 记录。
为每台服务器配置 A 记录后,您可以跳到第 2 步。 遵循本指南时,请确保将 glusterN.example.com 和 glusterN 替换为解析到示例命令中引用的相应服务器的域名。
如果您从 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.com
和 glusterN
部分更改为您希望用于访问每个服务器的任何名称(或由单个空格分隔的名称)。 但请注意,本教程将自始至终使用这些示例:
注意:如果您的服务器是 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 + X
、Y
,然后按 ENTER
。
现在您已经在每台服务器之间配置了主机名解析,以后在设置存储池和卷时运行命令会更容易。 接下来,您将完成必须在每台服务器上完成的另一个步骤。 即,您将 Gluster 项目的官方个人软件包存档 (PPA) 添加到您的三个 Ubuntu 服务器中的每一个,以确保您可以安装最新版本的 GlusterFS。
第 2 步 — 在每台机器上设置软件源
尽管默认的 Ubuntu 18.04 APT 存储库包含 GlusterFS 包,但它们已经过时了。 安装 GlusterFS 最新稳定版本(撰写本文时版本 7)的一种方法是将 Gluster 项目的官方 PPA 添加到您的三个 Ubuntu 服务器中的每一个。
首先,更新 每个服务器 上的本地包索引:
sudo apt update
然后在每台机器上安装software-properties-common
包。 此软件包将允许您更灵活地管理 PPA:
sudo apt install software-properties-common
安装 PPA 工具后,通过在每个服务器 上运行以下命令 为 GlusterFS 包添加 PPA:
sudo add-apt-repository ppa:gluster/glusterfs-7
当系统提示您确认您确实要添加 PPA 时,按 ENTER
。
添加PPA后,刷新每个服务器的本地包索引。 这将使每个服务器都知道可用的新软件包:
sudo apt update
在将 Gluster 项目的官方 PPA 添加到每个服务器并更新本地包索引之后,您就可以安装必要的 GlusterFS 包了。 但是,由于您的三台机器中的两台将充当 Gluster 服务器,另一台将充当客户端,因此有两个单独的安装和配置过程。 首先,您将安装和设置服务器组件。
第 3 步 — 安装服务器组件并创建可信存储池
存储池 是从多个存储资源聚合的任意数量的存储容量。 在此步骤中,您将配置两个服务器 - gluster0 和 gluster1 - 作为集群组件。
在 gluster0 和 gluster1 上,通过键入以下命令安装 GlusterFS 服务器包:
sudo apt install glusterfs-server
出现提示时,按 Y
,然后按 ENTER
确认安装。
此时,gluster0 和 gluster1 都安装了 GlusterFS,并且 glusterd
服务应该正在运行。 您可以通过在每台服务器上运行以下命令来测试:
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
接下来,您需要在 gluster0 和 gluster1 之间建立通信。
为此,您需要在其中一个节点上运行 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
:此选项将覆盖任何警告或选项,否则会出现并停止卷的创建。
按照本教程前面建立的约定,您可以运行此命令来创建卷。 请注意,您可以从 gluster0 或 gluster1 运行它:
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
,依此类推。
在 gluster0 和 gluster1 上运行以下命令,以允许 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
选项,它需要三个参数:要挂载的文件系统的 type、device可以找到要挂载的文件系统的位置,以及将挂载卷的客户端上的 目录 。
请注意,在此示例语法中,设备参数指向一个主机名,后跟一个冒号,然后是卷名。 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 1747596 48885568 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 记录,您配置的域名将在此处使用。
在任一存储节点(gluster0或gluster1)上,运行以下命令:
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: 8da67ffa-b193-4973-ad92-5b7fed8d0357 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 与您的下一个应用程序集成。
结论
通过完成本教程,您将拥有一个冗余存储系统,允许您同时写入两个单独的服务器。 这对于许多应用程序很有用,并且即使在一台服务器出现故障时也可以确保您的数据可用。