简介
冗余和高可用性对于各种服务器活动都是必要的。在数据存储方面存在单点故障对于任何关键数据来说都是非常危险的配置。
虽然许多数据库和其他软件允许您在单个应用程序的上下文中分散数据,但其他系统可以在文件系统级别操作,以确保数据在写入磁盘时被复制到另一个位置。像 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-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters
在本地主机定义下面,您应该添加每个 VPS 的 IP 地址,然后是您希望用于引用它的长名称和短名称。
完成后,它应该看起来像这样:
127.0.0.1 localhost hostnamefirst_ip gluster0.droplet.com gluster0second_ip gluster1.droplet.com gluster1third_ip gluster2.droplet.com gluster2# The following lines are desirable for IPv6 capable hosts::1 ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters
gluster0.droplet.com
和 gluster0
部分的行可以更改为您希望用于访问每个 droplet 的任何名称。我们将在本指南中使用这些设置。
完成后,将您添加的行复制并将它们添加到其他 VPS 实例的 /etc/hosts
文件中。每个 /etc/hosts
文件应包含将您的 IP 链接到您选择的名称的行。
完成后保存并关闭每个文件。
设置软件源
尽管 Ubuntu 12.04 包含 GlusterFS 软件包,但它们相当过时,因此我们将使用 GlusterFS 项目的最新稳定版本(截至撰写本文时为版本 3.4)。
我们将在所有将作为我们集群节点的计算机以及客户端计算机上设置软件源。
实际上,我们将添加项目推荐给 Ubuntu 用户的 PPA(个人软件包存档)。这将允许我们使用与其他系统软件相同的工具来管理我们的软件包。
首先,我们需要安装 python-software-properties
软件包,它将允许我们使用 apt 轻松管理 PPA:
sudo apt-get updatesudo 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 实例上重复这些步骤。
安装服务器组件
在本指南中,我们将把两台机器指定为集群成员,第三台机器作为客户端。
我们将配置标记为 gluster0
和 gluster1
的计算机作为集群组件。我们将使用 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: 1Hostname: gluster1.droplet.comPort: 24007Uuid: 7bcba506-3a7a-4c5e-94fa-1aaf83f5729bState: Peer in Cluster (Connected)
此时,我们的两台服务器正在通信,它们可以一起设置存储卷。
创建存储卷
现在我们有了可用的服务器池,我们可以创建我们的第一个存储卷。
因为我们对冗余性感兴趣,我们将设置一个具有复制功能的卷。这将允许我们保留数据的多个副本,避免单点故障。
由于我们希望在每台服务器上都有一份数据副本,我们将把复制选项设置为 “2”,这是我们拥有的服务器数量。我们将使用以下一般语法来创建卷:
sudo gluster volume create <span class="highlight">volume_name</span> replica <span class="highlight">num_of_servers</span> transport tcp <span class="highlight">domain1.com:/path/to/data/directory domain2.com:/path/to/data/directory ...</span> 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
这将安装客户端应用程序,并安装必要的 fuse 文件系统工具,以在内核之外提供文件系统功能。
我们将在客户端计算机上挂载远程存储卷。为此,我们需要创建一个挂载点。传统上,这是在 /mnt
目录中,但可以使用任何方便的位置。
我们将在 /storage-pool
目录下创建一个目录:
sudo mkdir /storage-pool
完成这一步后,我们可以挂载远程卷。为此,我们只需使用以下语法:
sudo mount -t glusterfs <span class="highlight">domain1.com</span>:<span class="highlight">volume_name</span> <span class="highlight">path_to_mount_point</span>
请注意,在挂载命令中我们使用了卷名。GlusterFS 对每个主机的实际存储目录进行了抽象。我们要挂载的不是 /gluster-storage
目录,而是 volume1
卷。
还要注意,我们只需要指定存储集群的一个成员。
我们将运行的实际命令是:
sudo mount -t glusterfs gluster0.droplet.com:/volume1 /storage-pool
这应该会挂载我们的卷。如果使用 df
命令,您将看到我们的 GlusterFS 已经挂载到了正确的位置。
测试冗余功能
现在我们已经设置好了客户端来使用我们的存储池,让我们来测试功能。
在我们的客户端机器(gluster2)上,我们可以输入以下命令将一些文件添加到我们的存储池目录:
cd /storage-poolsudo touch file{1..20}
这将在我们的存储池中创建 20 个文件。
如果我们查看每个存储主机上的 /gluster-storage
目录,我们会发现所有这些文件都存在于每个系统上:
# 在 gluster0.droplet.com 和 gluster1.droplet.com 上cd /gluster-storagels
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 <span class="highlight">gluster_client_IP_addr</span>
您需要在此命令中替换集群客户端(gluster2)的 IP 地址。目前,至少在 /etc/hosts
配置中,域名限制无法正常工作。如果以这种方式设置限制,它将阻止所有流量。您必须改用 IP 地址。
如果需要在任何时候删除限制,可以输入:
sudo gluster volume set volume1 auth.allow *
这将再次允许来自任何计算机的连接。这是不安全的,但可能对调试问题有用。
如果您有多个客户端,可以同时指定它们的 IP 地址,用逗号分隔:
sudo gluster volume set volume1 auth.allow <span class="highlight">gluster_client1_ip</span>,<span class="highlight">gluster_client2_ip</span>
使用 GlusterFS 命令获取信息
当您开始更改一些 GlusterFS 存储的设置时,您可能会对您可以使用的选项、哪些卷是活动的以及每个卷关联的节点感到困惑。
在您的节点上有许多不同的命令可用于检索这些数据并与您的存储池交互。
如果您想要关于每个卷的信息,可以输入:
sudo gluster volume info
Volume Name: volume1Type: ReplicateVolume ID: 3634df4a-90cd-4ef8-9179-3bfa43cca867Status: StartedNumber of Bricks: 1 x 2 = 2Transport-type: tcpBricks:Brick1: gluster0.droplet.com:/gluster-storageBrick2: gluster1.droplet.com:/gluster-storageOptions Reconfigured:auth.allow: 111.111.1.11
类似地,要获取有关此节点连接的对等体的信息,可以输入:
sudo gluster peer status
Number of Peers: 1Hostname: gluster0.droplet.comPort: 24007Uuid: 6f30f38e-b47d-4df1-b106-f33dfd18b265State: Peer in Cluster (Connected)
如果您想要关于每个节点的性能的详细信息,可以通过输入以下命令对卷进行分析:
sudo gluster volume profile <span class="highlight">volume_name</span> start
当此命令完成时,您可以通过输入以下命令获取收集的信息:
sudo gluster volume profile <span class="highlight">volume_name</span> 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 bytesData Written: 0 bytes. . .
通过此命令,您将获得有关每个节点的大量信息。
要获取每个节点上运行的所有与 GlusterFS 相关的组件的列表,可以输入:
sudo gluster volume status
Status of volume: volume1Gluster process Port Online Pid------------------------------------------------------------------------------Brick gluster0.droplet.com:/gluster-storage 49152 Y 2808Brick gluster1.droplet.com:/gluster-storage 49152 Y 2741NFS Server on localhost 2049 Y 3271Self-heal Daemon on localhost N/A Y 2758NFS Server on gluster0.droplet.com 2049 Y 3211Self-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
结论
到这一步,你应该已经拥有了一个冗余存储系统,可以让我们同时向两台独立的服务器写入数据。这对于许多应用程序来说非常有用,并且可以确保我们的数据在一台服务器宕机时仍然可用。