利用Linux和GFS打造集群存储

25次阅读

负载均衡是一项困难的任务。我们经常需要通过 NFS(网络文件系统)或其他机制来为数据提供中心地址,从而共享文件系统。虽然你的安全机制可能可以让你免于 Web 服务器节点的故障,但是你仍然需要通过中央存储节点来共享数据。

通过 GFS(全局文件系统)——Linux的一个免费集群文件系统——你可以创建一个不需要依赖其他服务器的真正稳定的集群。在这篇文章中,我们将展示如何正确地设置 GFS.

从概念上来说,一个集群文件系统可以允许多个操作系统载入同一个文件系统并可以在同一时间内向同一文件系统写入数据。现在有许多集群文件系统,包括 Sun 的 Lustre,Oracle 的 OCFS(Oracle 集群文件系统),以及 Linux 的 GFS.

有许多方法可以让一个块设备同时被多个服务器所使用。你可以分区出一个对多个服务器都可视的 SAN(存储局域网)LUN(逻辑单元号),设置好相应的 iSCSI(互联网小型计算机系统接口),或使用 DRBD(分布式复制块设备)在两台服务器之间复制一个分区。在使用 DRBD 的时候,你将需要在主 / 主节点中设置好 DRBD 以使用 GFS.

GFS 要求

运行 GFS 意味着你在运行一个集群。目前为止,运行 GFS 的最简单的手段就是使用 Red Hat Cluster Suite(RHCS:Red Hat 集群套件)。这个套件在 CentOS 中就有。此外,还需要下面这些包:cman——集群管理器;lvm2-cluster——使 LVM(逻辑卷管理器)可以支持集群的 CLVM(集群逻辑卷管理器)包;kmod-gfs——GFS 内核模块; 最后是 gfs-utils.

集群管理器 (cman) 包含必要的工具,比如分布式锁管理器。除非你希望花时间来确认各种不同的分发版本是如何采用 cman 的,否则我们强烈推荐使用 CentOS 或 RHEL. 同时,你还将获得 RH(Red Hat)所维护的各种最新版本的集群服务,此外你还可以获得一个比较稳定的环境。

Fencing(阻绝)机制是绝对必要的。一些指导性文章建议将阻绝模式设定成 ” 手动 ”,因为阻绝设置有可能比较复杂。阻绝意味在集群中进行隔离,或马上中断某些危险节点的运作。如果集群无法阻绝某个发生故障的节点,那么你的 GFS 将会出现很多问题,因此不要跳过这个步骤。

创建集群设置

你可以通过 /etc/cluster/ 里面的 cluster.conf 完成大部分的集群设置。我不建议使用各种集群管理应用程序来创建这个设置文件。即使是完全支持的 RHEL 应用程序,比如两个月前发布的 Conga,也经常会创建一些无效的 cluster.conf 文件,并且无法被必要的服务所解析。

下面是一个 cluster.conf 文件的例子。这个设置文件采用漂亮的 XML 格式,其内容非常直接。首先,我们对集群进行命名,我们将这个集群称作 ”Web.1″.

先跳过 fence daemon 选项,下一个部分就是集群主体的设置内容。你需要在 clusternodes 部分定义两个节点。设置文件将同时存放在两个节点上,这样这两个节点就都知道彼此的情况。

集群内的每个节点都声明其阻绝方式的名称是独一无二的。在 clusternames 结束标签下面,我们看到 fencedevice 部分定义了每个节点如何阻绝其他节点的方式。使用一个支持 IPMI(智能平台管理接口)的服务器是最好的方式,而且其设置也是相当简单。你只要将 IPMI 的地点以及登录方式告诉 IP 就可以了。为了避免在 cluster.conf 中留下密码,你可以将它指向一个由根所拥有的脚本并由这个脚本来返回密码。

我们还要指出的是我们在设置中定义了两个节点。这是必须的,因为通常来说,除非大部分节点都同意自己的状态,否则集群无法达到 ”Quorate” 状态。如果只有两个节点的话,没有肯定多数,因此这种方式让集群只能在两个节点下工作,而不能只在只有一个节点的情况下工作。这是设置基本集群的必要方式。

在每个节点上运行 ”service cman start”,系统应该可以开始正常运作。你可以检查 ”clustat” 或 ”cman nodes” 来确认节点是否良好运行。如果有哪个必要的部分没有启动,那么集群将不会显示 ”Quorate” 状态。

GFS 设置

首先,我们需要设置 CLVM,这样我们才可以通过 GFS 使用 LVM. 激活 CLVM 只要在 lvm.conf 中设定 ”locking type=3″ 就可以了。

然后,就像平常一样创建一个 LVM 卷组和卷,但是使用的是共享的块设备。如果你使用的是 DRBD,你将有可能使用 /dev/drbd0. 我创建了一个物理卷,然后创建一个名为 vg01 的卷组,然后创建一个名为 web1 的逻辑卷,这个卷在:/dev/vg01/web1.

最后,我们需要创建文件系统:

gfs_mkfs -t web1:mygfs -p lock_dlm -j 2 /dev/vg01/web1

- t 中给定的名称必须是集群的名称,然后后面是你给这个文件系统所起的名字。只有 web1 集群的成员才可以载入这个文件系统。然后,设定分布式锁管理器的锁钥类型,指明你需要两份 journal(因为这是一个双节点集群)。如果你预计未来要增加更多的节点,那么你需要在这时设定足够高的 journal 数量。

总结

我们现在可以开始使用这个文件系统了。在两个节点上启动 ”clvmd” 和 ”gfs” 服务。现在你就可以通过 ”-t gfs” 来将类型指定为 GFS,从而载入文件系统。

在开始启动之前,一定要设定好 cman,clvmd 和 gfs 服务。你最好能熟悉 clustat 和 gfs_tool 命令,因为在系统出现问题的时候,你可以用这些命令来查找问题所在。

不要指望 GFS 能很快。如果有一个节点在进行大量的写入操作的话,那么在访问文件系统的时候出现停顿是很正常的。对于一个数据读取操作比数据写入操作多得多的 Web 集群来说,这倒不是什么问题。如果出现明显延迟,那么首先要检查一下所有组件的状况,然后评估正在写入的数据。防止延迟现象的最常见措施就是确保 HTTP 对话中的数据不是写入 GFS 卷。

 

正文完