qdisk

最近在安装配置虚拟机,看到redhat中文官网上的一篇文章写的挺好,和大家分享一下,也帮住同行们减少网上搜索的时间。

原文请参考:http://www.redhatmagazine.com/20 ... rum-with-qdiskQDisk支持少数量集群环境,Red Hat Enterprise Linux 4.4 以上及5.0以上才支持QDisk。

问题提出:多个节点失败使整个集群不正常

假设你配置好你的WEB服务环境,Red HatClustering能够通过多台机器提供可扩展的性能以及一个节点失败,集群会自动切换服务到另一节点。但有时候事情并不是想像的那样,甚至更坏。比如,一个四节点的集群环境,一旦两个节点故障,整个集群就会挂起,停止服务。这并不是我们希望的情况。
本文就是解释如何使用QDisk工具来发挥共享存储优势,达到你的应用运行连续性要求。

什么是Quorum, quorate, QDisk?
  集群(clustering)是一个“聚集”问题,它基于成员能力,它还具有民主特征并通过投票来决定下一步的行为。例如重启一台挂起的机器等。对于一个完全的民主的环境,超过半数的选票是必须的。所以Quorum就是集群存在的最少个数。这样对于一个3节点的集群, 最少需要2个节点激活才有效。一个6节点集群最少需要4个节点激活, 以此类推,公式一般就是集群至少有(n/2+1)个节点数就会建立Quorate状态,也就存在Quorum(仲裁),集群才能工作。

   

RedHat Cluster Suite 在Enterprise Linux2.1使用共享磁盘分区来协调集群状态,IP网络作为备份。在Enterprise Linux3切换IP网络作为主要协调集群状态而共享磁盘分区作为备份。在Enterprise Linux 4和5,Cluster Suite结合了GFS(全局文件系统)使用IP网络作为协调机制,不再需要Quorum分区。这样集群也可以在没有SAN共享盘阵下运行,再加上基于IP网络的仲裁具有更好的更扩展性,尤其在大规模集群节点环境中(大于16个节点)但是当集群节点没有那么多的时候,比如9个节点的集群,虽说失去足够多的节点来破坏Quorum的机会很少,但是只要4个以上的节点失败,整个集的Quorum就没有了,集群也就不能正常工作。但对于3-4个节点的案例,只要2台机器故障,整个集群就会有问题,这种案例又很多。当然你可以通过增加冗余的机器来增加Quorum计数,但这样太不现 实,尤其是如果你本身就配置了SAN存储情况下。所以一种替代的方法,我们可通过已有的SAN共享存储的一 小块分区来支持Quorum。

Quorum Disk (QDisk) (仲裁机制)
  为了解决小规模集群存在的Quorum问题,Red Hat Cluster Suite参照 RHEL3下面的cluster的Quorum机制,引入了Qdisk,但和RHEL 3 下面工作原理有些不同,下面图示它的工作原理。

   

 

QDisk使用一个小于10MB的共享磁盘分区,Qdiskd进程运行在集群的所有节点上,定期评估自身的健康情况,然后把它的状态信息放入到指定的共享磁盘分区。每qdiskd接着查看其他节点的状态,并传递信息给其他节点QDisk分区。在正常情况下,集群的Quorum就是每个节点计数再加上QDisk分区的计数和。如上面例子,总共quorum计数是7,每个节点计数为1,QDisk为3。这样,在一个节点A上,QDisk经过几次偿试都不能访问它的共享磁盘分区,那么运行在另一节点B上的qdiskd进程会请求节点A被隔离,这样会重启节点A并重新加入集群中。

Heuristics(试探)选项来增加可靠性
  作为一个选项,一个或更多的试探方法可以增加到qdisk的配置中,试探就是测试能否访问qdisk分区,一个典型的测试方法包括能够访问到路由/网关。如果试探失败,QDisk默认会重启节点使其进入正常工作状态。minimum_score指出试探成功计数。

在集群数据库(如Oracle RAC)中使用DLM 和QDisk
  我们进一步来学习如何设置QDisk,分布式锁管理(DLM)已经被认证支持OracleRAC10gR2,通过DLM消除了额外锁管理器的需求,减少成本投入。QDisk确保任一节点失败RAC仍然可以持续运行。使用DLM替换GULM操作非常简单(可以参考Oracle Real Application Clusters GFS:Oracle RAC GFS )。
现在,参照上面的图示我们建一个四节点的集群,这意味着总共quorum为7,每个节点为1,quorum分区为3。该分区必须为裸设备分区(raw devices),不会被clvm所管理。
初始化QDisk
  设置一个Quorum磁盘分区也非常简单,首先,建立一个共享的quorum分区,第二,设置集群配置。本例使用11MB分区/dev/sdi1,可以通过cat /proc/partitions 或用parted查看。建议10MB的分区。
[root@et-virt09 ~]# cat /proc/partitions
major minor #blocks name
8 0 71687325 sda
8 1 104391 sda1
8 2 71577607 sda2
: :
8 128 55587840 sdi
8 129 11248 sdi1
8 130 55576576 sdi2
8 144 53483520 sdj
8 145 53483504 sdj1
[root@et-virt05 ~]# parted /dev/sdi
GNU Parted 1.8.1
Using /dev/sdi
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: EQLOGIC 100E-00 (scsi)
Disk /dev/sdi: 56.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 16.4kB 11.5MB 11.5MB primary
2 11.5MB 56.9GB 56.9GB primary
接下来mkqdisk命令可以用可准备quorum分区,它将会初始化16个区-集群允许QDisk使用的最大尺寸。简单的指定设备及唯一卷标名就可以了。卷标会被cluster.conf使用。运行的结果可以通过"mkqdisk -L"来查看。
[root@et-virt08 ~]# mkqdisk -c /dev/sdi1 -l rac_qdisk
mkqdisk v0.5.1
Writing new quorum disk label 'rac_qdisk' to /dev/sdi1.
WARNING: About to destroy all data on /dev/sdi1; proceed [N/y] ? y
Initializing status block for node 1...
Initializing status block for node 2...
: : :
Initializing status block for node 16...
[root@et-virt08 ~]# mkqdisk -L
mkqdisk v0.5.1
/dev/sdi1:
Magic: eb7a62c2
Label: rac_qdisk
Created: Thu Dec 6 14:40:07 2007
Host: et-virt08.lab.boston.redhat.com

集群配置
你可以通过Conga来配置QDisk的使用。

   

quorum分区指定投票数为3,该值是一个少于集群节点数的值。这意味着只需一个节点加上quorum分区就捅有quorum,集群就会正常工作。另外卷标要输入,不是设备名,设备名有可能会在重启后发生变化,但卷标方式不会发生改变。做为例子,没有加入“试探” 选项。其缺省值为1。注意,QDisk每3秒执行一次评估,TKO值为23,代表允许23次失败共计69秒。这意味着如果一个节点不能连接到qdisk区,它会被标为失败的quorum磁盘,会被集群隔离。这样会留出足够的时间允许RAC在一个节点失败后作出反应,本例RAC超时设为60秒。
RAC使用“自隔离”, Red Hat Cluster随后再隔离并重启失败的节点。

   

同样地,cman下的deadnode_timeout设为135秒,1.5倍于qdisk的超时时间,135秒后,cman将发出fence(隔离)指令并重启故障节点。对于非RAC的情况,其值一般不用修改。你可以直接在/etc/cluster/cluster.conf配置文件中修改。通过ccs_tool更新所有节点。
如果要缩短其时间,其他参数也会缩短。
另外要注意的是expected_nodes="7",这包括qdisk分区的3在内。
<?xml version="1.0"?>
<cluster alias="Oracle-RAC1" config_version="35" name="Oracle-RAC1">
<quorumd interval="3" tko="23" label="rac_qdisk" votes="3"/>
<cman deadnode_timeout="135" expected_nodes="7"/>
<clusternodes>
<clusternode name="et-virt08.lab.boston.redhat.com" nodeid="1" votes="1">
<multicast addr="225.0.0.12" interface="eth1"/>
<fence>
<method name="1">
<device name="wti_fence" port="12"/>
</method>
</fence>
</clusternode>
</clusternodes>
<fencedevices>
<fencedevice agent="fence_wti" ipaddr="192.168.77.128" name="wti_fence" passwd="password"/>
</fencedevices>
<rm log_facility="local4" log_level="6"/>
<fence_daemon clean_start="0" post_fail_delay="0" post_join_delay="3"/>
</cluster>

编辑、修改cluster.conf文件
[root@et-virt05 cluster]# cp cluster.conf cluster.conf.new
[root@et-virt05 cluster]# vi cluster.conf.new
[root@et-virt05 cluster]# ccs_tool update cluster.conf.new

两个节点集群情况

   

两个节点的集群也是常见的,但是quorum在这里做为一个特例,因为(n/2+1),当两个节点时,其值为2,如果按常规就无法正常工作。所以一般情况,集群中一个节点失败,另一个节点就会接管。但是,有一种临界情况,如果两节点间网络出现故障,两节点会互相
认为对方失败,这种情况就是通常所说的“裂脑”,每个节点都会去fence另一节点,这样会形成两节点不断互相重启现象。通过Qdisk就可以避免这种情况的发生。“试探”选项可以用来评估网络连接是否正常。典型的配置就是ping一个路由或网关。如下例:

   

注意:如果不带QDisk的两节点cluster,在cluster.conf中需要two_node="1"和expected_votes="1"。
<cman expected_votes="1" two_node="1"/>
带QDisk, expected_count应该为“3”,two_node 为“0”(或者去掉two_node字段)
<cman expected_votes="3" />
结束语
集群是一种高可用性、可扩展性技术,Qdisk提供了一种在小规模集群下更有效的保护集群完整性的方法。

你可能感兴趣的:(qdisk)