如何在 Ubuntu 18.04 上使用 GlusterFS 创建冗余存储池

此教程的早期版本是由 Justin Ellingwood 撰写的。

介绍

虽然许多数据库和其他软件允许您在单个应用程序的背景下扩散数据,但其他系统可以在文件系统层面运行,以确保数据被复制到另一个位置,每次被写到磁盘上。

[GlusterFS] (https://www.gluster.org/)是一个网络附着的存储文件系统,它允许您集合多台机器的存储资源. 反过来,这可以把分布在许多计算机中的多个存储设备当作一个单一的,更强大的单位. 粘结 FS还赋予了您创建不同种类存储配置的自由,其中许多配置在功能上与RAID级别相类似. 例如,您可以在集群的不同节点上条列数据,或者您可以实施冗余以更好地提供数据.

目标

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

这个冗余的 GlusterFS 集群将由两个 Ubuntu 18.04 服务器组成,这将与具有镜像 RAID 的 NAS服务器相似。

关于安全地运行 GlusterFS 的笔记

当您将数据添加到一个 GlusterFS 卷时,该数据会同步到存储池中的每个机器,该卷之间的流量默认不加密,这意味着有可能被恶意行为者拦截。

例如,您可以将其设置为在 Virtual Private Cloud(VPC)或在每个节点之间运行的VPN。

如果您计划在DigitalOcean上部署GlusterFS,您可以通过将服务器基础设施添加到DigitalOcean虚拟私有云中,将其设置在一个孤立的网络中。有关如何设置此功能的详细信息,请参阅我们的VPC产品文档(https://www.digitalocean.com/docs/networking/vpc/how-to/)。

前提条件

要遵循本教程,你将需要三个服务器运行Ubuntu 18.04. 每个服务器都应该有一个非根用户与管理权限,和一个防火墙配置与UFW. 要设置这个,请遵循我们的 初始服务器设置指南Ubuntu 18.04

注:正如目标部分所提到的,本教程将指导您配置两个Ubuntu服务器作为存储池中的服务器,剩余的服务器作为客户端,您将使用它来访问这些节点。

为了澄清,本教程将参考以下主机名称的这些机器:

主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名:

应该在 gluster0 或** gluster1** 上运行的命令将分别有蓝色和红色背景:

1[environment second]
1[environment third]

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

1[environment fourth]

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

美元

第1步:在每个机器上配置DNS分辨率

在每个计算机之间设置某种类型的主机名分辨率可以帮助管理您的 Gluster 存储池. 这样,在本教程中稍后,当您需要在一个gluster命令中引用您的计算机之一时,您可以使用易于记住的域名或甚至称呼代替其各自的 IP 地址。

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

注:如果您想配置您的服务器以使用您所拥有的域名进行身份验证,则首先需要从域名注册机构获取域名,例如 NamecheapEnom并配置相应的 DNS 记录。

一旦您为每个服务器配置了 A 记录,您可以跳到步骤 2 来执行此指南,请确保您将 glusterN.example.com 和** glusterN** 替换为在示例命令中引用到相应的服务器的域名。

如果你从DigitalOcean获得了你的基础设施,你可以 添加你的域名到DigitalOcean然后(https://www.digitalocean.com/docs/networking/dns/how-to/manage-records/# a-records)。

使用您喜爱的文本编辑器,在您的每台机器上使用根权限打开这个文件,在这里我们将使用nano:

1sudo nano /etc/hosts

默认情况下,文件将看起来像这样,评论被删除:

 1[label /etc/hosts]
 2127.0.1.1 hostname hostname
 3127.0.0.1 localhost
 4
 5::1 ip6-localhost ip6-loopback
 6fe00::0 ip6-localnet
 7ff00::0 ip6-mcastprefix
 8ff02::1 ip6-allnodes
 9ff02::2 ip6-allrouters
10ff02::3 ip6-allhosts

在您的 Ubuntu 服务器中,添加每个服务器的 IP 地址,然后添加您希望在本地主机定义下方的命令中使用的任何名称。

在下面的示例中,每个服务器都被赋予一个长的主机名称,与glusterN.example.com对齐,一个短的名称与glusterN对齐,您可以将每个行的glusterN.example.comglusterN部分更改为任何名称 - 或单个空间分开的名称 - 您想要使用来访问每个服务器。

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

1[label /etc/hosts]
2. . .
3127.0.0.1 localhost
4first_ip_address gluster0.example.com gluster0
5second_ip_address gluster1.example.com gluster1
6third_ip_address gluster2.example.com gluster2
7
8. . .

当你完成将这些新行添加到一台机器的/etc/hosts文件时,复制并添加到其他机器上的/etc/hosts文件中。

如果您使用了「nano」,请按一下「CTRL + X」,「Y」,然後按一下「ENTER」。

现在你已经在每个服务器之间配置了主机名称分辨率,你将更容易运行命令,因为你将设置一个存储池和体积。接下来,你将通过另一个步骤,必须在每个服务器上完成,即你将添加Gluster项目的官方个人包存档(PPA)到你的三个Ubuntu服务器,以确保你可以安装最新版本的GlusterFS。

第2步:在每个机器上设置软件源

虽然默认的 Ubuntu 18.04 APT 存储库包含 GlusterFS 包,但它们是相当过时的。 安装最新稳定版本的 GlusterFS(本文的版本 7)的一种方法是将 Gluster 项目的官方 PPA 添加到您的三个 Ubuntu 服务器中。

首先,更新您的每个服务器上的本地包索引:

1sudo apt update

然后在每个机器上安装software-properties-common包 **. 此包将使您能够更灵活地管理 PPA:

1sudo apt install software-properties-common

安装 PPA 工具后,通过在每个服务器上运行以下命令**来为 GlusterFS 包添加 PPA:

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

当被提示时按ENTER,以确认您实际上想要添加PPA。

添加 PPA 后,更新 每个服务器的 本地包索引,这将使每个服务器了解可用的新包:

1sudo apt update

将 Gluster 项目的官方 PPA 添加到每个服务器并更新本地包索引后,您已经准备好安装所需的 GlusterFS 包。然而,由于您三台机器中的两台将作为 Gluster 服务器,而另一台将作为客户端,有两个独立的安装和配置程序。

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

在此步骤中,您将将两个服务器(gluster0和gluster1 )配置为集群组件。

gluster0 和** gluster1** 上,通过键入以下方式安装 GlusterFS 服务器包:

1sudo apt install glusterfs-server

当提示时,按Y,然后按ENTER,以确认安装。

在此时,gluster0和gluster1都安装了 GlusterFS,glusterd 服务应该在运行,您可以通过在每个服务器上运行以下命令来测试:

1sudo systemctl status glusterd.service

如果服务已启动并运行,您将收到这样的输出:

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

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

Gluster Daemon 使用端口 24007,因此您需要允许每个节点通过存储池中的每个节点的防火墙访问该端口。

1[environment second]
2sudo ufw allow from gluster1_ip_address to any port 24007

然后在 gluster1 上运行以下命令. 再次,请确保将 gluster0_ip_address 更改为** gluster0** 的 IP 地址:

1[environment third]
2sudo ufw allow from gluster0_ip_address to any port 24007

您还需要允许您的客户端机器(gluster2 )访问该端口。否则,您将在稍后尝试安装音量时遇到问题。

1sudo ufw allow from gluster2_ip_address to any port 24007

然后,为了确保任何其他机器都无法访问 Gluster 的端口,在任何一个服务器上,将下面的盖子否定规则添加到 gluster0 和 gluster1 :

1sudo ufw deny 24007

接下来,您需要在 gluster0 和** gluster1** 之间建立通信。

要做到这一点,您需要在您的一个节点上运行gluster peer probe命令. 无论您使用哪个节点,但下面的示例显示该命令在 gluster0 上运行:

1[environment second]
2sudo gluster peer probe gluster1

基本上,这个命令告诉gluster0信任gluster1并将其注册为其存储池的一部分。

1[environment second]
2[secondary_label Output]
3peer probe: success

您可以通过在任何一个节点上运行gluster peer status命令来检查节点是否在任何时候进行通信。

1[environment third]
2sudo gluster peer status

如果您从 gluster1 中运行此命令,则将显示这样的输出:

1[environment third]
2[secondary_label Output]
3Number of Peers: 1
4
5Hostname: gluster0.example.com
6Uuid: a3fae496-c4eb-4b20-9ed2-7840230407be
7State: Peer in Cluster (Connected)

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

步骤4 — 创建存储量

请记住,本教程的主要目标是创建一个多余的存储池. 为此,您将设置一个具有复制功能的卷,允许您保留您的数据的多个副本,并防止您的集群有一个单一的故障点。

要创建一个卷,您将使用这个通用语法的Gluster Volume Create命令:

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

以下是这个创建闪光量命令的参数和选项的含义:

  • `数量-名称 ' : 此名将指所出出出后所出出出之卷. 以下示例命令生成一卷,取名 " 卷一 " 。
  • `servers'号: 根据音量名称,可以定义要创建的音量类型. 回顾这个教程的目标是创建一个多余的存储池,因此我们将使用 ['replica' () 音量类型. 这需要说明该卷的数据将复制到多少服务器(如果是)的论据。
  • 'domain1.com:/.'和'domain2.com:/.': 这些定义了 _ Bricks_ — Gluster 的机器和目录位置 金融服务是其基本储存单位的术语,其中包括任何机器上的任何目录,这些目录将作为更大卷的一部分或副本,构成`卷'。 下面的例子将在两个服务器的根目录中创建一个名为"gluster-surverage"的目录.
  • " 武力 " : 此选项将取代任何警告或选项, 否则会出现并停止音量的创建 。 .

按照本教程早些时候建立的惯例,您可以运行此命令来创建一个卷. 请注意,您可以从 gluster0 或** gluster1** 中运行它:

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

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

1[secondary_label Output]
2volume create: volume1: success: please start the volume to access data

此时,您的音量已经创建,但尚未启动,您可以从您的 Gluster 服务器中运行以下命令来启动音量并使其可用:

1sudo gluster volume start volume1

如果音量正确启动,您将收到此输出:

1[secondary_label Output]
2volume start: volume1: success

接下来,检查音量是否在线. 从您的任何一个节点运行下列命令:

1sudo gluster volume status

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

 1[secondary_label Output]
 2Status of volume: volume1
 3Gluster process TCP Port RDMA Port Online Pid
 4------------------------------------------------------------------------------
 5Brick gluster0.example.com:/gluster-storage 49152 0 Y 18801
 6Brick gluster1.example.com:/gluster-storage 49152 0 Y 19028
 7Self-heal Daemon on localhost N/A N/A Y 19049
 8Self-heal Daemon on gluster0.example.com N/A N/A Y 18822
 9
10Task Status of Volume volume1
11------------------------------------------------------------------------------
12There are no active volume tasks

基于此输出,这两个服务器上的砖都是在线的。

作为配置音量的最后一步,您需要在两个服务器上打开防火墙,以便您的客户端机器能够连接和安装音量。 根据上一个命令的样本输出,volume1在两个机器上运行在端口49152上。

gluster0 和** gluster1** 上运行以下命令,以允许** gluster2** 通过各自的防火墙访问该端口:

1sudo ufw allow from gluster2_ip_address to any port 49152

然后,为了增加一个安全层,在 **gluster0 和 gluster1 上的卷端口中添加另一个盖子拒绝规则,这将确保客户端以外的任何机器都无法访问两个服务器上的卷:

1sudo ufw deny 49152

现在,你的音量已经升起,你可以设置你的客户端机器,并开始远程使用它。

步骤5:安装和配置客户端组件

现在,您的音量已配置,它可供客户端机器使用。

然而,在您开始之前,您需要从您在步骤 1 中设置的 PPA 安装glusterfs-client包,该包的依赖性包括 GlusterFS 的一些常见库和翻译模块,以及它所需的 FUSE 工具。

gluster2 上运行以下命令:

1[environment fourth]
2sudo apt install glusterfs-client

您将很快将您的远程存储量安装在您的客户端计算机上。在您可以这样做之前,您需要创建一个安装点。传统上,这是在/mnt目录中,但可以在任何方便的地方使用。

为了简单,在您的客户端机器上创建一个名为)开始,将其放置在根目录中,因此您需要用sudo特权创建它:

1[environment fourth]
2sudo mkdir /storage-pool

现在你可以安装远程音量,但在此之前,先看看你要使用的安装命令的语法:

1[environment fourth]
2sudo mount -t glusterfs domain1.com:volume_name /path/to/mount/point

mount'是许多Unix类操作系统中的一种工具。 它用来挂载文件系统——从外部存储设备中的任何内容,如SD卡或USB棒,到网络附着的存储,如这个教程的情况——到机器现有文件系统中的目录. 您将使用的mount'命令语法包括`-t'选项,它需要三个参数:要挂载的文件系统的_type_;可以找到要挂载的文件系统的_device_;以及您要挂载卷的客户端上的_diretory_.

请注意,在这个示例语法中,设备参数指向一个主机名称,然后是卷,然后是卷的名称。

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

在您的客户端机器上运行以下命令(gluster2 ),将音量插入您创建的 /storage-pool 目录:

1[environment fourth]
2sudo mount -t glusterfs gluster0.example.com:/volume1 /storage-pool

接下来,运行df命令. 这将显示用户召唤它的文件系统可用磁盘空间的数量:

1[environment fourth]
2df

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

1[environment fourth]
2[secondary_label Output]
3Filesystem 1K-blocks Used Available Use% Mounted on
4. . .
5gluster0.example.com:/volume1 50633164 1747596 48885568 4% /storage-pool

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

步骤6 - 测试解雇功能

现在你已经设置了客户端来使用你的存储池和体积,你可以测试它的功能。

在您的客户端机器(gluster2 )上,导航到您在上一步中定义的安装点:

1[environment fourth]
2cd /storage-pool

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

1[environment fourth]
2sudo touch file_{0..9}.test

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

:

1[environment second]
2ls /gluster-storage
1[environment second]
2[secondary_label Output]
3file_0.test file_2.test file_4.test file_6.test file_8.test
4file_1.test file_3.test file_5.test file_7.test file_9.test

同样,在 gluster1 上:

1[environment third]
2ls /gluster-storage
1[environment third]
2[secondary_label Output]
3file_0.test file_2.test file_4.test file_6.test file_8.test
4file_1.test file_3.test file_5.test file_7.test file_9.test

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

如果您存储集群中的一个节点出现时,如果对文件系统进行任何更改,它可能会失去与存储池的同步。在节点回归后,在客户端安装点上进行读取操作会提醒节点获取任何缺失的文件:

1[environment fourth]
2ls /storage-pool

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

第7步:限制解雇功能

在此时,任何计算机都可以连接到您的存储量,无需任何限制,您可以通过设置auth.allow选项来更改这一点,该选项定义了任何客户端应该访问的IP地址。

如果您使用/etc/hosts配置,您为每个服务器设置的名称将不会正确路由,您必须使用静态 IP 地址,另一方面,如果您使用 DNS 记录,您配置的域名将在这里工作。

在您的任何一个存储节点上 (** gluster0** 或** gluster1** ),运行以下命令:

1sudo gluster volume set volume1 auth.allow gluster2_ip_address

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

1[secondary_label Output]
2volume set: success

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

1sudo gluster volume set volume1 auth.allow *

这将允许从任何机器再次连接,这是不安全的,但可以用于调试问题。

如果您有多个客户端,您可以同时指定他们的 IP 地址或域名(取决于您是否使用 `/etc/hosts’ 或 DNS 主机名分辨率),分隔为下列字段:

1sudo gluster volume set volume1 auth.allow gluster_client1_ip,gluster_client2_ip

您的存储池现在已配置,安全,并准备使用,接下来您将学习一些命令,以帮助您获取有关存储池的状态的信息。

步骤 8 — 通过 GlusterFS 命令获取有关您的存储池的信息

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

在您的节点上可使用多种不同的命令来获取这些数据并与您的存储池进行交互。

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

1sudo gluster volume info
 1[secondary_label Output]
 2Volume Name: volume1
 3Type: Replicate
 4Volume ID: 8da67ffa-b193-4973-ad92-5b7fed8d0357
 5Status: Started
 6Snapshot Count: 0
 7Number of Bricks: 1 x 2 = 2
 8Transport-type: tcp
 9Bricks:
10Brick1: gluster0.example.com:/gluster-storage
11Brick2: gluster1.example.com:/gluster-storage
12Options Reconfigured:
13auth.allow: gluster2_ip_address
14transport.address-family: inet
15storage.fips-mode-rchecksum: on
16nfs.disable: on
17performance.client-io-threads: off

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

1[environment third]
2sudo gluster peer status
1[environment third]
2Number of Peers: 1
3
4Hostname: gluster0.example.com
5Uuid: cb00a2fc-2384-41ac-b2a8-e7a1793bb5a9
6State: Peer in Cluster (Connected)

如果您想要有关每个节点的表现的详细信息,您可以通过键入一个卷的配置:

1sudo gluster volume profile volume_name start

当该命令完成时,您可以通过键入获取所收集的信息:

1sudo gluster volume profile volume_name info
 1[secondary_label Output]
 2Brick: gluster0.example.com:/gluster-storage
 3--------------------------------------------
 4Cumulative Stats:
 5 %-latency Avg-latency Min-Latency Max-Latency No. of calls Fop
 6 ---------   -----------   -----------   -----------   ------------        ----
 7      0.00 0.00 us 0.00 us 0.00 us 30 FORGET
 8      0.00 0.00 us 0.00 us 0.00 us 36 RELEASE
 9      0.00 0.00 us 0.00 us 0.00 us 38 RELEASEDIR
10
11    Duration: 5445 seconds
12   Data Read: 0 bytes
13Data Written: 0 bytes
14
15Interval 0 Stats:
16 %-latency Avg-latency Min-Latency Max-Latency No. of calls Fop
17 ---------   -----------   -----------   -----------   ------------        ----
18      0.00 0.00 us 0.00 us 0.00 us 30 FORGET
19      0.00 0.00 us 0.00 us 0.00 us 36 RELEASE
20      0.00 0.00 us 0.00 us 0.00 us 38 RELEASEDIR
21
22    Duration: 5445 seconds
23   Data Read: 0 bytes
24Data Written: 0 bytes
25. . .

如前面所示,对于在每个节点上运行的所有 GlusterFS 相关组件的列表,请运行gluster 体积状态命令:

1sudo gluster volume status
 1[secondary_label Output]
 2Status of volume: volume1
 3Gluster process TCP Port RDMA Port Online Pid
 4------------------------------------------------------------------------------
 5Brick gluster0.example.com:/gluster-storage 49152 0 Y 19003
 6Brick gluster1.example.com:/gluster-storage 49152 0 Y 19040
 7Self-heal Daemon on localhost N/A N/A Y 19061
 8Self-heal Daemon on gluster0.example.com N/A N/A Y 19836
 9
10Task Status of Volume volume1
11------------------------------------------------------------------------------
12There are no active volume tasks

如果你要管理你的 GlusterFS 存储量,它可能是一个好主意,落入 GlusterFS 控制台. 这将允许你与你的 GlusterFS 环境进行交互,而无需先键入sudo gluster:

1sudo gluster

这会给你一个提示,在那里你可以输入你的命令。‘帮助’是一个很好的,以获得自己导向:

1help
1[secondary_label Output]
2 peer help                - display help for peer commands
3 volume help              - display help for volume commands
4 volume bitrot help       - display help for volume bitrot commands
5 volume quota help        - display help for volume quota commands
6 snapshot help            - display help for snapshot commands
7 global help              - list global commands

当你完成时,运行退出,退出 Gluster 控制台:

1exit

有了它,您已经准备好开始将 GlusterFS 集成到您的下一个应用程序中了。

结论

通过完成本教程,你有一个多余的存储系统,将允许你同时写到两个独立的服务器。

Published At
Categories with 技术
comments powered by Disqus