Fedora Linux 中的 DRBD 资源上的集群 LVM

(从 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 参数必须包含一个 网络 地址。我们配置 corosynceth1 接口上工作,将我们的节点通过 1Gbps 网络背靠背连接。此外,我们应该配置 iptables 以接受两个主机上的多播流量。

值得注意的是,这些配置应该在两个集群节点上完全相同。

在准备好集群后,我们可以更改两个 drbd 连接节点上的 /etc/lvm/lvm.conf 中的 LVM 锁定类型

global {
  ...
  locking_type = 3
  ...
}

启动 drbd 对等体上的 cmanclvmd 服务,并使我们的集群准备好运行

(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 会处理可能的并发元数据更改。

标签:

引用/Pingbacks

  1.  Fedora Linux 中的 DRBD 资源上的集群 LVM « « Boston 2 Phoenix Boston 2 Phoenix
  2.  Fedora Linux 中的 DRBD 资源上的集群 LVM - Boston 2 Phoenix
  3.  Lineo 的 Warp 2 在 4 秒内启动到 Fedora,MPC Data 的 SwiftBoot 瞬间启动嵌入式 Linux

发表评论

您的电子邮件地址将不会被公开。 必填字段已标记 *