前言
最近在学习集群高可用,集群的高可用可以让平台架构实现服务在线时间接近7X24X365。实现高可用技术有Heartbeat、Keepalive、Corosync等等,我们这里介绍的是RedHat Cluster Suite (RHCS)。本实验通过cman+rgmanager+system-config-cluster+gfs2+iscsi+clvm+qdisk来实现前端高可用web服务。
原理
其实高可用技术无非就是实现了这三层的功能:最低层的信息交换层、中间的集群资源管理层、上层的资源管理脚本层。
在信息层,openais是实现了节点之间的通讯,而cman是在openais的基础上,实现了负责投票以及加入退出集群;在某一节点进行了配置,可以通过ccs(Cluster Configure System)来同步到其他节点上。
在集群资源管理层,rgmanager实现了对集群资源(ip、httpd、mysql等服务、文件系统等等)的管理,下面有几点要理解的:
Failover Domain
当一个节点挂了,会自动转移资源到在Failover Domain中的其他节点,在Failover Domain中,我们可以定义节点的优先级,当优先级数字越低,表示越优先,资源会偏向转移到高优先级的节点上。
Quorum
但是这种资源转移是有条件的:半数以上的节点可用;在这点,RHCS提供了仲裁的方法quorum(法定票数),每个节点可用的情况下进行投票(vote),当投票数大于总票数的一半,即视为集群可用。
Quorum=Expected vote / 2 + 1
总票数(Total vote)=所有节点投票数vote的总和+qdisk vote票数。
如果Total vote > =Quorum 集群可用
Qdisk
如果集群还有节点可以工作,但是由于quorum的机制,当导致了集群挂起,这不是工作环境想要的,而且剩下一台,他也应该为客户工作。再者,这里就需要qdisk了,qdisk是表决磁盘。是用于投票
Fence、脑裂、GFS、clvm、DLM
在节点挂掉的情况下,转移之前,要进行fence隔离掉挂掉的节点,否则无法进行资源转移。这是防止集群节点脑裂的机制,所谓脑裂,就是由于节点之间的heartbeat信息无法传达,双方都认为对放挂掉了,自己要接管资源,如果发生脑裂,双方都有对应的资源,如果都接管了,也就是都启动了相关的资源,会导致数据的破坏。GFS(Global FileSystem)可以解决这个问题。通过clvm,其他节点可以看到共享的lv卷。而GFS和CLVM都依赖于DLM(Distributed lock manager,分布式锁管理器)工作,DLM 为集群提供了一个公用的锁运行机制。DLM不需要设定锁管理服务器,它采用对等的锁管理方式,大大提高了处理性能。通过分层机制,可以实现多个锁空间的并行锁模式。
配置
一、平台及拓扑
虚拟机Centos 5.5 kernel2.6.18-371.8.1.el5五台
网络环境:桥接
fence设备:手动fence
拓扑如下:
二、实验前的安装
配置集群可以通过conga(Luci安装在跳板机,ricci安装在集群机,基于web页面来配置)、system-config-cluster(基于软件界面配置)、cman_tool(这个安装cman就有,基于命令行配置)。任选其一,这里选择system-config-cluster。
web节点:
httpd(自行安装和配置,这里不介绍)
cman
rgmanager
iscsi-initiator-utils
system-config-cluster(只要在一个集群节点安装即刻,这里在web1安装了)
gfs2-utils-0.1.62-39.el5_10.3.i386.rpm
lvm2-cluster
storage_serve节点:
iscsi-target-utils(或者iscsitarget企业版)
三、初始化、开启集群
1.设置集群,以及定义集群资源
1.1在web1上启动system-config-cluster
web1#system-config-cluster &
1.2创建新配置
1.3设置集群名字,选择组播地址,设置qdisk选项。
Interval:表示间隔多长时间执行一次检查评估,单位是秒。
Votes:指定qdisk分区投票值是多少。
TKO:表示允许检查失败的次数。一个节点在TKO*Interval时间内如果还连接不上qdisk分区,那么就认为此节点失败,会从集群中隔离。
Minimum Score:指定最小投票值是多少。
Label:Qdisk分区对应的卷标名,也就是在创建qdisk时指定的“myqdisk”,这里建议用卷标名,因为设备名有可能会在系统重启后发生变化,但卷标名称是不会发生改变的。
Device:指定共享存储在节点中的设备名是什么。
Path to program:配置第三方应用程序来扩展对节点状态检测的精度,这里配置的是ping命令
Score:设定ping命令的投票值。
interval:设定多长时间执行ping命令一次。
1.4新建节点
1.5填写节点域名、以及票数
1.6新建fence设备
1.7选择fence设备
这里的manual fencing是实验用的,安装了cman自带的,当需要fence的时候系统会提示你手动去fence。
1.8新建Failover Domain
1.9设置Failover Domains名称
1.10设置Failover Domain
注意,Failover Domains可以设置多个。
1.11新建资源
1.12设置IP资源
1.13设置脚本资源
1.14新建服务(相当于资源组)
1.15设置资源组名称
1.16设置资源组
如果在资源组里面没有加入资源,则集群尚不使用资源。
1.17保存配置
2.开启cman服务
(不能用for循环实现,只能每个节点手动去启动)
[[email protected] ~]# alias rocker=”for i in web1 web2 web3web4;do”
[[email protected] ~]# service cman start
Starting cluster:
Loadingmodules... done
Mountingconfigfs... done
Startingccsd... done #开启cman之前开启ccs同步配置文件
Startingcman... done
Startingdaemons... done
Startingfencing... done
Tuning DLM...done
[ OK ]
[[email protected] ~]# service cman start
[[email protected] ~]# service cman start
[[email protected] ~]# service cman start
web1日志提示:
Sep 22 19:38:52 web1 openais[4555]: [CLM ] r(0) ip(192.168.1.202)
Sep 22 19:38:52 web1 openais[4555]: [CLM ] r(0) ip(192.168.1.203)
Sep 22 19:38:52 web1 openais[4555]: [CLM ] r(0) ip(192.168.1.204)
Sep 22 19:38:52 web1 openais[4555]: [CLM ] Members Left:
Sep 22 19:38:52 web1 openais[4555]: [CLM ] Members Joined:
Sep 22 19:38:52 web1 openais[4555]: [CLM ] r(0) ip(192.168.1.204)
Sep 22 19:38:52 web1 fenced[4574]: fencing deferred toprior member
Sep 22 19:38:52 web1 openais[4555]: [SYNC ] This nodeis within the primary component and will provide service.
Sep 22 19:38:52 web1 openais[4555]: [TOTEM] enteringOPERATIONAL state.
Sep 22 19:38:52 web1 openais[4555]: [CLM ] got nodejoin message 192.168.1.201
Sep 22 19:38:52 web1 openais[4555]: [CLM ] got nodejoin message 192.168.1.202
Sep 22 19:38:52 web1 openais[4555]: [CLM ] got nodejoin message 192.168.1.203
Sep 22 19:38:52 web1 openais[4555]: [CLM ] got nodejoin message 192.168.1.204
Sep 2219:38:52 web1 openais[4555]: [CPG ] gotjoinlist message from node 3
Sep 2219:38:52 web1 openais[4555]: [CPG ] gotjoinlist message from node 1
Sep 2219:38:52 web1 openais[4555]: [CPG ] gotjoinlist message from node 2
#表示节点加入成功
3.开启rgmanager服务
[[email protected] ~]# rocker ssh [email protected]$i ‘service rgmanagerstart’;done
Starting Cluster Service Manager: [ OK ]
Starting Cluster Service Manager: [ OK ]
Starting Cluster Service Manager: [ OK ]
Starting Cluster Service Manager: [ OK ]
web2日志:
Sep 22 20:03:08 web2 clurgmgrd[4516]: <notice>Service service:myservice started
Sep 22 20:03:08 web2 clurgmgrd[4516]: <notice>Relocating service:myservice to better node web3.rocker.com
#web3的优先级比web2的高,所以relocate去better node。
web3日志:
Sep 22 20:03:19 web3 clurgmgrd[4483]: <notice>Starting stopped service service:myservice
Sep 22 20:03:21 web3 avahi-daemon[3942]: Registeringnew address record for 192.168.1.200 on eth0.
Sep 22 20:03:23 web3 clurgmgrd[4483]: <notice>Service service:myservice started
#因为web3优先级最高
测试web资源:
OK!
##########测试见下文##########