Corosync+Pacemaker实现web高可用集群

1 corosync简介

oreosync在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。它是一个新兴的软件,2008年推出,但其实它并不是一个真正意义上的新软件,在2002年的时候有一个项目Openais , 它由于过大,分裂为两个子项目,其中可以实现HA心跳信息传输的功能就是Corosync ,它的代码60%左右来源于Openais. Corosync可以提供一个完整的HA功能,但是要实现更多,更复杂的功能,那就需要使用Openais了。Corosync是未来的发展方向。在以后的新项目里,一般采用Corosync,而hb_gui可以提供很好的HA管理功能,可以实现图形化的管理。另外相关的图形化有RHCS的套件luci+ricci

2、实现说明:需要两台主机即两个服务节点,都需要安装apache,并能够提供服务,实际应用中网页内容需一样,但这里只为做实验,需不一样,才能看到效果。

节点1,IP地址:172.16.23.11 主机名node1.wl.com  主服务器

节点2,IP地址:172.16.23.12 主机名 node2.wl.com  备用服务器

3、设置web1,web2主机名,编辑/etc/hosts 文件
网卡eth0设置
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=172.16.23.11
GATEWAY=172.16.0.1
HWADDR=00:0c:29:33:45:ab
编缉/etc/hosts文件,添加如下两行

172.16.23.11     node1.wl.com      node1  //别名    

 172.16.23.12    node2.wl.com      node2  //别名    

重启网络使生效
Service network restart
uname –n  名字没改,用hostname使立即生效
hostname  node1
 
4、设置两服务器时钟同步

date 0416185012.33   //当前时间 :格式月日时分年秒

hwclock –w         //把系统时间同步到硬件

5、设定两个节点可以基于密钥进行ssh通信,这可以通过类似如下的命令实现:
Node1:
# ssh-keygen -t rsa

# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2

 
Node2:
# ssh-keygen -t rsa

# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1

6、下载安装如下软件包,及安装http
cluster-glue-1.0.6-1.6.el5.i386.rpm     
heartbeat-3.0.3-2.3.el5.i386.rpm    
 pacemaker-libs-1.0.11-1.2.el5.i386.rpm
cluster-glue-libs-1.0.6-1.6.el5.i386.rpm 
heartbeat-libs-3.0.3-2.3.el5.i386.rpm 
perl-TimeDate-1.16-5.el5.noarch.rpm
corosync-1.2.7-1.1.el5.i386.rpm         
 libesmtp-1.0.4-5.el5.i386.rpm        
 resource-agents-1.0.4-1.1.el5.i386.rpm
 
corosynclib-1.2.7-1.1.el5.i386.rpm        pacemaker-1.0.11-1.2.el5.i386.rpm
使用如下命令安装:

# yum -y --nogpgcheck localinstall *.rpm   //本地yum安装,可帮助解决依赖关系

安装httpd服务 yum install httpd

设置主页 echo ”node1” > /var/www/html/index.html
浏览器测试确保成功
以上内容node1,node2基本类似
8、配置corosync
cd /etc/corosync
cpcorosync.conf.example  /corosync.conf

#vim /corosync.conf 配置文件内容如下

totem {

        version: 2
        secauth: on
        threads: 0
        interface {
                ringnumber: 0
                bindnetaddr: 172.16.0.0    //设置你的网段

                mcastaddr: 226.194.1.23  //多播方式,ip224-239网段可随意设置                mcastport: 5405

        }

}
 

logging {               // 子系统设置

        fileline: off
        to_stderr: no

        to_logfile: yes  

        to_syslog: no  //日志有两个,这里关闭,方便查找日志内容

        logfile: /var/log/cluster/corosync.log

        debug: off      //如果想排错,可临时开启

        timestamp: on

        logger_subsys {

                subsys: AMF
                debug: off

        }

}
 
amf {
        mode: disabled
}
 
编辑corosync.conf,添加如下内容:
service {    # 定义一个服务
ver: 0       
name: pacemaker    //可启动pacemaker
use_mgmtd: yes
}
 
aisexec {
user: root

group: root

}

创建日志存放文件夹mkdir /var/log/cluster

9、生成节点间通信时用到的认证密钥文件:
# corosync-keygen
二进制,dev/random商不够
corosyncauthkey复制至node2:

# scp -p corosync.conf  authkey  node2:/etc/corosync/   //拷贝内容到另一主机

10、尝试启动,(以下命令在node1上执行):
 

# /etc/init.d/corosync start

service corosync start 5560

查看corosync引擎是否正常启动:                              /var/log/cluster/corosync.log

# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log

Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide

service.

Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Successfully read main configuration file

'/etc/corosync/corosync.conf'.

Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Corosync Cluster Engine exiting with status 8 at main.c:1397.

Jun 14 19:03:49 node1 corosync[5120]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide

service.

Jun 14 19:03:49 node1 corosync[5120]:   [MAIN  ] Successfully read main configuration file

'/etc/corosync/corosync.conf'.
 

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

# grep  TOTEM  /var/log/cluster/corosync.log

Jun 14 19:03:49 node1 corosync[5120]:   [TOTEM ] Initializing transport (UDP/IP).

Jun 14 19:03:49 node1 corosync[5120]:   [TOTEM ] Initializing transmit/receive security: libtomcrypt

SOBER128/SHA1HMAC (mode 0).

Jun 14 19:03:50 node1 corosync[5120]:   [TOTEM ] The network interface [192.168.0.5] is now up.

Jun 14 19:03:50 node1 corosync[5120]:   [TOTEM ] A processor joined or left the membership and a new membership was

formed.
 

检查启动过程中是否有错误产生:

# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources

 

查看pacemaker是否正常启动:

# grep pcmk_startup /var/log/cluster/corosync.log

Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: CRM: Initialized

Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] Logging: Initialized pcmk_startup

Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: Maximum core file size is: 4294967295

Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: Service: 9

Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: Local hostname: node1.a.org

 

如果上面命令执行均没有问题,接着可以执行如下命令启动node2上的corosync

# ssh node2 '/etc/init.d/corosync' start

chkconfig httpd off

注意:启动node2需要在node1上使用如上命令进行,不要在node2节点上直接启动;

crm_mon

使用如下命令查看集群节点的启动状态:

# crm status

============

Last updated: Tue Jun 14 19:07:06 2011

Stack: openais

Current DC: node1.a.org - partition with quorum

Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87

2 Nodes configured, 2 expected votes

0 Resources configured.

============
 

Online: [ node1.a.org node2.a.org ]

 

从上面的信息可以看出两个节点都已经正常启动,并且集群已经牌正常工作状态。

12、配置集群的工作属性,禁用stonith
 
corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用,这可以通过如下命令验正:
 

# crm_verify -L

crm_verify[5202]: 2011/06/14_19:10:38 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources

have been defined

crm_verify[5202]: 2011/06/14_19:10:38 ERROR: unpack_resources: Either configure some or disable STONITH with the

stonith-enabled option

crm_verify[5202]: 2011/06/14_19:10:38 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

使用如下命令查看当前的配置信息:

# crm configure show

node node1.a.org

node node2.a.org

property $id="cib-bootstrap-options" \

       dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \

       cluster-infrastructure="openais" \

       expected-quorum-votes="2" \
       stonith-enabled="false
      

从中可以看出stonith已经被禁用。

13、集群添加集群资源方法

查看集群系统所支持的类型:

# crm ra classes

heartbeat
lsb

ocf / heartbeat pacemaker

stonith

说明:corosync支持heartbeatLSBocf等类型的资源代理,目前较为常用的类型为LSBOCF两类,stonith类专为配置stonith设备而用

查看某种类别下资源代理列表,方法如下

#crm ra list lsb| ocf heartbeat| ocf  pacemaker | stonith  //crm ra list 类别

例子:查看资源代理帮助信息

# crm ra info ocf:heartbeat:IPaddr

14、接下来要创建的web集群创建一个IP地址资源,以在通过集群提供web服务时使用

# crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=172.16.23.1 //打开网页时的ip地址

primitive    基本类型资源

WebIP       资源名称
ocf:heartbeat:IPaddr  代理名称

通过如下的命令执行结果可以看出此资源已经在node1.a.org上启动:

# crm status

WebIP     (ocf::heartbeat:IPaddr):  Started node1.a.org

当然,也可以在node1上执行ifconfig命令看到此地址已经在eth0的别名上生效:

# ifconfig

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:AA:DD:CF 
          inet addr:192.168.0.66  Bcast:192.168.0.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:67 Base address:0x2000
         

而后我们到node2上通过如下命令停止node1上的corosync服务:

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

 

查看集群工作状态:

# crm status

============

Last updated: Tue Jun 14 19:37:23 2011

Stack: openais

Current DC: node2.a.org - partition WITHOUT quorum

Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87

2 Nodes configured, 2 expected votes

1 Resources configured.

============
 

Online: [ node2.a.org ]

OFFLINE: [ node1.a.org ]

 

上面的信息显示node1.a.org已经离线,但资源WebIP却没能在node2.a.org上启动。这是因为此时的集群状态为"WITHOUT quorum"

即已经失去了quorum,此时集群服务本身已经不满足正常运行的条件,这对于只有两节点的集群来讲是不合理的。因此,我们可以通

过如下的命令来修改忽略quorum不能满足的集群状态检查:

 

# crm configure property no-quorum-policy=ignore

 

片刻之后,集群就会在目前仍在运行中的节点node2上启动此资源了,如下所示:

# crm status

============

Last updated: Tue Jun 14 19:43:42 2011

Stack: openais

Current DC: node2.a.org - partition WITHOUT quorum

Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87

2 Nodes configured, 2 expected votes

1 Resources configured.

============
 

Online: [ node2.a.org ]

OFFLINE: [ node1.a.org ]

 
 WebIP   (ocf::heartbeat:IPaddr):  Started node2.a.org
 

好了,验正完成后,我们正常启动node1.a.org:

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

16、我们这里可以通过以下方式为资源指定默认黏性值:

# crm configure rsc_defaults resource-stickiness=100

17、我们将此httpd服务添加为集群资源。将httpd添加为集群资源有两处资源代理可用:lsbocf:heartbeat,为了简单起见,我
 # /etc/init.d/httpd stop

# chkconfig httpd off  //不能让开机自动启动

们这里使用lsb类型:

http//172.16.23.1/index

新建资源WebSite

# crm configure primitive WebSite lsb:httpd

 

查看配置文件中生成的定义:

node node1.a.org
node node2.a.org

primitive WebIP ocf:heartbeat:IPaddr \

       params ip="192.168.0.66"

primitive WebSite lsb:httpd

property $id="cib-bootstrap-options" \

       dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \

       cluster-infrastructure="openais" \

       expected-quorum-votes="2" \
       stonith-enabled="false" \
       no-quorum-policy="ignore"
      
      

查看资源的启用状态:

# crm status Online: [ node1.a.org node2.a.org ]

 
 WebIP   (ocf::heartbeat:IPaddr):  Started node1.a.org

 WebSite (lsb:httpd):     Started node2.a.org

 

因此,对于前述的WebIPWebSite可能会运行于不同节点的问题,可以通过以下命令来解决:

# crm configure colocation website-with-ip INFINITY:  WebSite  WebIP

 

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

# crm configure order httpd-after-ip mandatory:  WebIP  WebSite