一、概述

    在上篇博客中我们已经完成了Corosync、Pacemaker和crmsh的安装!现在让我们来介绍下是如何通过Pacemaker这个资源管理器来添加管理资源的.在这之前先来简单了解下Pacemaker的工作原理!

1、Pacemaker组件说明:

wKioL1NTcpmzncN8AAPg4MaMTvw200.jpg

  • stonithd:心跳系统。

  • lrmd:本地资源管理守护进程。它提供了一个通用的接口支持的资源类型。直接调用资源代理(脚本)。

  • pengine:根据当前状态和配置集群计算的下一个状态。产生一个过渡图,包含行动和依赖关系的列表。

  • CIB:群集信息库。包含所有群集选项,节点,资源,他们彼此之间的关系和现状的定义。同步更新到所有群集节点。

  • CRMD:集群资源管理守护进程。主要是消息代理的PEngine和LRM,还选举一个领导者(DC)统筹活动(包括启动/停止资源)的集群。

  • OpenAIS:OpenAIS的消息和成员层。

  • Heartbeat:心跳消息层,OpenAIS的一种替代。

  • CCM:共识群集成员,心跳成员层。


2、功能概述

   CIB使用XML表示集群的集群中的所有资源的配置和当前状态。CIB的内容会被自动在整个集群中同步,使用PEngine计算集群的理想状态,生成指令列表,然后输送到DC(指定协调员)。     Pacemaker 集群中所有节点选举的DC节点作为主决策节点。如果当选DC节点宕机,它会在所有的节点上, 迅速建立一个新的DC。DC将PEngine生成的策略,传递给其他节点上的LRMd(本地资源管理守护程序)或CRMD通过集群消息传递基础结构。当集群中有节点宕机,PEngine重新计算的理想策略。在某些情况下,可能有必要关闭节点,以保护共享数据或完整的资源回收。为此,Pacemaker配备了stonithd设备。STONITH可以将其它节点‘爆头’,通常是实现与远程电源开关。Pacemaker会将STONITH设备,配置为资源保存在CIB中,使他们可以更容易地监测资源失败或宕机。


二、Centos6.5+Corosync+Pacemaker 实现高可用的Web集群

实验环境:

服务器IP地址
系统版本所装软件
node1.gulong.com
172.16.8.5Centos6.5

httpd

Corosync

Pacemaker

node2.gulong.com172.16.8.8Centos6.5

httpd

Corosync

Pacemaker

nfs服务器172.16.8.9Centos6.5

nfs

共享目录为:/www/html

本次集群服务为:httpd,vip,nfs!


1、Corosync与Pacemaker 安装与配置

Corosync与Pacemaker 的配置这里就不介绍了,请参考上篇博客:

http://584014981.blog.51cto.com/8605371/1398761


2、使用crmsh 配置高可用的Web集群

crmsh:非常好用的资源管理器工具,安装方法见上篇博客!

(1)检测一下配置文件是否有错

[root@node1 ~]# crm    //进入crm命令行界面
crm(live)# configure
crm(live)configure# verify    //检查语法错误

如果是第一次检测语法,会报下面的错误:

wKioL1NTd5jjD0oeAAGjhV1FPCE423.jpg

这是因为我们的STONITH resources没有定义,因我们这里没有STONITH设备,所以我们先关闭这个属性!

关闭stonith属性:

crm(live)configure# property stonith-enabled=false
crm(live)configure# verify  //再检测就不会报错了


(2).查看当前集群系统所支持的类型

wKioL1NTeUGhFkF9AAB-_ltJSlo115.jpg


(3).查看某种类别下的所用资源代理的列表

wKiom1NTeh3DW2gwAAKuNqVaFV4277.jpg


(4).查看某个资源代理的配置方法

可以使用info命令

crm(live)ra# info ocf:heartbeat:IPaddr

wKiom1NTeqbzZRBHAAT5XQT-X80221.jpg


(5).创建web集群的IP地址资源

crm(live)# configure
crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=172.16.8.1 nic=eth0 cidr_netmask=24  //增加一个VIP资源
crm(live)configure# verify     //检查一下配置文件有没有错误
crm(live)configure# commit    //提交配置的资源,在命令行配置资源时,只要不用commit提交配置好资源,就不会生效,一但用commit命令提交,就会写入到cib.xml的配置文件中
crm(live)configure# cd
crm(live)  status   //查看状态

wKioL1NTfHKC8n9NAAFj2sOrNhw017.jpg

wKiom1NTfNHhNbFAAAHL-d7XtCI071.jpg


去node1上查看下vip

wKioL1NTfT3h0GWhAAIt_WGhrOc585.jpg


测试:停止node1节点上的corosync,看资源如何转移:

[root@node2 ~]# ssh node1 "service corosync stop" //在node2上远程停止node1
[root@node2 ~]# crm status //查看状态

wKiom1NTflHQ6ijlAAJaXFGWFIc067.jpg

重点说明:上面的信息显示node1.gulong.com已经离线,但资源vip却没能在node2.gulong.com上启动。这是因为此时的集群状态为"WITHOUT quorum",即已经失去了quorum,此时集群服务本身已经不满足正常运行的条件,这对于只有两节点的集群来讲是不合理的。因此,我们可以通过如下的命令来修改忽略quorum不能满足的集群状态检查:property no-quorum-policy=ignore

执行下面操作:

crm(live)# configure
crm(live)configure# property no-quorum-policy=ignore //忽略quorum状态检测
crm(live)configure# show
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status

wKiom1NTgJ6xNjL_AALqyLyjpdQ171.jpg


测试完成,把node1启动起来

[root@node2 ~]# ssh node1.gulong.com "service corosync start"
Starting Corosync Cluster Engine (corosync): [OK]


正常启动node1.gulong.com后,集群资源vip很可能会重新从node2.gulong.com转移回node1.gulong.com,但也可能不回去。资源的这种在节点间每一次的来回流动都会造成那段时间内其无法正常被访问,所以,我们有时候需要在资源因为节点故障转移到其它节点后,即便原来的节点恢复正常也禁止资源再次流转回来。这可以通过定义资源的黏性(stickiness)来实现。在创建资源时或在创建资源后,都可以指定指定资源黏性。


(6).资源黏性

资源黏性是指:资源更倾向于运行在哪个节点

资源黏性值范围及其作用:

  • 0:这是默认选项。资源放置在系统中的最适合位置。这意味着当负载能力“较好”或较差的节点变得可用时才转移资源。此选项的作用基本等同于自动故障回复,只是资源可能会转移到非之前活动的节点上;

  • 大于0:资源更愿意留在当前位置,但是如果有更合适的节点可用时会移动。值越高表示资源越愿意留在当前位置;

  • 小于0:资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置;

  • INFINITY:如果不是因节点不适合运行资源(节点关机、节点待机、达到migration-threshold 或配置更改)而强制资源转移,资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复;

  • -INFINITY:资源总是移离当前位置;

我们这里可以通过以下方式为资源指定默认黏性值: rsc_defaults resource-stickiness=100


crm(live)configure# rsc_defaults resource-stickiness=100
crm(live)configure# verify
crm(live)configure# show
crm(live)configure# commit

wKioL1NTgxHyYQIyAAHOOfjRRbw228.jpg


(7).结合上面已经配置好的IP地址资源,将此集群配置成为一个active/passive模型的web(httpd)服务集群

Node1:  

[root@node1 ~]# yum -y install httpd
[root@node1 ~]# echo "<h1>node1.gulong.com</h1>" > /var/www/html/index.html


Node2:

[root@node1 ~]# yum -y install httpd
[root@node1 ~]# echo "<h1>node2.gulong.com</h1>" > /var/www/html/index.html


把各个节点的httpd服务都关掉,禁止自动启动!

接下来我们将此httpd服务添加为集群资源。将httpd添加为集群资源有两处资源代理可用:lsb和ocf:heartbeat,为了简单起见,我们这里使用lsb类型:

新建资源httpd:

crm(live)# configure
crm(live)configure# primitive httpd lsb:httpd
crm(live)configure# show
crm(live)configure# verify
crm(live)configure# commit

wKioL1NThPKxUU1wAAGvHVzmzEY371.jpg


来查看一下资源状态

wKiom1NThUixNB1GAAHZWEyHv1s910.jpg

从上图的信息中可以看出vip和httpd有可能会分别运行于两个节点上,这对于通过此IP提供Web服务的应用来说是不成立的,即此两者资源必须同时运行在某节点上。有两种方法可以解决,一种是定义组资源,将vip与httpd同时加入一个组中,可以实现将资源运行在同节点上,另一种是定义资源约束可实现将资源运行在同一节点上。我们先来说每一种方法,定义组资源。


(8).定义组资源

crm(live)# configure
crm(live)configure# group webservice vip httpd
crm(live)configure# show
crm(live)configure# verify
crm(live)configure# commit


查看下状态:

wKioL1NThjijpOHBAAP6orsubhE223.jpg


测试下

wKiom1NTiD6CuAhYAADYvHjneDA314.jpg


下面我们模拟故障,测试一下

crm(live)# node
crm(live)node# standby   //把node2下线

wKiom1NTiN-Tu9KrAAKGoLmCpAM807.jpg

wKiom1NTiTSgH_ULAADrz-kPjWo144.jpg

好了,组资源的定义与说明,我们就先演示到这,下面我们来说一说怎么定义资源约束。


(9).定义资源约束

资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。pacemaker共给我们提供了三种资源约束方法:

  • Resource Location(资源位置):定义资源可以、不可以或尽可能在哪些节点上运行;

  • Resource Collocation(资源排列):排列约束用以定义集群资源可以或不可以在某个节点上同时运行;

  • Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序;

定义约束时,还需要指定分数。各种分数是集群工作方式的重要组成部分。其实,从迁移资源到决定在已降级集群中停止哪些资源的整个过程是通过以某种方式修改分数来实现的。分数按每个资源来计算,资源分数为负的任何节点都无法运行该资源。在计算出资源分数后,集群选择分数最高的节点。INFINITY(无穷大)目前定义为 1,000,000。加减无穷大遵循以下3个基本规则:

  • 任何值 + 无穷大 = 无穷大

  • 任何值 - 无穷大 = -无穷大

  • 无穷大 - 无穷大 = -无穷大

定义资源约束时,也可以指定每个约束的分数。分数表示指派给此资源约束的值。分数较高的约束先应用,分数较低的约束后应用。通过使用不同的分数为既定资源创建更多位置约束,可以指定资源要故障转移至的目标节点的顺序。因此,对于前述的vip和httpd可能会运行于不同节点的问题,可以通过以下命令来解决:


先让刚才的node2上线,然后删除组:

crm(live)# node
crm(live)node# online  //让node2上线
crm(live)node# cd
crm(live)# resource
crm(live)resource# stop webservice  //停止组资源
crm(live)resource# cleanup webservice  //清理组资源
crm(live)resource# cd
crm(live)# configure
crm(live)configure# delete webservice //删除组资源
crm(live)configure# verify
crm(live)configure# commit

wKioL1NTjAjjUBR0AANdiVCrl1Q028.jpg

wKiom1NTjLqh0lxlAAH9QX62HfQ360.jpg


定义排列约束:

crm(live)configure# colocation httpd-with-ip INFUNTY: httpd vip
crm(live)configure# show
crm(live)configure# verify
crm(live)configure# commit

wKioL1NTjgjjaTCxAAHf8PBLHf8757.jpg

wKiom1NTjlXRRn_gAAD238Xy_Xw118.jpg


模拟一下故障,再进行测试:

crm(live)# node
crm(live)node# standby //模拟node1故障

wKiom1NTj6axqxzWAADbVOmTgZ8953.jpg


接着,我们还得确保httpd在某节点启动之前得先启动vip,这可以使用如下命令实现:

crm(live)# configure
crm(live)configure# order httpd-after-vip mandatory: vip httpd //先启动vip,再启动httpd服务
crm(live)configure# verify
crm(live)configure# show
crm(live)configure# commit

wKiom1NTkVugbPIBAAJa3caOPCo482.jpg


此外,由于HA集群本身并不强制每个节点的性能相同或相近。所以,某些时候我们可能希望在正常时服务总能在某个性能较强的节点上运行,这可以通过位置约束来实现:

crm(live)configure# location prefer-node1 vip node_pref::200: node1.gulong.com
//这条命令实现了将vip约束在node1上,且指定其分数为200


(10).配置nfs资源

  • 配置NFS服务器

在nfs服务器上 创建共享目录

[root@station142 ~]# yum -y install nfs-utils
[root@station142 ~]# mkdir -pv /www/html
[root@station142 ~]# setfacl -m u:apache:rwx /www/html
[root@nfs ~]# vim /etc/exports
//添加如下内容:
/www/html              172.16.0.0/16(rw,sync,all_squash)
[root@station142 ~]# echo '<h1> This is NFS system </h1>' > /www/html/index.html
//创建共享网页
[root@station142 ~]# service rpcbind start
[root@station142 ~]# service nfs start


  • 配置资源nfs

crm(live)# configure
crm(live)configure# primitive nfs ocf:heartbeat:Filesystem params device=172.16.8.9:/www/html directory=/var/www/html fstype=nfs
crm(live)configure# verify
crm(live)configure# commit

wKioL1NTlhCjHW1VAAKAozatpq0450.jpg

wKiom1NTloexFU_HAAIT38zMonI872.jpg


上图看出nfs与另外2个节点不在同一节点上,因此我们可以使用组定义或者排列约束来让它们处在同一节点上,我们这里采用排列约束:

crm(live)configure# colocation http-with-vip-nfs INFUNTY: vip nfs httpd
crm(live)configure# verify
crm(live)configure# commit

wKiom1NTmTODJ9bHAAIQSPz_y9I960.jpg


测试:

wKioL1NTmUOhi6PfAADlh1iO28k816.jpg


模拟node1故障:

wKiom1NTmcrhuHxHAAHdg1CpJE8723.jpg


wKiom1NTmeqR7Ch_AADNR9ZEWeM835.jpg

大家可以看到,node1故障,照样能访问,好了今天的博客就到这边,期待与你的下次见面!