前言

    最近在学习集群高可用,集群的高可用可以让平台架构实现服务在线时间接近7X24X365。实现高可用技术有HeartbeatKeepaliveCorosync等等,我们这里介绍的是RedHat Cluster Suite (RHCS)。本实验通过cman+rgmanager+system-config-cluster+gfs2+iscsi+clvm+qdisk来实现前端高可用web服务。

 

原理

    其实高可用技术无非就是实现了这三层的功能:最低层的信息交换层、中间的集群资源管理层、上层的资源管理脚本层。

    在信息层,openais是实现了节点之间的通讯,而cman是在openais的基础上,实现了负责投票以及加入退出集群;在某一节点进行了配置,可以通过ccsCluster Configure System)来同步到其他节点上。

    在集群资源管理层,rgmanager实现了对集群资源(iphttpdmysql等服务、文件系统等等)的管理,下面有几点要理解的:

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、脑裂、GFSclvmDLM

    在节点挂掉的情况下,转移之前,要进行fence隔离掉挂掉的节点,否则无法进行资源转移。这是防止集群节点脑裂的机制,所谓脑裂,就是由于节点之间的heartbeat信息无法传达,双方都认为对放挂掉了,自己要接管资源,如果发生脑裂,双方都有对应的资源,如果都接管了,也就是都启动了相关的资源,会导致数据的破坏。GFS(Global FileSystem)可以解决这个问题。通过clvm,其他节点可以看到共享的lv卷。而GFSCLVM都依赖于DLM(Distributed lock manager,分布式锁管理器)工作,DLM 为集群提供了一个公用的锁运行机制。DLM不需要设定锁管理服务器,它采用对等的锁管理方式,大大提高了处理性能。通过分层机制,可以实现多个锁空间的并行锁模式。

 

配置

一、平台及拓扑

虚拟机Centos 5.5 kernel2.6.18-371.8.1.el5五台

网络环境:桥接

fence设备:手动fence

拓扑如下:

wKiom1QjxcbAS1GgAAFxfekxe8E894.jpg

 

二、实验前的安装

    配置集群可以通过congaLuci安装在跳板机,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.1web1上启动system-config-cluster

web1#system-config-cluster &

 

1.2创建新配置

wKiom1Qjxcbh-tuaAAFTf6xY2oY928.jpg

 

1.3设置集群名字,选择组播地址,设置qdisk选项。

wKioL1Qjyu3jIM4MAAFLOs16WOQ891.jpg

Interval:表示间隔多长时间执行一次检查评估,单位是秒。

Votes:指定qdisk分区投票值是多少。

TKO:表示允许检查失败的次数。一个节点在TKO*Interval时间内如果还连接不上qdisk分区,那么就认为此节点失败,会从集群中隔离。

Minimum Score:指定最小投票值是多少。

LabelQdisk分区对应的卷标名,也就是在创建qdisk时指定的“myqdisk”,这里建议用卷标名,因为设备名有可能会在系统重启后发生变化,但卷标名称是不会发生改变的。

Device:指定共享存储在节点中的设备名是什么。

Path to program配置第三方应用程序来扩展对节点状态检测的精度,这里配置的是ping命令

Score:设定ping命令的投票值。

interval:设定多长时间执行ping命令一次。

 

1.4新建节点

wKiom1QjxcbyXAnfAAGg2aJnPcg084.jpg

 

1.5填写节点域名、以及票数

wKioL1QjxeqRROm5AAB49pZ0KCM255.jpg

 

1.6新建fence设备

wKioL1QjxevRq198AAH-D2ODoIk542.jpg

 

1.7选择fence设备

wKiom1QjxcfhD9ORAACZzmLwFHw691.jpg

这里的manual fencing是实验用的,安装了cman自带的,当需要fence的时候系统会提示你手动去fence

 

1.8新建Failover Domain

wKiom1QjxceRQMbIAAFp9sbLbp8069.jpg

 

1.9设置Failover Domains名称

wKioL1QjxeuAnYKxAAByVuFb_YA676.jpg

 

1.10设置Failover Domain

wKiom1QjxceCziX6AAE3Rf4y3Jw150.jpg

注意,Failover Domains可以设置多个。

 

1.11新建资源

wKioL1Qjxe-yGHueAACMMtXKvw8872.jpg

 

1.12设置IP资源

wKiom1QjxcvSLErtAADZY5EcqM0203.jpg

 

1.13设置脚本资源

wKiom1QjxcuC7PjsAADT4t-lMaE945.jpg

 

1.14新建服务(相当于资源组)

wKioL1Qjxe_QDEB1AABhZLqUd6A079.jpg

 

1.15设置资源组名称

wKioL1Qjxe_xbIc9AABlsMfpmbg821.jpg

 

1.16设置资源组

wKiom1QjxcyySa3oAAIqJYBpVV8370.jpg

如果在资源组里面没有加入资源,则集群尚不使用资源。

 

1.17保存配置

wKiom1QjxczQrceKAAB-hmffCW4310.jpg

wKioL1QjxfDBkJTgAAD0w0OC2YQ886.jpg

 

 

2.开启cman服务

(不能用for循环实现,只能每个节点手动去启动)

[root@web1 ~]# alias rocker=”for i in web1 web2 web3web4;do”

[root@web1 ~]# service cman start

Starting cluster:

   Loadingmodules... done

   Mountingconfigfs... done

   Startingccsd... done          #开启cman之前开启ccs同步配置文件

   Startingcman... done

   Startingdaemons... done

   Startingfencing... done

   Tuning DLM...done

                                                          [  OK  ]

 

[root@web2 ~]# service cman start

[root@web3 ~]# service cman start

[root@web4 ~]# 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服务

[root@web1 ~]# rocker ssh root@$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的高,所以relocatebetter 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资源:

wKiom1Qjxcyi8EKlAABKRKl8hds402.jpg

OK!


##########测试见下文##########