状态: 已弃用
本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.
请参阅: 本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。
介绍
对于非常广泛的服务器活动,冗余和高可用性是必要的。 在数据存储方面存在单点故障对于任何关键数据都是非常危险的配置。
虽然许多数据库和其他软件允许您在单个应用程序的上下文中分散数据,但其他系统可以在文件系统级别上运行,以确保在将数据写入磁盘时将其复制到另一个位置。 像 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 主机名first_ip gluster0.droplet.com gluster0 second_ip gluster1.droplet.com gluster1 第三个_ip gluster2.droplet.com gluster2 以下行对于支持 IPv6 的主机是可取的 ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
行的 gluster0.droplet.com
和 gluster0
部分可以更改为您想用来访问每个液滴的任何名称。 我们将在本指南中使用这些设置。
完成后,复制您添加的行并将它们添加到其他 VPS 实例上的 /etc/hosts
文件中。 每个 /etc/hosts
文件应包含将您的 IP 链接到您选择的名称的行。
完成后保存并关闭每个文件。
设置软件源
尽管 Ubuntu 12.04 包含 GlusterFS 包,但它们已经过时了,因此我们将使用 GlusterFS 项目中截至撰写本文时的最新稳定版本(版本 3.4)。
我们将在作为集群内节点的所有计算机以及客户端计算机上设置软件源。
实际上,我们将添加项目推荐给 Ubuntu 用户的 PPA(个人软件包存档)。 这将使我们能够使用与其他系统软件相同的工具来管理我们的软件包。
首先,我们需要安装 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 实例上重复这些步骤。
安装服务器组件
在本指南中,我们将把我们的两台机器指定为集群成员,将第三台指定为客户端。
我们将配置我们标记为 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: 1 Hostname: gluster1.droplet.com Port: 24007 Uuid: 7bcba506-3a7a-4c5e-94fa-1aaf83f5729b State: Peer in Cluster (Connected)
此时,我们的两台服务器正在通信,它们可以一起设置存储卷。
创建存储卷
现在我们有了可用的服务器池,我们可以制作我们的第一卷。
因为我们对冗余感兴趣,所以我们将设置一个具有副本功能的卷。 这将使我们能够保留数据的多个副本,从而使我们免于单点故障。
由于我们希望每台服务器上都有一份数据副本,因此我们将副本选项设置为“2”,即我们拥有的服务器数量。 我们将用来创建卷的一般语法是这样的:
sudo gluster 卷创建卷名副本num_of_servers传输 tcp domain1.com :/路径/到/数据/目录 domain2.com :/path/to/data/directory …强制
我们将运行的确切命令是这样的:
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 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 卷集 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_name开始
此命令完成后,您可以通过键入以下内容获取收集的信息:
sudo gluster 卷配置文件volume_name信息
砖: gluster1.droplet.com :/gluster-存储
累积统计:%-latency Avg-latency Min-Latency Max-Latency No. 通话次数 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
数据读取:0 字节数据写入:0 字节。 . .
使用此命令,您将收到有关每个节点的大量信息。
对于在每个节点上运行的所有 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
结论
此时,您应该有一个冗余存储系统,允许我们同时写入两个单独的服务器。 这对于大量应用程序很有用,并且即使在一台服务器出现故障时也可以确保我们的数据可用。