本教程的早期版本由Justin Ellingwood编写。
介绍
在存储任何关键数据时,单点故障是非常危险的。虽然许多数据库和其他软件允许您在单个应用程序的上下文中分散数据,但其他系统可以在文件系统级别上运行,以确保数据在写入磁盘时被复制到另一个位置。
GlusterFS是一个网络附加存储文件系统,允许您将多台机器的存储资源池化。反过来,这使您可以将分布在多台计算机中的多个存储设备视为一个功能更强大的单元。GlusterFS 还让您可以自由地创建不同类型的存储配置,其中许多在功能上类似于RAID级别。例如,您可以跨集群中的不同节点对数据进行条带化,或者您可以实施冗余以提高数据可用性。
目标
在本指南中,您将创建一个冗余集群存储阵列,也称为分布式文件系统,或者 GlusterFS 文档中提到的可信存储池。这将提供类似于网络上的镜像 RAID 配置的功能:每个独立服务器将包含自己的数据副本,允许您的应用程序访问任一副本,从而帮助分配读取负载。
这个冗余的 GlusterFS 集群将由两台 Ubuntu 18.04 服务器组成。这将类似于具有镜像 RAID的NAS服务器。然后,您将从配置为 GlusterFS 客户端的第三个 Ubuntu 18.04 服务器访问集群。
关于安全运行 GlusterFS 的注意事项
当您将数据添加到 GlusterFS 卷时,该数据会同步到托管该卷的存储池中的每台机器。默认情况下,节点之间的通信未加密,这意味着存在被恶意行为者拦截的风险。
因此,如果您打算在生产中使用 GlusterFS,建议您在隔离网络上运行它。例如,您可以将其设置为在虚拟私有云(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 步。按照本指南进行操作时,请确保将gluster N .example.com和gluster N替换为解析到相应服务器的域名在示例命令中引用。
如果您从 DigitalOcean 获得您的基础设施,您可以将您的域名添加到 DigitalOcean,然后为您的每台服务器设置一个唯一的 A 记录。
使用您喜欢的文本编辑器,在您的每台机器上以 root 权限打开此文件。在这里,我们将使用nano
:
- sudo nano /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
注意:如果您的服务器是虚拟私有云基础设施池的一部分,您应该在/etc/hosts
文件中使用每个服务器的私有 IP 地址,而不是它们的公共 IP。
. . .
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
ENTER
出现提示时按确认您确实要添加 PPA。
添加 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 守护进程使用 port 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:/…
:这些定义了砖块的机器和目录位置——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 初始卷的默认端口,您创建的下一个卷将使用 port 49153
,然后49154
,依此类推。
在gluster0和gluster1上运行以下命令,以允许gluster2通过各自的防火墙访问此端口:
- sudo ufw allow from gluster2_ip_address to any port 49152
然后,为了增加一层安全性,deny
在gluster0 和 gluster1上为卷的端口添加另一个全面规则这将确保除了您的客户端之外的任何机器都不能访问任一服务器上的卷:
- sudo ufw deny 49152
现在您的卷已启动并正在运行,您可以设置您的客户端机器并开始远程使用它。
步骤 5 — 安装和配置客户端组件
现在您的卷已配置完毕,可供您的客户端计算机使用。
不过,在开始之前,您需要glusterfs-client
从您在步骤 1 中设置的 PPA安装包。该包的依赖项包括 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
选项,这需要三个参数:类型的文件系统被安装,该装置可在其中找到挂载文件系统,以及目录的客户在那里你会在卷上挂接。
请注意,在此示例语法中,设备参数指向主机名,后跟一个冒号,然后是卷的名称。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 还是 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 与您的下一个应用程序集成。
结论
完成本教程后,您将拥有一个冗余存储系统,允许您同时写入两个独立的服务器。这对于许多应用程序非常有用,并且可以确保即使在一台服务器出现故障时您的数据也可用。