如何在Ubuntu服务器上使用GlusterFS创建一个冗余存储池

GlusterFS是一种技术,可以让你创建一个从网络访问的存储池。使用这个软件,在这篇文章中,我们将讨论如何才能创建跨多个服务器的冗余存储,以确保您的数据是可用的,无论如果一台服务器出现故障。

介绍


冗余和高可用性对于各种各样的服务器活动是必要的。在数据存储方面具有单点故障是任何关键数据的非常危险的配置。 虽然许多数据库和其他软件允许您在单个应用程序的上下文中传播数据,但其他系统可以在文件系统级别上操作,以确保数据在写入磁盘时被复制到另一个位置。像GlusterFS集群存储解决方案提供了这个确切的功能。 在本指南中,我们将在两个64位Ubuntu 12.04 VPS实例之间设置冗余的GlusterFS集群。这将类似于具有镜像RAID的NAS服务器。然后,我们将从第三个64位Ubuntu 12.04 VPS访问集群。

一般概念


集群环境允许您集中资源(通常是计算或存储),以允许您将各种计算机视为一个更强大的单元。使用GlusterFS,我们能够汇集各种VPS实例的存储,并像访问单个服务器一样访问它们。 GlusterFS允许您创建不同类型的存储配置,其中许多在功能上类似于RAID级别。例如,您可以在集群中的不同节点之间分条数据,或者可以实现冗余以获得更好的数据可用性。 在本指南中,我们将创建一个冗余群集存储阵列,也称为分布式文件系统。基本上,这将允许我们通过网络具有与镜像RAID配置类似的功能。每个独立的服务器将包含它自己的数据副本,允许我们的应用程序访问副本,这将有助于分配我们的读取负载。

在每个VPS采取的步骤


我们将在本指南使用的每个VPS实例上采取一些步骤。我们将需要在每个主机之间配置DNS解析,并设置我们将用于安装GlusterFS软件包的软件源。

配置DNS解析


为了使我们的不同组件能够轻松地相互通信,最好在每台计算机之间设置某种主机名解析。 如果你有,你想在每次系统配置为指向一个域名,就可以按照本指南,建立域名与DigitalOcean 。 如果您没有空闲的域名,或者如果您只想快速轻松地设置某些内容,可以在每台计算机上编辑hosts文件。 在您的第一台计算机上以root权限打开此文件:
sudo nano /etc/hosts
你应该看到这样的东西:
127.0.0.1       localhost gluster2

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
在本地主机定义下面,您应该添加每个VPS的IP地址,然后添加要用于引用它的长名称和短名称。 完成后应该看起来像这样:
127.0.0.1       localhost hostname
first_ip gluster0.droplet.com gluster0
second_ip gluster1.droplet.com gluster1
third_ip gluster2.droplet.com gluster2

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
gluster0.droplet.comgluster0线的部分可改为任何名义您想使用它来访问每个Droplet。我们将使用本指南的这些设置。 当您完成,复制添加的行,并将其添加到/etc/hosts上的其他VPS实例文件。 每个/etc/hosts文件应包含您的IP地址链接到你所选择的名称的行。 完成后保存并关闭每个文件。

设置软件源


虽然Ubuntu 12.04包含GlusterFS软件包,但是它们是相当过时的,所以我们将在GlusterFS项目中使用最新的稳定版本(3.4版本)。 我们将在将用作集群中以及客户端计算机上的节点的所有计算机上设置软件源。 我们实际上将添加一个PPA(个人包存档),该项目为Ubuntu用户推荐。这将允许我们使用与其他系统软件相同的工具来管理我们的软件包。 首先,我们需要安装python-software-properties包,它将使我们能够用apt轻松管理的PPA:
sudo apt-get update
sudo apt-get install python-software-properties
安装PPA工具后,我们可以通过键入以下内容为GlusterFS软件包添加PPA:
sudo add-apt-repository ppa:semiosis/ubuntu-glusterfs-3.4
添加PPA后,我们需要刷新本地包数据库,以便我们的系统了解PPA提供的新包:
sudo apt-get update
在您用于本指南的所有VPS实例上重复这些步骤。

安装服务器组件


在本指南中,我们将把两台机器指定为集群成员,第三台作为客户端。 我们将配置我们打成计算机gluster0gluster1作为群集组件。 我们将使用gluster2作为客户端。 在我们的集群成员机器(gluster0和gluster1)上,我们可以通过键入以下命令来安装GlusterFS服务器包:
sudo apt-get install glusterfs-server
一旦在两个节点上安装,我们可以开始设置我们的存储卷。 在其中一台主机上,我们需要与第二台主机对等。你使用哪个服务器无关紧要,但为了简单起见,我们将从gluster0服务器执行这些命令:
sudo gluster peer probe gluster1.droplet.com

peer probe: success
这意味着对等是成功的。我们可以通过键入在任何时间检查节点是否正在通信:
sudo gluster peer status

Number of Peers: 1

Hostname: gluster1.droplet.com
Port: 24007
Uuid: 7bcba506-3a7a-4c5e-94fa-1aaf83f5729b
State: Peer in Cluster (Connected)
在这一点上,我们的两个服务器正在通信,他们可以一起设置存储卷。

创建存储卷


现在我们有了我们的服务器池,我们可以做出我们的第一卷。 因为我们对冗余感兴趣,我们将设置一个具有副本功能的卷。这将允许我们保存我们的数据的多个副本,从而将我们从单个故障点中节省下来。 由于我们需要在每个服务器上存储一个数据副本,因此我们将副本选项设置为“2”,这是我们拥有的服务器数量。我们将用来创建卷的一般语法是:
sudo gluster volume create volume_name replica num_of_servers transport tcp domain1.com:/path/to/data/directory domain2.com:/path/to/data/directory ... force
我们将运行的确切命令是:
sudo gluster volume create volume1 replica 2 transport tcp gluster0.droplet.com:/gluster-storage gluster1.droplet.com:/gluster-storage force

volume create: volume1: success: please start the volume to access data
这将创建一个名为卷volume1 。 它会从这个量在目录中每个主机上存储数据/gluster-storage 。如果此目录不存在,将创建它。 此时,我们的卷已创建,但处于非活动状态。我们可以通过键入以下内容来启动卷并使其可用:
sudo gluster volume start volume1

volume start: volume1: success
我们的卷目前应该在线。

安装和配置客户端组件


现在我们已经配置了卷,它可以由我们的客户端机器使用。 在我们开始之前,我们需要从我们之前设置的PPA中实际安装相关的包。 在您的客户端计算机(本示例中为gluster2)中,键入:
sudo apt-get install glusterfs-client
这将安装客户端应用程序,并且还安装必要的熔丝文件系统工具,以在内核之外提供文件系统功能。 我们将在我们的客户端计算机上安装我们的远程存储卷。为了做到这一点,我们需要创建一个挂载点。传统上,这是在/mnt目录,但在任何地方方便可以使用。 我们将创建在目录/storage-pool
sudo mkdir /storage-pool
通过这个步骤,我们可以挂载远程卷。为此,我们只需要使用以下语法:
sudo mount -t glusterfs domain1.com:volume_name path_to_mount_point
请注意,我们正在使用mount命令中的卷名称。 GlusterFS抽象每个主机上的实际存储目录。我们并不想安装/gluster-storage目录,但是volume1音量。 还要注意,我们只需要指定存储集群的一个成员。 我们要运行的实际命令是:
sudo mount -t glusterfs gluster0.droplet.com:/volume1 /storage-pool
这应该安装我们的卷。如果我们使用df命令,你会看到,我们有我们的GlusterFS安装在正确的位置。

测试冗余特性


现在我们已经设置我们的客户端使用我们的存储池,让我们测试功能。 在我们的客户端机器(gluster2)上,我们可以键入此命令以将一些文件添加到我们的存储池目录中:
cd /storage-pool
sudo touch file{1..20}
这将在我们的存储池中创建20个文件。 如果我们看一下我们/gluster-storage每个存储主机上的目录,我们将看到所有这些文件都存在在每个系统上:
# on gluster0.droplet.com and gluster1.droplet.com
cd /gluster-storage
ls

file1  file10  file11  file12  file13  file14  file15  file16  file17  file18  file19  file2  file20  file3  file4  file5  file6  file7  file8  file9
正如你可以看到的,这已经将数据从我们的客户端写入我们的两个节点。 如果有一个点,其中存储集群中的一个节点发生故障,并对文件系统进行更改。在节点恢复联机后对客户端安装点执行读取操作时,应提醒它以获取任何丢失的文件:
ls /storage-pool

限制对卷的访问


现在我们已经验证了我们的存储池可以挂载并复制数据到集群中的两台机器,我们应该锁定我们的池。 目前,任何计算机都可以连接到我们的存储卷,没有任何限制。我们可以通过在我们的音量上设置一个选项来改变。 在其中一个存储节点上,键入:
sudo gluster volume set volume1 auth.allow gluster_client_IP_addr
您必须在此命令中替换集群客户端(gluster2)的IP地址。目前,至少在/etc/hosts配置域名限制无法正常工作。如果您以这种方式设置限制,则会阻止所有流量。您必须使用IP地址。 如果您需要在任何时候删除限制,您可以键入:
sudo gluster volume set volume1 auth.allow *
这将允许再次从任何机器连接。这是不安全的,但可能对调试问题有用。 如果您有多个客户端,则可以同时指定其IP地址,以逗号分隔:
sudo gluster volume set volume1 auth.allow gluster_client1_ip,gluster_client2_ip

使用GlusterFS命令获取信息


当您开始更改GlusterFS存储的某些设置时,您可能会对您可用的选项,哪些卷是活动的以及哪些节点与每个卷相关联而感到困惑。 在节点上有多个不同的命令可用于检索此数据并与存储池进行交互。 如果需要有关每个卷的信息,请键入:
sudo gluster volume info

Volume Name: volume1
Type: Replicate
Volume ID: 3634df4a-90cd-4ef8-9179-3bfa43cca867
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gluster0.droplet.com:/gluster-storage
Brick2: gluster1.droplet.com:/gluster-storage
Options Reconfigured:
auth.allow: 111.111.1.11
类似地,要获取有关此节点所连接的对等端的信息,您可以键入:
sudo gluster peer status

Number of Peers: 1

Hostname: gluster0.droplet.com
Port: 24007
Uuid: 6f30f38e-b47d-4df1-b106-f33dfd18b265
State: Peer in Cluster (Connected)
如果需要有关每个节点的性能的详细信息,可以键入以下内容对卷进行概要分析:
sudo gluster volume profile volume_name start
此命令完成后,您可以通过键入以下内容获取收集的信息:
sudo gluster volume profile volume_name info
Brick: gluster1.droplet.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             20     RELEASE
      0.00       0.00 us       0.00 us       0.00 us              6  RELEASEDIR
     10.80     113.00 us     113.00 us     113.00 us              1    GETXATTR
     28.68     150.00 us     139.00 us     161.00 us              2      STATFS
     60.52     158.25 us     117.00 us     226.00 us              4      LOOKUP
 
    Duration: 8629 seconds
   Data Read: 0 bytes
Data Written: 0 bytes
. . .
使用此命令,您将收到大量关于每个节点的信息。 有关在每个节点上运行的所有GlusterFS关联组件的列表,您可以键入:
sudo gluster volume status

Status of volume: volume1
Gluster process                                         Port    Online  Pid
------------------------------------------------------------------------------
Brick gluster0.droplet.com:/gluster-storage             49152   Y       2808
Brick gluster1.droplet.com:/gluster-storage             49152   Y       2741
NFS Server on localhost                                 2049    Y       3271
Self-heal Daemon on localhost                           N/A     Y       2758
NFS Server on gluster0.droplet.com                      2049    Y       3211
Self-heal Daemon on gluster0.droplet.com                N/A     Y       2825

There are no active volume tasks
如果您要管理GlusterFS存储卷,最好放入GlusterFS控制台。这将允许您无需输入您的GlusterFS环境互动sudo gluster一切之前:
sudo gluster
这将给您一个提示,您可以在其中键入命令。这是一个好的自我定位:
help
当你完成后,退出如下:
exit

结论


在这一点上,您应该有一个冗余存储系统,这将允许我们同时写入两个单独的服务器。这对于大量应用程序非常有用,并且可以确保即使在一个服务器出现故障时我们的数据也可用。