具有 HA-LVM 的高可用性存储
近年来,数据中心一直倾向于选择商品硬件和软件,而不是专有解决方案。他们为什么不应该这样做呢?它可以提供极低的成本和构建首选生态系统的灵活性。唯一的限制是管理员的想象力范围。然而,需要问一个问题:“这种定制的解决方案与专有的、成本更高的同类产品相比如何?”
开源项目已经发展和成熟到足以保持竞争力,并提供同样功能丰富的解决方案,包括卷管理、数据快照、数据去重等等。虽然一个经常被忽视且长期支持的概念是高可用性。
高可用性背后的理念很简单:消除任何单点故障。这确保了如果服务器节点或到底层存储的路径出现故障(计划内或计划外),数据请求仍然可以得到服务。现在,存储部署的解决方案有多个层可以配置为高可用性,这就是本文严格关注 HA-LVM 的原因。
HA-LVM高可用性逻辑卷管理器 (HA-LVM) 是已集成的 LVM 套件的附加组件。它为共享卷启用故障转移配置——也就是说,如果集群中的一台服务器发生故障或因维护而停机,共享存储配置将故障转移到辅助服务器,所有 I/O 请求将在那里不间断地恢复。 HA-LVM 配置是主动/被动配置。这意味着一次只有一台服务器访问共享存储。在许多情况下,这是一种理想的方法,因为某些高级 LVM 功能(例如快照和数据去重)在主动/主动环境(当多台服务器访问共享存储时)中不受支持。
HA-LVM 的一个非常重要的组件是 CLVM 或集群 LVM 守护程序。启用后,CLVM 守护程序可防止 LVM 元数据及其逻辑卷的损坏,如果多台机器进行重叠更改,则会发生损坏。虽然在主动/被动配置中,这就不那么令人担忧了。为了实现这一点,守护程序依赖于分布式锁管理器或 DLM。 DLM 的目的是协调 CLVM 的磁盘访问。
以下示例将集群两台可以访问相同外部存储的服务器(图 1)。此外部存储可以是磁盘驱动器的 RAID 启用或 JBOD 阵列,通过光纤通道、串行连接 SCSI (SAS)、iSCSI 或其他存储区域网络 (SAN) 映射连接到服务器。该配置与存储协议无关,仅要求集群服务器看到相同的共享块设备。

图 1. 访问相同共享存储的两台服务器的示例配置
CLVMCLVM 与 MD RAID 不兼容,因为它尚不支持集群。
CLVM 守护程序CLVM 守护程序在集群中分发 LVM 元数据更新,它必须在集群中的所有节点上运行。
JBODJBOD(或 Just a Bunch Of Disks,仅仅是一堆磁盘)是一种使用多个硬盘驱动器的架构,但不是在冗余配置中。
配置集群几乎所有 Linux 发行版都提供所需的软件包。但是,每个发行版中的名称可能有所不同。您需要在所有参与服务器上安装 lvm2-cluster(在某些发行版中,软件包可能名为 clvm)、Corosync 集群引擎、Red Hat 集群管理器(或 cman)、资源组管理器守护程序(或 rgmanager)及其所有依赖项。即使 Red Hat 集群管理器在其软件包描述中包含同名的 Linux 发行版,大多数与 Red Hat 无关的现代发行版也会在其存储库中列出它。
在所有参与服务器上安装适当的集群软件包后,必须配置集群配置文件以启用集群。为此,创建并修改 /etc/cluster/cluster.conf,内容如下
<cluster name="lvm-cluster" config_version="1">
<cman two_node="1" expected_votes="1" />
<clusternodes>
<clusternode name="serv-0001" nodeid="1">
<fence>
</fence>
</clusternode>
<clusternode name="serv-0002" nodeid="2">
<fence>
</fence>
</clusternode>
</clusternodes>
<logging debug="on">
</logging>
<dlm protocol="tcp" timewarn="500">
</dlm>
<fencedevices>
</fencedevices>
<rm>
</rm>
</cluster>
请注意,clusternode 名称是服务器的主机名(必要时进行更改)。此外,请确保 cluster.conf 文件在集群中的所有服务器上都相同。
需要启动 Red Hat 集群管理器
$ sudo /etc/rc.d/init.d/cman start
Starting cluster:
Checking if cluster has been disabled at boot... [ OK ]
Checking Network Manager... [ OK ]
Global setup... [ OK ]
Loading kernel modules... [ OK ]
Mounting configfs... [ OK ]
Starting cman... [ OK ]
Waiting for quorum... [ OK ]
Starting fenced... [ OK ]
Starting dlm_controld... [ OK ]
Tuning DLM kernel config... [ OK ]
Starting gfs_controld... [ OK ]
Unfencing self... [ OK ]
Joining fence domain... [ OK ]
如果集群中的单个节点未处于活动状态,它将显示为离线
$ sudo clustat
Cluster Status for lvm-cluster @ Sun Aug 3 11:31:51 2014
Member Status: Quorate
Member Name ID Status
------ ---- ---- ------
serv-0001 1 Online, Local
serv-0002 2 Offline
否则,当所有服务器都配置正确并且 cman 服务已启用时,所有节点都将显示 Online
状态
$ sudo clustat
Cluster Status for lvm-cluster @ Sun Aug 3 11:36:43 2014
Member Status: Quorate
Member Name ID Status
------ ---- ---- ------
serv-0001 1 Online
serv-0002 2 Online, Local
您现在拥有一个正常运行的集群。下一步是在高可用性模式下启用集群 LVM。在这种情况下,您有一个来自共享存储阵列的卷映射到两台服务器。两台服务器都能够将此卷观察和访问为 /dev/sdb。
需要为此修改 /etc/lvm/lvm.conf 文件。全局部分中的 locking_type 参数必须设置为值 3。默认情况下设置为 1
# Type of locking to use. Defaults to local file-based
# locking (1).
# Turn locking off by setting to 0 (dangerous: risks metadata
# corruption if LVM2 commands get run concurrently).
# Type 2 uses the external shared library locking_library.
# Type 3 uses built-in clustered locking.
# Type 4 uses read-only locking which forbids any operations
# that might change metadata.
locking_type = 3
在其中一台服务器上,从指定的共享卷创建卷组、逻辑卷和文件系统
$ sudo pvcreate /dev/sdb
$ sudo vgcreate -cy shared_vg /dev/sdb
$ sudo lvcreate -L 50G -n ha_lv shared_vg
$ sudo mkfs.ext4 /dev/shared_vg/ha_lv
$ sudo lvchange -an shared_vg/ha_lv
上面的示例从卷组中划分出一个 50GB 的逻辑卷,然后使用 Extended 4 文件系统对其进行格式化。与 vgcreate
(卷组创建)命令一起使用的 cy
选项为集群锁定启用卷组。与 lvchange
(逻辑卷更改)命令一起使用的 an
选项会停用逻辑卷。您将依赖 CLVM 和资源管理器(请阅读下文)守护程序来处理基于在之前创建的同一 /etc/cluster/cluster.conf 文件中进行的故障转移功能添加的激活。激活后,可以从 /dev/shared_vg/ha_lv 访问共享卷。
将必要的故障转移详细信息添加到 cluster.conf 文件
<rm>
<failoverdomains>
<failoverdomain name="FD" ordered="1" restricted="0">
<failoverdomainnode name="serv-0001" priority="1"/>
<failoverdomainnode name="serv-0002" priority="2"/>
</failoverdomain>
</failoverdomains>
<resources>
<lvm name="lvm" vg_name="shared_vg" lv_name="ha-lv"/>
<fs name="FS" device="/dev/shared_vg/ha-lv"
↪force_fsck="0" force_unmount="1" fsid="64050"
↪fstype="ext4" mountpoint="/mnt" options=""
↪self_fence="0"/>
</resources>
<service autostart="1" domain="FD" name="serv"
↪recovery="relocate">
<lvm ref="lvm"/>
<fs ref="FS"/>
</service>
</rm>
cluster.conf 文件的“rm”部分使用资源管理器(或 rgmanager)。在此配置文件的添加中,您通知集群管理器 serv-0001 应该首先拥有并独占访问共享卷。它将本地挂载在 /mnt 绝对路径。如果 serv-0001 因任何原因宕机,资源管理器将执行故障转移,这将启用对共享卷的独占访问,该共享卷挂载在 serv-0002 的 /mnt 上。发送到 serv-0001 的所有挂起的 I/O 请求将在 serv-0002 上恢复。
在所有服务器上,重新启动 cman 服务以启用新配置
$ sudo /etc/rc.d/init.d/cman restart
此外,在所有服务器上,启动 rgmanager 和 clvmd 服务
$ sudo /etc/rc.d/init.d/rgmanager start
Starting Cluster Service Manager: [ OK ]
$ sudo /etc/rc.d/init.d/clvmd start
Starting clvmd: [ OK ]
假设没有观察到任何错误,您现在应该有一个以主动/被动配置运行的集群。您可以通过检查所有服务器上共享卷的可访问性来验证这一点。它应该在 serv-0001 上可见、启用和挂载,而不是在 serv-0002 上。现在到了关键时刻——即测试故障转移。手动关闭 serv-0001 的电源。您将注意到 rgmanager 开始工作并在 serv-0002 上启用/挂载卷。
注意要在重新启动时自动启用这些服务,请使用 chkconfig 在所有适当的运行级别启动这些服务。
总结在理想配置中,需要在 /etc/cluster/cluster.conf 文件中配置 fencing agents(隔离代理)。隔离代理的目的是在问题节点对集群造成明显问题之前处理它。例如,如果服务器遭受内核崩溃、未与集群中的其他服务器通信或发生其他同样具有破坏性的情况,则可以将 IPMI 实用程序配置为重新启动有问题的服务器
<clusternode name="serv-0001" nodeid="1">
<fence>
<method name="1">
<device name="ipmirecover1"/>
</method>
</fence>
</clusternode>
<clusternode name="serv-0002" nodeid="2">
<fence>
<method name="1">
<device name="ipmirecover2"/>
</method>
</fence>
</clusternode>
[ ... ]
<fencedevices>
<fencedevice agent="fence_ipmilan" ipaddr="192.168.1.50"
↪login="ADMIN" passwd="ADMIN" name="ipmirecover1"/>
<fencedevice agent="fence_ipmilan" ipaddr="192.168.10"
↪login="ADMIN" passwd="ADMIN" name="ipmirecover2"/>
</fencedevices>
HA-LVM 的主要目标是以极低的价格为数据中心提供企业级容错能力。没有人希望经历服务器停机,并且通过适当的配置,没有人必须经历服务器停机。从数据中心到您的家庭办公室,此解决方案几乎可以部署在任何地方。
资源clvmd(8):Linux 手册页
附录 F. 高可用性 LVM (HA-LVM):https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Cluster_Administration/ap-ha-halvm-CA.html