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-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 //多播方式,ip在224-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商不够
将corosync和authkey复制至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
Jun 14 19:03:49 node1 corosync[5120]: [MAIN ] Successfully read main configuration file
查看初始化成员节点通知是否正常发出:
# 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支持heartbeat,LSB和ocf等类型的资源代理,目前较为常用的类型为LSB和OCF两类,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上启动:
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
查看集群工作状态:
Last updated: Tue Jun 14 19:37:23 2011
Current DC: node2.a.org - partition WITHOUT quorum
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上启动此资源了,如下所示:
Last updated: Tue Jun 14 19:43:42 2011
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添加为集群资源有两处资源代理可用:lsb和ocf:heartbeat,为了简单起见,我
# /etc/init.d/httpd stop
# chkconfig httpd off //不能让开机自动启动
们这里使用lsb类型:
http://172.16.23.1/index
新建资源WebSite:
# crm configure primitive WebSite lsb:httpd
查看配置文件中生成的定义:
primitive WebIP ocf:heartbeat:IPaddr \
params ip="192.168.0.66"
primitive WebSite lsb:httpd
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
因此,对于前述的WebIP和WebSite可能会运行于不同节点的问题,可以通过以下命令来解决: