Corosync/Openais + Pacemaker  实现高可用集群

Corosync简介:

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


通过本文您将了解到:

1.Corosync的安装,简单配置

2.通过pacemaker来管理高可用集群

3.Crm命令的使用

4.定义资源,资源组和资源策略


更多pacemaker的使用详情请访问:pacemaker官方网站http://www.clusterlabs.org/


本文采用rpm包来安装Corosync,openais和pacemaker,使用RPM包,需要注意的是之间的依赖关系:pacemaker依赖于heartbeat v3,所以我们需要还需要安装heartbeat v3。

我们配置两台虚拟机来模拟安装整个过程,通过corosync定义两个资源ipaddr和httpd来说明在crm命令行里如何定义资源。

node1.a.org   172.16.14.11

node2.a.org   172.16.14.12

Ipaddr: 172.16.14.10                     # 提供web服务的虚拟IP

 

注意:

1.节点之间可以不需要使用SSH互相访问

2.主机名要和uname -n一致,并且使用FQDN格式的主机名

3.借助于/etc/hosts文件来保持节点之间的联系,而不要使用DNS服务

 

一.安装,配置corosync,pacemaker,并启动服务

(1) 给节点配置静态IP,编辑/etc/hosts 文件,以node1为例,以下配置在node2主机上也做相应的更改。 

 

 
  
  1. Ifconfig eth0 172.16.14.11 
  2.  
  3. vim /etc/sysconfig/network-scripts/ifcfg-eth0 
  4.  
  5. DEVICE=eth0 
  6.  
  7. BOOTPROTO=statci 
  8.  
  9. ONBOOT=yes 
  10.  
  11. IPADDR=172.16.14.11 
  12.  
  13. NETMASK=255.255.0.0 
  14.  
  15. HWADDR=00:0c:29:1e:76:f5 
  16.  
  17. vim /etc/hosts                # 添加下面两行,域名解析 
  18.  
  19. 172.16.14.11   node1.a.org     node1 
  20.  
  21. 172.16.14.12   node2.a.org     node2 
  22.  
  23. vim /etc/sysconfig/network     # 修改network值,既主机名 
  24.  
  25. HOSTNAME=node1.a.rog 
  26.  
  27. 在shell命令行里执行hostname命令使主机名生效 
  28.  
  29. hostname node1.a.org 

 

(2)SSH生成密钥,以实现各节点无密码SSH通讯

Node1上:

 

 
  
  1. ssh-key -t rsa 
  2.  
  3. ssh-copy-id -i .ssh/id_rsa.pub  root@node2.a.org 
  4.  
  5. Node2上: 
  6.  
  7. ssh-key -t rsa 
  8.  
  9. ssh-copy-id -i .ssh/id_rsa.pub  root@node1.a.org 

 

(3)下载,安装相关软件

相关软件包:

 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

ldirectord-1.0.1-1.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


下载完毕后,放在同一个文件夹下,比如/tmp/corosync,使用yum localinstall 安装

yum localinstall --nogpgcheck corosync* pacemaker-1.0.11-1.2.el5.i386.rpm cluster-glue-* resource-agents-1.0.4-1.1.el5.i386.rpm pacemaker-libs-1.0.11-1.2.el5.i386.rpm heartbeat-* libesmtp-1.0.4-5.el5.i386.rpm perl-TimeDate-1.16-5.el5.noarch.rpm -y

openais 并不是不是必须的,这里我们也把它装上

rpm -ivh openais*.rpm

复制配置文件样本

cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf

我们来看下它的主配置文件,在/etc/corosync/corosync.conf,内容如下

 

 
  
  1. totem  表明白HA多个节点之间实现心跳信息传递的相关协议简称 
  2.  
  3.       Bindnetaddr   只需要改这个,掩码它会自动运算 
  4.  
  5. Loggin  
  6.  
  7.       To_logfile      记录到日志文件 
  8.  
  9.       To_syslog      记录到系统日志 
  10.  
  11. # 默认两个log都是yes,建议关掉一个,节约i/o资源 
  12.  
  13.        debug 
  14.  
  15.        Timestamp     记录时间戳 
  16.  
  17.        Logger_subsys {              # 子系统相关设置 
  18.  
  19.                Subsys: AMF 
  20.  
  21.                Debug :off           # 关闭就行,用不到AMF 
  22.  
  23.        } 
  24.  
  25. service {                       # 定义一个服务来使用pacemaker 
  26.  
  27.      ver: 0                     # 版本 
  28.  
  29.      name: pacemaker 
  30.  
  31.  
  32. aisexec {                       # 定义corosnyc的工作用户,需要使用root用户 
  33.  
  34.      user: root 
  35.  
  36.      group: root 
  37.  

 

 

vim /etc/corosync/corosync.conf       # 修改下列值

bindnetaddr 172.16.14.0

# 添加

service {

        ver: 0

        name: pacemaker

}

aisexec {                       # 定义corosnyc的工作用户,需要使用root用户

     user: root

     group: root

}

mkdir -v /var/log/cluster    创建日志文件目录

corosync-keygen      # 生成corosync密钥,它取墒池里的随机数1024位,它不是一个文本文件,权限是400

ssh node2 'mkdir -v /var/log/cluster '

 

(3) 启动服务

wps_clip_p_w_picpath-30515

通过grep来检查,totem,,Engine,pacemaker 等信息,看是否正常,node1和node2都需要

 

 
  
  1. 查看corosync引擎是否正常启动: 
  2.  
  3. grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages 
  4.  
  5. Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service. 
  6.  
  7. Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'
  8.  
  9. Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Corosync Cluster Engine exiting with status 8 at main.c:1397. 
  10.  
  11. Jun 14 19:03:49 node1 corosync[5120]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service. 
  12.  
  13. Jun 14 19:03:49 node1 corosync[5120]:   [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'
  14.  
  15. 查看初始化成员节点通知是否正常发出: 
  16.  
  17.  grep  TOTEM  /var/log/messages 
  18.  
  19. Jun 14 19:03:49 node1 corosync[5120]:   [TOTEM ] Initializing transport (UDP/IP). 
  20.  
  21. Jun 14 19:03:49 node1 corosync[5120]:   [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0). 
  22.  
  23. Jun 14 19:03:50 node1 corosync[5120]:   [TOTEM ] The network interface [192.168.0.5is now up. 
  24.  
  25. Jun 14 19:03:50 node1 corosync[5120]:   [TOTEM ] A processor joined or left the membership and a new membership was formed. 
  26.  
  27. 检查启动过程中是否有错误产生: 
  28.  
  29. grep ERROR: /var/log/messages | grep -v unpack_resources 
  30.  
  31. 查看pacemaker是否正常启动: 
  32.  
  33. # grep pcmk_startup /var/log/messages 
  34.  
  35. Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: CRM: Initialized 
  36.  
  37. Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] Logging: Initialized pcmk_startup 
  38.  
  39. Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: Maximum core file size is4294967295 
  40.  
  41. Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: Service: 9 
  42.  
  43. 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

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

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

crm status

wps_clip_p_w_picpath-22258

为了节点资源一致,要保证节点之间的时间相差不超过1s,要求不是特别严格,但是有些资源要求很严格,必须不超过1s。

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交互模式简介,添加IP和web服务资源

(1)crm交互模式简介

在sehll命令行里输入crm可以进入交互式配置模式, 输入help可以查看帮助信息

wps_clip_p_w_picpath-27862

#  node  进入节点模式,可以设置节点standby或者online

#  configure  进制配置模式,在里面可以定义资源和资源的策略

#  ra   资源代理,在里面可以通过使用list命令来查看可以用到的资源代理,资源代理既服务的启动脚本。

wps_clip_p_w_picpath-21752

进入 ra 模式下有一个classes命令,用于显示资源代理的种类,可以看到有heartbeat lsb osf stonith这些常见的类型

wps_clip_p_w_picpath-918

list lib    可以显示支持的lsb脚本,这些都是/etc/init.d/下面有的启动脚本

# 显示ocf的

list ocf heartbeat

list ocf pacemaker

(2)定义ipaddr资源WebIP

# 查看定义Ipaddr资源的帮助信息

meta ocf:heartbeat:Ipaddr

#进入configure模式

cd

configure

# 先指定资源类型:资源名字:资源代理

primitive WebIP ocf:heartbeat:IPaddr params ip=172.16.14.10

SHOW   # 查看刚才建立的资源

wps_clip_p_w_picpath-21853

# 确保无错

commit

up      # 回到上一级,也可以使用cd 

status    # 查看资源运行情况

wps_clip_p_w_picpath-20245

查看我们定义的vip时候流转到node1上,已经流转过来了

[root@node1 ~]# ifconfig

wps_clip_p_w_picpath-15609

 

三.假设节点当机,查看不同的情况,了解定义资源组,和资源粘性值

(1)模拟node1当机,我们将它的corosync服务关闭,注意如果你是从node1上启动可以直接在node1上关闭,如果是再node2上启动,需要在node2上使用ssh node1 -- /etc/init.d/corosync stop来关闭

wps_clip_p_w_picpath-10651

这是因为我们没有关闭quorum,这样node1关闭后,就直接使HA失效了,我们将quorum关闭,在shell命令行里输入下列命令。

crm configure property no-quorum-policy=ignore

再次查看状态,WebIP 流转到node2上

wps_clip_p_w_picpath-10871

我们将node1服务启动,在node2上输入 

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

再次查看状态,发现WebIP又流转回去了。

wps_clip_p_w_picpath-22150

(2)配置一个http服务资源WerbServer

首先,在两个节点上安装httpd服务

yum install httpd

定义httpd资源WebServer

crm ra list lsb       

wps_clip_p_w_picpath-32158

meta lsb:httpd

mate ocf:hearbeat:apache

primitive WebServer lsb:httpd

status

wps_clip_p_w_picpath-8445

发现在node2上,虽然实现了负载均衡,但是我们的目的是组成HA,不符合要求,我们需要把他们定义一个组,这样两个资源就在一个节点上启动

configure

help group       如何定义组

wps_clip_p_w_picpath-23970

group Web WebIP WebSever

commit

show

wps_clip_p_w_picpath-8537

cd

status

但是我们使用了HA,所以web服务一定不能让它开机启动,所以

chkconfig httpd off

测试下网页看是否在node1上,在浏览器里输入172.16.14.10

(3)定义资源的粘性值

在实际应用中,如果两台主机的性能差不多,当主节点当机后,次节点接受web资源,而当主节点恢复的时候,次节点又需要将WEB资源还给主节点,这就造成了一段时间内服务不可访问,降低了高可用性,这时候,我们就需要定义资源的粘性值

资源根据粘性值在决定当主节点会否后,是否离开当前节点。

正数:更喜欢呆在当前节点

负数:迫不及待的离开当前节点

在node2上定义

crm configure rsc_defaults resource-stickiness=100

然后停掉node1

网页立刻 到node2上

wps_clip_p_w_picpath-24430

我们在将 node1给启动

网页依然在node2上,粘性生效

wps_clip_p_w_picpath-26356