实验环境:

  1)基于vmwere虚拟机实现

  2)本配置共有两个测试节点,分别node1.a.comnode2.a.com,相的IP地址分别为172.16.4.11172.16.4.22
  3模拟实现的集群服务是web服务
  4)提供web服务的地址为172.16.4.1

实验拓扑图:

集群系列五(基于corosync+pacemaker的高可用集群)_约束

1基础环境设置:

首先配置一台HA主机需要做的准备工作:

1)因为集群节点的工作的重要性,而且需要提供稳定的网络环境,这里我们需要给节点配置固定的IP地址,编辑/etc/sysconfig/network-scripts/ifcfg-eth0,配置IP如下:

  1. DEVICE=eth0 
  2.  
  3. BOOTPROTO=static 
  4.  
  5. IPADDR=172.16.4.11 
  6.  
  7. NETMASK=255.255.0.0 
  8.  
  9. ONBOOT=yes 
  10.  
  11. HWADDR=00:0c:29:a2:fa:bb 


2保证节点主机的名称和“uname -n”命令的结果保持一致,我们需要编辑/etc/sysconfig/network,配置如下:

  1. NETWORKING=yes 
  2.  
  3. NETWORKING_IPV6=no 
  4.  
  5. HOSTNAME=node1.a.com 

而且要做以下操作,使主机名本次生效:

#source   /etc/sysconfig/network

#hostname  node1.a.com

3)所有节点的主机名称和对应的IP地址解析服务可以正常工作,我们不需要DNS服务,只需要保证两个节点上的/etc/hosts文件均为下面的内容:

  1. 172.16.4.11  node1.a.com   node1 
  2.  
  3. 172.16.4.22  node2.a.com   node2 

以上三步配置完成后能实现相互解析主机名,如下:

集群系列五(基于corosync+pacemaker的高可用集群)_黏性值_02

4)配置节点信任关系:

节点1:
# ssh-keygen  -t   rsa
# ssh-copy-id -i  ~/.ssh/id_rsa.pub  root@node2
节点2:
# ssh-keygen -t rsa
# ssh-copy-id -i  ~/.ssh/id_rsa.pub  root@node1

然后测试:

集群系列五(基于corosync+pacemaker的高可用集群)_集群_03

2,安装环境需要的相应的软件包:

#yum  install   -y  libibverbs librdmacm lm_sensors libtool-ltdl openhpi-libs openhpi perl-TimeDate

3安装corosyncpacemaker,我们这里将软件包放在/root/corosync目录下(两个节点都要做):

  1. cluster-glue-1.0.6-1.6.el5.i386.rpm 
  2.  
  3. cluster-glue-libs-1.0.6-1.6.el5.i386.rpm 
  4.  
  5. corosync-1.2.7-1.1.el5.i386.rpm 
  6.  
  7. corosynclib-1.2.7-1.1.el5.i386.rpm 
  8.  
  9. heartbeat-3.0.3-2.3.el5.i386.rpm 
  10.  
  11. heartbeat-libs-3.0.3-2.3.el5.i386.rpm 
  12.  
  13. libesmtp-1.0.4-5.el5.i386.rpm 
  14.  
  15. openais-1.1.3-1.6.el5.i386.rpm 
  16.  
  17. openaislib-1.1.3-1.6.el5.i386.rpm 
  18.  
  19. pacemaker-1.0.11-1.2.el5.i386.rpm 
  20.  
  21. pacemaker-libs-1.0.11-1.2.el5.i386.rpm 
  22.  
  23. perl-TimeDate-1.16-5.el5.noarch.rpm 
  24.  
  25. resource-agents-1.0.4-1.1.el5.i386.rpm 

这里您安装的软件版本可能和笔者的不一致,只要符合您的实验平台就行。

开始安装:

# cd  /root/corosync/

# yum -y --nogpgcheck  localinstall  *.rpm

这里我们使用本地yum安装,并忽略包的检查。 

4corosync的相关配置(在节点1上执行):

# cd   /etc/corosync
# cp   corosync.conf.example  corosync.conf

这里corosync.conf.example是配置样本,我们只需拷贝一份,并进行修改即可:

# vim /etc/corosync/corosync.conf

 

  1.   # Please read the corosync.conf.5 manual page 
  2.  
  3. compatibility: whitetank 
  4.  
  5. totem { 
  6.  
  7.         version: 2 
  8.  
  9.         secauth: off 
  10.  
  11.         threads: 0 
  12.  
  13.         interface { 
  14.  
  15.                 ringnumber: 0 
  16.  
  17.                 bindnetaddr: 172.16.0.0《------此处是您需要修改的地方,为网卡的网络地址 
  18.  
  19.                 mcastaddr: 226.94.1.1 
  20.  
  21.                 mcastport: 5405 
  22.  
  23.         } 
  24.  
  25.  
  26. logging { 
  27.  
  28.         fileline: off 
  29.  
  30.         to_stderr: no 
  31.  
  32.         to_logfile: yes 
  33.  
  34.         to_syslog: yes 
  35.  
  36.         logfile: /var/log/cluster/corosync.log《-----此处日志存放的地方 
  37.  
  38.         debug: off 
  39.  
  40.         timestamp: on 
  41.  
  42.         logger_subsys { 
  43.  
  44.                 subsys: AMF 
  45.  
  46.                 debug: off 
  47.  
  48.         } 
  49.  
  50.  
  51. amf { 
  52.  
  53.         mode: disabled 
  54.  
  55.  
  56. service {《-----------------此处以下是您需要添加的内容 
  57.  
  58.   ver: 0 
  59.  
  60.   name: pacemaker 
  61.  
  62.  
  63. aisexec { 
  64.  
  65.   user: root 
  66.  
  67.   group: root 
  68.  

生成节点间通信时用到的认证密钥文件:
# corosync-keygen---此处会在当前目录下生成一个认证密钥文件

然后拷贝相关的文件到节点2上:

# scp -p  corosync.conf  authkey node2:/etc/corosync/

为两个节点创建corosync生成的日志所在的目录:
# mkdir /var/log/cluster
# ssh node2 --  mkdir /var/log/cluster

5,开始启动corosync(在节点1上执行):

# /etc/init.d/corosync start

 Starting Corosync Cluster Engine (corosync):               [  OK  ]  ------出现此,说明您的corosync已经启动

开始验证是否有其他错误:

查看corosync引擎是否正常启动

# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages

 

  1. Sep 15 11:20:41 localhost smartd[2350]: Opened configuration file /etc/smartd.conf  
  2.  
  3. Sep 15 11:24:24 localhost smartd[2416]: Opened configuration file /etc/smartd.conf  
  4.  
  5. Sep 15 11:30:14 localhost smartd[2659]: Opened configuration file /etc/smartd.conf  
  6.  
  7. Sep 15 15:12:38 localhost corosync[694]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service. 
  8.  
  9. Sep 15 15:12:38 localhost corosync[694]:   [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'. 

查看初始化成员节点通知是否正常发出

# grep TOTEM /var/log/messages

 

  1. Sep 15 15:12:38 localhost corosync[694]:   [TOTEM ] Initializing transport (UDP/IP). 
  2.  
  3. Sep 15 15:12:38 localhost corosync[694]:   [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0). 
  4.  
  5. Sep 15 15:12:38 localhost corosync[694]:   [TOTEM ] The network interface [172.16.4.11] is now up. 
  6.  
  7. Sep 15 15:12:39 localhost corosync[694]:   [TOTEM ] Process pause detected for 515 ms, flushing membership messages. 
  8.  
  9. Sep 15 15:12:39 localhost corosync[694]:   [TOTEM ] A processor joined or left the membership and a new membership was formed. 

检查启动过程中是否有错误产生
# grep ERROR: /var/log/messages | grep -v unpack_resources

如果没有出现错误,此处则不会出现任何信息

查看pacemaker是否正常启动

# grep pcmk_startup /var/log/messages

  1. Sep 15 15:12:39 localhost corosync[694]:   [pcmk  ] info: pcmk_startup: CRM: Initialized 
  2.  
  3. Sep 15 15:12:39 localhost corosync[694]:   [pcmk  ] Logging: Initialized pcmk_startup 
  4.  
  5. Sep 15 15:12:39 localhost corosync[694]:   [pcmk  ] info: pcmk_startup: Maximum core file size is: 4294967295 
  6.  
  7. Sep 15 15:12:39 localhost corosync[694]:   [pcmk  ] info: pcmk_startup: Service: 9 
  8.  
  9. Sep 15 15:12:39 localhost corosync[694]:   [pcmk  ] info: pcmk_startup: Local hostname : node1.a.com

上述验证错误的操作没有出现问题的话,您就可以启动节点2了:

# ssh node2 -- /etc/init.d/corosync   start-----此步您需要在节点1上进行

Starting Corosync Cluster Engine (corosync): [  OK  ]----出现此,说明您的节点2corosync已经启动,您需要在节点2上继续验证是否出现异常错误,执行验证错误的步骤即可。

查看节点的运行状态:

# crm status

 

  1. ============ 
  2.  
  3. Last updated: Thu Sep 15 15:17:50 2011 
  4.  
  5. Stack: openais 
  6.  
  7. Current DC: node1.a.com - partition with quorum 
  8.  
  9. Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 
  10.  
  11. 2 Nodes configured, 2 expected votes 
  12.  
  13. 0 Resources configured. 
  14.  
  15. ============ 
  16.  
  17. Online: [ node1.a.com node2.a.com ]《----此处说明您的两个集群节点均已运行正常。 

6,配置集群的工作属性:

因为corosync默认已经启用了stonith,而当前又没有添加stonith设备,会出现默认配置不可用的状态:

# crm_verify  -L

 

  1. crm_verify[762]: 2011/09/15_15:20:13 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined 
  2.  
  3. crm_verify[762]: 2011/09/15_15:20:13 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option 
  4.  
  5. crm_verify[762]: 2011/09/15_15:20:13 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity 
  6.  
  7. Errors found during check: config not valid 
  8.  
  9.   -V may provide more details 

为防止以后出现错误,影响操作,我们这里可以禁用stonith

# crm configure property stonith-enabled=false----这样执行的命令会提交而且会立即生效

INFO: building help index

使用一下命令可以查看当前corosync的配置信息:

# crm configure show

 

  1. node node1.a.com 
  2.  
  3. node node2.a.com 
  4.  
  5. property $id="cib-bootstrap-options" \ 
  6.  
  7. dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \ 
  8.  
  9. cluster-infrastructure="openais" \ 
  10.  
  11. expected-quorum-votes="2" \ 
  12.  
  13. stonith-enabled="false"《----stonith已经被禁用 

  crmcrm_verify相关的命令是1.0后的版本的pacemaker提供的基于命令行的集群管理工具;可以在集群中的任何一个节点上执行,查看相应的信息。

 

7,为集群添加集群资源:

corosync支持heartbeatlsbocf等类型的资源代理,目前较为常用的类型为lsblsb两类,stonith类专为配置stonith设备而用

查看当前集群系统支持的资源代理类型:

# crm ra classes

 

  1. heartbeat 
  2.  
  3. lsb 
  4.  
  5. ocf / heartbeat pacemaker 
  6.  
  7. Stonith 

查看某种类型的资源代理的列表:

#crm ra list lsb

集群系列五(基于corosync+pacemaker的高可用集群)_corosync_04

#crm  ra  list  ocf  heartbeat

集群系列五(基于corosync+pacemaker的高可用集群)_corosync_05

# crm ra list ocf pacemaker

集群系列五(基于corosync+pacemaker的高可用集群)_黏性值_06

# crm ra list stonith

 

集群系列五(基于corosync+pacemaker的高可用集群)_黏性值_07

下面我们来实现web集群简单案例:

安装httpd,并配置相应测试网页:

# yum -y install httpd

#echo  "<h1>Node1.a.com</h1>"   >  /var/www/html/index.html

#chkconfig   httpd off

#service  httpd  stop

#ssh  node2  -- 'echo  "<h1>Node2.a.com</h1>"   >  /var/www/html/index.html'

#ssh node2   --  'chkconfig   httpd off'

#ssh  node2  --  'service   httpd  stop'

添加web资源:

首先创建的web集群创建一个IP地址资源

# crm  configure primitive WebIP ocf:heartbeat:IPaddr  params ip=172.16.4.1

然后将httpd服务添加为集群资源。将httpd添加为集群资源有两处资源代理可用:lsbocf:heartbeat,为了简单起见,我们这里使用lsb类型

#crm configure primitive WebSite lsb:httpd

您此时就可以通过主机的浏览器输入http://172.16.4.1进行访问web服务:

集群系列五(基于corosync+pacemaker的高可用集群)_corosync_08

Ps笔者在这个实验时首先添加了web服务器资源,然后才安装httpd服务,最后导致查看节点信息时出现错误,无法访问测试页面,解决方法:重启corosync服务即可,当然这在实际生产中是不允许的。

查看节点状态信息:

# crm status

  1. ============ 
  2.  
  3. Last updated: Thu Sep 15 15:51:17 2011 
  4.  
  5. Stack: openais 
  6.  
  7. Current DC: node1.a.com - partition with quorum 
  8.  
  9. Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 
  10.  
  11. 2 Nodes configured, 2 expected votes 
  12.  
  13. 2 Resources configured. 
  14.  
  15. ============ 
  16.  
  17. Online: [ node1.a.com node2.a.com ] 
  18.  
  19.  WebIP (ocf::heartbeat:IPaddr): Started node1.a.com 
  20.  
  21.  WebSite (lsb:httpd): Started node2.a.com 

我们发现IP资源和web站点资源分别位于两个节点上,实际生产中我们的网站资源也会分别在不同的节点上;我们也可以将两个资源分别归为一组,只供一个站点使用:

# crm   configure group Web WebIP WebSite

# crm status

 

  1. ============ 
  2.  
  3. Last updated: Thu Sep 15 15:54:31 2011 
  4.  
  5. Stack: openais 
  6.  
  7. Current DC: node1.a.com - partition with quorum 
  8.  
  9. Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 
  10.  
  11. 2 Nodes configured, 2 expected votes 
  12.  
  13. 1 Resources configured. 
  14.  
  15. ============ 
  16.  
  17. Online: [ node1.a.com node2.a.com ] 
  18.  
  19.  Resource Group: Web 
  20.  
  21.      WebIP (ocf::heartbeat:IPaddr): Started node1.a.com 
  22.  
  23.      WebSite (lsb:httpd): Started node1.a.com《-----注意此处,已经改变为同一节点 

后续相关测试:

1,在节点2上使节点1离线:

# ssh node1 -- /etc/init.d/corosync stop

# crm status

  1. ============ 
  2.  
  3. Last updated: Thu Sep 15 15:57:31 2011 
  4.  
  5. Stack: openais 
  6.  
  7. Current DC: node2.a.com - partition WITHOUT quorum 
  8.  
  9. Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 
  10.  
  11. 2 Nodes configured, 2 expected votes 
  12.  
  13. 1 Resources configured. 
  14.  
  15. ============ 
  16.  
  17. Online: [ node2.a.com ] 
  18.  
  19. OFFLINE: [ node1.a.com ] 

此时节点1已经离线,而节点2却无法获得相应的资源,当然也无法访问相应的服务,这不是我们想要的结果,此时的集群状态是“WITHOUT quorum”,没有了quorum,就无法使节点获得相应的资源,集群服务无法正常运行。我们可以采取设置quorum,来忽略quorum。如下设置:

# crm configure property no-quorum-policy=ignore

# crm status

  1. ============ 
  2.  
  3. Last updated: Thu Sep 15 16:00:24 2011 
  4.  
  5. Stack: openais 
  6.  
  7. Current DC: node2.a.com - partition WITHOUT quorum 
  8.  
  9. Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 
  10.  
  11. 2 Nodes configured, 2 expected votes 
  12.  
  13. 1 Resources configured. 
  14.  
  15. ============ 
  16.  
  17. Online: [ node2.a.com ] 
  18.  
  19. OFFLINE: [ node1.a.com ] 
  20.  
  21.  Resource Group: Web 
  22.  
  23.      WebIP (ocf::heartbeat:IPaddr): Started node2.a.com 
  24.  
  25.      WebSite (lsb:httpd): Started node2.a.com《-------此时节点2已经获得资源 

测试网页如下:

集群系列五(基于corosync+pacemaker的高可用集群)_集群_09

如果此时您再启动节点1corosync服务,您猜想会出现什么情况呢?

# ssh node1 -- /etc/init.d/corosync start

# crm status

  1. ============ 
  2.  
  3. Last updated: Thu Sep 15 16:02:09 2011 
  4.  
  5. Stack: openais 
  6.  
  7. Current DC: node2.a.com - partition with quorum 
  8.  
  9. Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 
  10.  
  11. 2 Nodes configured, 2 expected votes 
  12.  
  13. 1 Resources configured. 
  14.  
  15. ============ 
  16.  
  17. Online: [ node1.a.com node2.a.com ] 
  18.  
  19.  Resource Group: Web 
  20.  
  21.      WebIP (ocf::heartbeat:IPaddr): Started node1.a.com 
  22.  
  23.      WebSite (lsb:httpd): Started node1.a.com《------资源又重新被节点1获得 

测试网页如下:

集群系列五(基于corosync+pacemaker的高可用集群)_高可用_10

启动节点1的后资源又被重新获得,如果节点1的设备性能非常好,而且比较重要,这种情况我们可以允许它发生,但是如果节点性能相当,且两节点相距不是很近,这种资源不断的“易主”,会造成那段时间内其无法正常被访问,所以,我们有时候需要在资源因为节点故障转移到其它节点后,即便原来的节点恢复正常也禁止资源再次流转回来。这可以通过定义资源的黏性(stickiness)来实现。在创建资源时或在创建资源后,都可以指定指定资源黏性。

 

资源黏性值范围及其作用:
等于0:这是默认选项。资源放置在系统中的最适合位置这意味着当负载能力较好或较差的节点变得可用时才转移资源。此选项的作用基本等同于自动故障回复,只是资源可能会转移到非之前活动的节点上;
大于0:资源更愿意留在当前位置,但是如果有更合适的节点可用时会移动。值越高表示资源越愿意留在当前位置;
小于0:资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置;
INFINITY:如果不是因节点不适合运行资源(节点关机、节点待机、达到migration-threshold 或配置更改)而强制资源转移,资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复;
-INFINITY:资源总是移离当前位置;

 

笔者通俗的理解就是:你没钱谁还愿意跟你呀,你越有钱我就越舍不得你

 

手动设置资源的默认黏性值

# crm configure rsc_defaults resource-stickiness=100

 

 

这里我们又涉及一个概念:资源约束

  由以上的实验我们了解资源WebIPWebSite有可能会分别运行于两个节点上,这对于通过此IP提供Web服务的应用来说是不成立的,即此两者资源必须同时运行在某节点上
由此可见,即便集群拥有所有必需资源,但它可能还无法进行正确处理。资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。pacemaker共给我们提供了三种资源约束方法:
1Resource Location(资源位置):定义资源可以、不可以或尽可能在哪些节点上运行;
2Resource Collocation(资源排列):排列约束用以定义集群资源可以或不可以在某个节点上同时运行;
3Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序;

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

定义资源约束时,也可以指定每个约束的分数。分数表示指派给此资源约束的值。分数较高的约束先应用,分数较低的约束后应用。通过使用不同的分数为既定资源创建更多位置约束,可以指定资源要故障转移至的目标节点的顺序。

对于前述的WebIPWebSite可能会运行于不同节点的问题,我们还可以通过以下方法来解决:
# crm configure colocation website-with-ip INFINITY: WebSite WebIP

我们还可以设置资源启动顺序,WebIP首先运行,再运行WebSite
# crm configure order httpd-after-ip mandatory: WebIP WebSite

此外,某些时候我们可能希望在正常时服务总能在某个性能较强的节点上运行,这可以通过位置约束来实现:
# crm configure location prefer-node1 WebSite rule 200: node1
这条命令实现了将WebSite约束在node1上,且指定其分数为200

 

 

参考文档:http://blog.chinaunix.net/space.php?uid=233544&do=blog&cuid=2549033