(从 Mirantis 官方博客 转载)
正如 Florian Haas 在我上一篇帖子的评论中 指出的那样,我们的共享存储配置需要采取特殊预防措施,以避免当通过 DRBD 连接的两个主机同时尝试管理 LVM 卷时发生数据损坏。通常,这些预防措施涉及在 DRBD 以“双主”模式运行时锁定 LVM 元数据操作。
让我们详细研究一下。LVM 锁定机制配置在 /etc/lvm/lvm.conf 的 [global] 部分。‘locking_type’ 参数在这里是最重要的。它定义了在更改元数据时使用哪种锁定 LVM。它可以等于
- ‘0’:完全禁用锁定 – 使用起来很危险;
- ‘1’:默认值,基于本地文件的锁定。它不知道集群和可能的冲突元数据更改;
- ‘2’:使用外部共享库,由 ‘locking_library’ 参数定义;
- ‘3’:使用内置的 LVM 集群锁定;
- ‘4’:只读锁定,禁止任何元数据更改。
最简单的方法是在 drbd 对等体之一上使用本地锁定,并在另一个上禁用元数据操作。然而,这有一个严重的缺点:我们无法在另一个“被动”对等体上自动激活我们的卷组和逻辑卷。对于生产环境来说,这不好,并且难以自动化。
但是,还有另一种更复杂的方法。我们可以使用 Linux-HA (Heartbeat) 结合 LVM 资源代理。它自动激活共享存储上新创建的 LVM 资源,但仍然不提供适用于“双主”DRBD 操作的锁定机制。
应该注意的是,可以通过存储库中的 lvm2-cluster Fedora RPM 包来实现 LVM 的完整集群锁定支持。它包含 clvmd 服务,该服务在集群中的所有主机上运行,并控制共享存储上的 LVM 锁定。在这种情况下,集群中只有 2 个 drbd 对等体。
clvmd 需要一个集群引擎才能正常工作。它由安装为 lvm2-cluster 的依赖项的 cman 服务提供(其他依赖项可能因安装而异)
(drbd-node1)# yum install clvmd
...
已解决依赖关系
================================================================================
软件包 架构 版本 仓库 大小
================================================================================
正在安装
lvm2-cluster x86_64 2.02.84-1.fc15 fedora 331k
正在安装依赖项
clusterlib x86_64 3.1.1-1.fc15 fedora 70k
cman x86_64 3.1.1-1.fc15 fedora 364k
fence-agents x86_64 3.1.4-1.fc15 updates 182k
fence-virt x86_64 0.2.1-4.fc15 fedora 33k
ipmitool x86_64 1.8.11-6.fc15 fedora 273k
lm_sensors-libs x86_64 3.3.0-2.fc15 fedora 36k
modcluster x86_64 0.18.7-1.fc15 fedora 187k
net-snmp-libs x86_64 1:5.6.1-7.fc15 fedora 1.6M
net-snmp-utils x86_64 1:5.6.1-7.fc15 fedora 180k
oddjob x86_64 0.31-2.fc15 fedora 61k
openais x86_64 1.1.4-2.fc15 fedora 190k
openaislib x86_64 1.1.4-2.fc15 fedora 88k
perl-Net-Telnet noarch 3.03-12.fc15 fedora 55k
pexpect noarch 2.3-6.fc15 fedora 141k
python-suds noarch 0.3.9-3.fc15 fedora 195k
ricci x86_64 0.18.7-1.fc15 fedora 584k
sg3_utils x86_64 1.29-3.fc15 fedora 465k
sg3_utils-libs x86_64 1.29-3.fc15 fedora 54k
事务摘要
================================================================================
安装 19 个软件包
我们需要的集群仅仅是为了使用 clvmd;集群本身的配置非常基本。由于我们不需要诸如自动 围栏 等高级功能,因此我们指定手动处理。由于集群中只有 2 个节点,我们可以告诉 cman 关于它。cman 的配置位于 /etc/cluster/cluster.conf 文件中
<?xml version="1.0"?>
<cluster name="cluster" config_version="1">
<!-- post_join_delay: 守护程序在节点加入域后等待的秒数,以
围栏任何受害者 -->
post_fail_delay: 守护程序在域成员失败后等待的秒数,以
围栏任何受害者 -->
clean_start : 防止守护程序可能执行的任何启动围栏。
它表示守护程序应假定所有节点
处于干净状态才能启动。 -->
<fence_daemon clean_start="0" post_fail_delay="0" post_join_delay="3"/>
<clusternodes>
<clusternode name="drbd-node1" votes="1" nodeid="1">
<fence>
<!-- 手动处理围栏 -->
<method name="human">
<device name="human" nodename="drbd-node1"/>
</method>
</fence>
</clusternode>
<clusternode name="drbd-node2" votes="1" nodeid="2">
<fence>
<!-- 手动处理围栏 -->
<method name="human">
<device name="human" nodename="drbd-node2"/>
</method>
</fence>
</clusternode>
</clusternodes>
<!-- cman 两个节点规范 -->
<cman expected_votes="1" two_node="1"/>
<fencedevices>
<!-- 定义手动围栏 -->
<fencedevice name="human" agent="fence_manual"/>
</fencedevices>
</cluster>
clusternode name 应该是完全限定域名,并且应该由 DNS 解析或存在于 /etc/hosts 中。votes 的数量用于确定集群的 仲裁。在这种情况下,我们有 2 个节点,每个节点 1 票,并期望 1 票才能使集群运行(拥有仲裁),如 cman expected 属性配置的那样。
我们需要配置的第二件事是集群引擎(corosync)。它的配置进入 /etc/corosync/corosync.conf
compatibility: whitetank
totem {
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 10.0.0.0
mcastaddr: 226.94.1.1
mcastport: 5405
}
}
logging {
fileline: off
to_stderr: no
to_logfile: yes
to_syslog: yes
# 日志文件的路径名
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode: disabled
}
bindinetaddr 参数必须包含一个 网络 地址。我们配置 corosync 在 eth1 接口上工作,将我们的节点通过 1Gbps 网络背靠背连接。此外,我们应该配置 iptables 以接受两个主机上的多播流量。
值得注意的是,这些配置应该在两个集群节点上完全相同。
在准备好集群后,我们可以更改两个 drbd 连接节点上的 /etc/lvm/lvm.conf 中的 LVM 锁定类型
global {
...
locking_type = 3
...
}
启动 drbd 对等体上的 cman 和 clvmd 服务,并使我们的集群准备好运行
(drbd-node1)# service cman start
正在启动集群
正在检查集群是否在启动时被禁用... [ OK ]
正在检查 Network Manager... [ OK ]
全局设置... [ OK ]
正在加载内核模块... [ OK ]
正在挂载 configfs... [ OK ]
正在启动 cman... [ OK ]
正在等待仲裁... [ OK ]
正在启动 fenced... [ OK ]
正在启动 dlm_controld... [ OK ]
正在解除 self 的围栏... [ OK ]
正在加入围栏域... [ OK ]
(drbd-node1)# service clvmd start
正在启动 clvmd
正在激活 VG(s): 卷组 "vg-sys" 中的 2 个逻辑卷现在处于活动状态
卷组 "vg_shared" 中的 2 个逻辑卷现在处于活动状态
[ OK ]
现在,由于我们已经在共享存储上拥有一个卷组,因此可以轻松地使其感知集群
(drbd-node1)# vgchange -c y vg_shared
现在我们在 VG 属性中看到 ‘c’ 标志
(drbd-node1)# vgs
VG #PV #LV #SN Attr VSize VFree
vg_shared 1 3 0 wz--nc 1.29t 1.04t
vg_sys 1 2 0 wz--n- 19.97g 5.97g
因此,在 vg_shared 卷组中创建的逻辑卷将在两个节点上处于活动状态,并且针对此组中卷的操作启用了集群锁定。可以在两个主机上发出 LVM 命令,并且 clvmd 会处理可能的并发元数据更改。
发表评论