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

来源:岁月联盟 编辑:exp 时间:2011-09-16

实验环境:
  1)基于vmwere虚拟机实现
  2)本配置共有两个测试节点,分别node1.a.com和node2.a.com,相的IP地址分别为172.16.4.11和172.16.4.22;
  3)模拟实现的集群服务是web服务;
  4)提供web服务的地址为172.16.4.1
实验拓扑图:

1,基础环境设置:
首先配置一台HA主机需要做的准备工作:
1)因为集群节点的工作的重要性,而且需要提供稳定的网络环境,这里我们需要给节点配置固定的IP地址,编辑/etc/sysconfig/network-scripts/ifcfg-eth0,配置IP如下:
DEVICE=eth0
 
BOOTPROTO=static
 
IPADDR=172.16.4.11
 
NETMASK=255.255.0.0
 
ONBOOT=yes
 
HWADDR=00:0c:29:a2:fa:bb

2)保证节点主机的名称和“uname -n”命令的结果保持一致,我们需要编辑/etc/sysconfig/network,配置如下:
NETWORKING=yes
 
NETWORKING_IPV6=no
 
HOSTNAME=node1.a.com
而且要做以下操作,使主机名本次生效:
#source   /etc/sysconfig/network
#hostname  node1.a.com
3)所有节点的主机名称和对应的IP地址解析服务可以正常工作,我们不需要DNS服务,只需要保证两个节点上的/etc/hosts文件均为下面的内容:

172.16.4.11  node1.a.com   node1
 
172.16.4.22  node2.a.com   node2
以上三步配置完成后能实现相互解析主机名,如下:

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
然后测试:

2,安装环境需要的相应的软件包:
#yum  install   -y  libibverbs librdmacm lm_sensors libtool-ltdl openhpi-libs openhpi perl-TimeDate
3,安装corosync和pacemaker,我们这里将软件包放在/root/corosync目录下(两个节点都要做):
cluster-glue-1.0.6-1.6.el5.i386.rpm
 
cluster-glue-libs-1.0.6-1.6.el5.i386.rpm
 
corosync-1.2.7-1.1.el5.i386.rpm
 
corosynclib-1.2.7-1.1.el5.i386.rpm
 
heartbeat-3.0.3-2.3.el5.i386.rpm
 
heartbeat-libs-3.0.3-2.3.el5.i386.rpm
 
libesmtp-1.0.4-5.el5.i386.rpm
 
openais-1.1.3-1.6.el5.i386.rpm
 
openaislib-1.1.3-1.6.el5.i386.rpm
 
pacemaker-1.0.11-1.2.el5.i386.rpm
 
pacemaker-libs-1.0.11-1.2.el5.i386.rpm
 
perl-TimeDate-1.16-5.el5.noarch.rpm
 
resource-agents-1.0.4-1.1.el5.i386.rpm
这里您安装的软件版本可能和笔者的不一致,只要符合您的实验平台就行。
开始安装:
# cd  /root/corosync/
# yum -y --nogpgcheck  localinstall  *.rpm
这里我们使用本地yum安装,并忽略包的检查。
4,corosync的相关配置(在节点1上执行):
# cd   /etc/corosync
# cp   corosync.conf.example  corosync.conf
这里corosync.conf.example是配置样本,我们只需拷贝一份,并进行修改即可:
# vim /etc/corosync/corosync.conf
 
  # Please read the corosync.conf.5 manual page
 
compatibility: whitetank
 
totem {
 
        version: 2
 
        secauth: off
 
        threads: 0
 
        interface {
 
                ringnumber: 0
 
                bindnetaddr: 172.16.0.0《------此处是您需要修改的地方,为网卡的网络地址
 
                mcastaddr: 226.94.1.1
 
                mcastport: 5405
 
        }
 
}
 
logging {
 
        fileline: off
 
        to_stderr: no
 
        to_logfile: yes
 
        to_syslog: yes
 
        logfile: /var/log/cluster/corosync.log《-----此处日志存放的地方
 
        debug: off
 
        timestamp: on
 
        logger_subsys {
 
                subsys: AMF
 
                debug: off
 
        }
 
}
 
amf {
 
        mode: disabled
 
}
 
service {《-----------------此处以下是您需要添加的内容
 
  ver: 0
 
  name: pacemaker
 
}
 
aisexec {
 
  user: root
 
  group: root
 
}
生成节点间通信时用到的认证密钥文件:
# 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
 
Sep 15 11:20:41 localhost smartd[2350]: Opened configuration file /etc/smartd.conf 
 
Sep 15 11:24:24 localhost smartd[2416]: Opened configuration file /etc/smartd.conf 
 
Sep 15 11:30:14 localhost smartd[2659]: Opened configuration file /etc/smartd.conf 
 
Sep 15 15:12:38 localhost corosync[694]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
 
Sep 15 15:12:38 localhost corosync[694]:   [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
查看初始化成员节点通知是否正常发出
# grep TOTEM /var/log/messages
 
Sep 15 15:12:38 localhost corosync[694]:   [TOTEM ] Initializing transport (UDP/IP).
 
Sep 15 15:12:38 localhost corosync[694]:   [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
 
Sep 15 15:12:38 localhost corosync[694]:   [TOTEM ] The network interface [172.16.4.11] is now up.
 
Sep 15 15:12:39 localhost corosync[694]:   [TOTEM ] Process pause detected for 515 ms, flushing membership messages.
 
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
Sep 15 15:12:39 localhost corosync[694]:   [pcmk  ] info: pcmk_startup: CRM: Initialized
 
Sep 15 15:12:39 localhost corosync[694]:   [pcmk  ] Logging: Initialized pcmk_startup
 
Sep 15 15:12:39 localhost corosync[694]:   [pcmk  ] info: pcmk_startup: Maximum core file size is: 4294967295
 
Sep 15 15:12:39 localhost corosync[694]:   [pcmk  ] info: pcmk_startup: Service: 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
 
============
 
Last updated: Thu Sep 15 15:17:50 2011
 
Stack: openais
 
Current DC: node1.a.com - partition with quorum
 
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
 
2 Nodes configured, 2 expected votes
 
0 Resources configured.
 
============
 
Online: [ node1.a.com node2.a.com ]《----此处说明您的两个集群节点均已运行正常。
6,配置集群的工作属性:
因为corosync默认已经启用了stonith,而当前又没有添加stonith设备,会出现默认配置不可用的状态:
# crm_verify  -L
 
crm_verify[762]: 2011/09/15_15:20:13 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
 
crm_verify[762]: 2011/09/15_15:20:13 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
 
crm_verify[762]: 2011/09/15_15:20:13 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
 
Errors found during check: config not valid
 
  -V may provide more details
为防止以后出现错误,影响操作,我们这里可以禁用stonith:
# crm configure property stonith-enabled=false《----这样执行的命令会提交而且会立即生效
INFO: building help index
使用一下命令可以查看当前corosync的配置信息:
# crm configure show
 
node node1.a.com
 
node node2.a.com
 
property $id="cib-bootstrap-options" /
 
dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" /
 
cluster-infrastructure="openais" /
 
expected-quorum-votes="2" /
 
stonith-enabled="false"《----stonith已经被禁用
  crm,crm_verify相关的命令是1.0后的版本的pacemaker提供的基于命令行的集群管理工具;可以在集群中的任何一个节点上执行,查看相应的信息。
 
7,为集群添加集群资源:
corosync支持heartbeat,lsb和ocf等类型的资源代理,目前较为常用的类型为lsb和lsb两类,stonith类专为配置stonith设备而用。
查看当前集群系统支持的资源代理类型:
# crm ra classes
 
heartbeat
 
lsb
 
ocf / heartbeat pacemaker
 
Stonith
查看某种类型的资源代理的列表:
#crm ra list lsb

#crm  ra  list  ocf  heartbeat

# crm ra list ocf pacemaker

# crm ra list stonith
 

下面我们来实现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添加为集群资源有两处资源代理可用:lsb和ocf:heartbeat,为了简单起见,我们这里使用lsb类型:
#crm configure primitive WebSite lsb:httpd
您此时就可以通过主机的浏览器输入http://172.16.4.1进行访问web服务:

Ps:笔者在这个实验时首先添加了web服务器资源,然后才安装httpd服务,最后导致查看节点信息时出现错误,无法访问测试页面,解决方法:重启corosync服务即可,当然这在实际生产中是不允许的。
查看节点状态信息:
# crm status
============
 
Last updated: Thu Sep 15 15:51:17 2011
 
Stack: openais
 
Current DC: node1.a.com - partition with quorum
 
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
 
2 Nodes configured, 2 expected votes
 
2 Resources configured.
 
============
 
Online: [ node1.a.com node2.a.com ]
 
 WebIP (ocf::heartbeat:IPaddr): Started node1.a.com
 
 WebSite (lsb:httpd): Started node2.a.com
我们发现IP资源和web站点资源分别位于两个节点上,实际生产中我们的网站资源也会分别在不同的节点上;我们也可以将两个资源分别归为一组,只供一个站点使用:
# crm   configure group Web WebIP WebSite
# crm status
 
============
 
Last updated: Thu Sep 15 15:54:31 2011
 
Stack: openais
 
Current DC: node1.a.com - partition with quorum
 
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
 
2 Nodes configured, 2 expected votes
 
1 Resources configured.
 
============
 
Online: [ node1.a.com node2.a.com ]
 
 Resource Group: Web
 
     WebIP (ocf::heartbeat:IPaddr): Started node1.a.com
 
     WebSite (lsb:httpd): Started node1.a.com《-----注意此处,已经改变为同一节点
后续相关测试:
1,在节点2上使节点1离线:
# ssh node1 -- /etc/init.d/corosync stop
# crm status
============
 
Last updated: Thu Sep 15 15:57:31 2011
 
Stack: openais
 
Current DC: node2.a.com - partition WITHOUT quorum
 
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
 
2 Nodes configured, 2 expected votes
 
1 Resources configured.
 
============
 
Online: [ node2.a.com ]
 
OFFLINE: [ node1.a.com ]
此时节点1已经离线,而节点2却无法获得相应的资源,当然也无法访问相应的服务,这不是我们想要的结果,此时的集群状态是“WITHOUT quorum”,没有了quorum,就无法使节点获得相应的资源,集群服务无法正常运行。我们可以采取设置quorum,来忽略quorum。如下设置:
# crm configure property no-quorum-policy=ignore
# crm status
============
 
Last updated: Thu Sep 15 16:00:24 2011
 
Stack: openais
 
Current DC: node2.a.com - partition WITHOUT quorum
 
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
 
2 Nodes configured, 2 expected votes
 
1 Resources configured.
 
============
 
Online: [ node2.a.com ]
 
OFFLINE: [ node1.a.com ]
 
 Resource Group: Web
 
     WebIP (ocf::heartbeat:IPaddr): Started node2.a.com
 
     WebSite (lsb:httpd): Started node2.a.com《-------此时节点2已经获得资源
测试网页如下:

如果此时您再启动节点1的corosync服务,您猜想会出现什么情况呢?
# ssh node1 -- /etc/init.d/corosync start
# crm status
============
 
Last updated: Thu Sep 15 16:02:09 2011
 
Stack: openais
 
Current DC: node2.a.com - partition with quorum
 
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
 
2 Nodes configured, 2 expected votes
 
1 Resources configured.
 
============
 
Online: [ node1.a.com node2.a.com ]
 
 Resource Group: Web
 
     WebIP (ocf::heartbeat:IPaddr): Started node1.a.com
 
     WebSite (lsb:httpd): Started node1.a.com《------资源又重新被节点1获得
测试网页如下:

启动节点1的后资源又被重新获得,如果节点1的设备性能非常好,而且比较重要,这种情况我们可以允许它发生,但是如果节点性能相当,且两节点相距不是很近,这种资源不断的“易主”,会造成那段时间内其无法正常被访问,所以,我们有时候需要在资源因为节点故障转移到其它节点后,即便原来的节点恢复正常也禁止资源再次流转回来。这可以通过定义资源的黏性(stickiness)来实现。在创建资源时或在创建资源后,都可以指定指定资源黏性。
 
资源黏性值范围及其作用:
等于0:这是默认选项。资源放置在系统中的最适合位置,这意味着当负载能力“较好”或较差的节点变得可用时才转移资源。此选项的作用基本等同于自动故障回复,只是资源可能会转移到非之前活动的节点上;
大于0:资源更愿意留在当前位置,但是如果有更合适的节点可用时会移动。值越高表示资源越愿意留在当前位置;
小于0:资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置;
INFINITY:如果不是因节点不适合运行资源(节点关机、节点待机、达到migration-threshold 或配置更改)而强制资源转移,资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复;
-INFINITY:资源总是移离当前位置;
 
笔者通俗的理解就是:你没钱谁还愿意跟你呀,你越有钱我就越舍不得你!
 
手动设置资源的默认黏性值:
# crm configure rsc_defaults resource-stickiness=100
 
 
这里我们又涉及一个概念:资源约束
  由以上的实验我们了解资源WebIP和WebSite有可能会分别运行于两个节点上,这对于通过此IP提供Web服务的应用来说是不成立的,即此两者资源必须同时运行在某节点上
由此可见,即便集群拥有所有必需资源,但它可能还无法进行正确处理。资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。pacemaker共给我们提供了三种资源约束方法:
1)Resource Location(资源位置):定义资源可以、不可以或尽可能在哪些节点上运行;
2)Resource Collocation(资源排列):排列约束用以定义集群资源可以或不可以在某个节点上同时运行;
3)Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序;

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

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

对于前述的WebIP和WebSite可能会运行于不同节点的问题,我们还可以通过以下方法来解决:
# 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;
 
 

作者“痕久远”