Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5383437
  • 博文数量: 890
  • 博客积分: 12876
  • 博客等级: 上将
  • 技术积分: 10760
  • 用 户 组: 普通用户
  • 注册时间: 2004-10-04 14:18
个人简介

猝然临之而不惊,无故加之而不怒。

文章分类

全部博文(890)

文章存档

2016年(1)

2014年(18)

2013年(41)

2012年(48)

2011年(65)

2010年(84)

2009年(121)

2008年(101)

2007年(129)

2006年(95)

2005年(118)

2004年(69)

分类: LINUX

2014-01-08 17:34:59

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

假设你配置好你的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在内。
  
  
  
  
  
  
  
  
  
  
  

  

  
  
  

  
  
  

  
  
  

  
编辑、修改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"。
  
                     带QDisk, expected_count应该为“3”,two_node 为“0”(或者去掉two_node字段)
  
结束语
集群是一种高可用性、可扩展性技术,Qdisk提供了一种在小规模集群下更有效的保护集群完整性的方法。


阅读(3332) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~