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主机上也做相应的更改。
- Ifconfig eth0 172.16.14.11
- vim /etc/sysconfig/network-scripts/ifcfg-eth0
- DEVICE=eth0
- BOOTPROTO=statci
- ONBOOT=yes
- IPADDR=172.16.14.11
- NETMASK=255.255.0.0
- HWADDR=00:0c:29:1e:76:f5
- vim /etc/hosts # 添加下面两行,域名解析
- 172.16.14.11 node1.a.org node1
- 172.16.14.12 node2.a.org node2
- vim /etc/sysconfig/network # 修改network值,既主机名
- HOSTNAME=node1.a.rog
- 在shell命令行里执行hostname命令使主机名生效
- hostname node1.a.org
(2)SSH生成密钥,以实现各节点无密码SSH通讯
Node1上:
- ssh-key -t rsa
- ssh-copy-id -i .ssh/id_rsa.pub [email protected]
- Node2上:
- ssh-key -t rsa
- ssh-copy-id -i .ssh/id_rsa.pub [email protected]
(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,内容如下
- totem 表明白HA多个节点之间实现心跳信息传递的相关协议简称
- Bindnetaddr 只需要改这个,掩码它会自动运算
- Loggin
- To_logfile 记录到日志文件
- To_syslog 记录到系统日志
- # 默认两个log都是yes,建议关掉一个,节约i/o资源
- debug
- Timestamp 记录时间戳
- Logger_subsys { # 子系统相关设置
- Subsys: AMF
- Debug :off # 关闭就行,用不到AMF
- }
- service { # 定义一个服务来使用pacemaker
- ver: 0 # 版本
- name: pacemaker
- }
- aisexec { # 定义corosnyc的工作用户,需要使用root用户
- user: root
- group: root
- }
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) 启动服务
通过grep来检查,totem,,Engine,pacemaker 等信息,看是否正常,node1和node2都需要
- 查看corosync引擎是否正常启动:
- grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages
- 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/messages
- 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/messages | grep -v unpack_resources
- 查看pacemaker是否正常启动:
- # grep pcmk_startup /var/log/messages
- 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
注意:启动node2需要在node1上使用如上命令进行,不要在node2节点上直接启动;
使用如下命令查看集群节点的启动状态:
crm status
为了节点资源一致,要保证节点之间的时间相差不超过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可以查看帮助信息
# node 进入节点模式,可以设置节点standby或者online
# configure 进制配置模式,在里面可以定义资源和资源的策略
# ra 资源代理,在里面可以通过使用list命令来查看可以用到的资源代理,资源代理既服务的启动脚本。
进入 ra 模式下有一个classes命令,用于显示资源代理的种类,可以看到有heartbeat lsb osf stonith这些常见的类型
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 # 查看刚才建立的资源
# 确保无错
commit
up # 回到上一级,也可以使用cd
status # 查看资源运行情况
查看我们定义的vip时候流转到node1上,已经流转过来了
[root@node1 ~]# ifconfig
三.假设节点当机,查看不同的情况,了解定义资源组,和资源粘性值
(1)模拟node1当机,我们将它的corosync服务关闭,注意如果你是从node1上启动可以直接在node1上关闭,如果是再node2上启动,需要在node2上使用ssh node1 -- /etc/init.d/corosync stop来关闭
这是因为我们没有关闭quorum,这样node1关闭后,就直接使HA失效了,我们将quorum关闭,在shell命令行里输入下列命令。
crm configure property no-quorum-policy=ignore
再次查看状态,WebIP 流转到node2上
我们将node1服务启动,在node2上输入
ssh node1 -- /etc/init.d/corosync start
再次查看状态,发现WebIP又流转回去了。
(2)配置一个http服务资源WerbServer
首先,在两个节点上安装httpd服务
yum install httpd
定义httpd资源WebServer
crm ra list lsb
meta lsb:httpd
mate ocf:hearbeat:apache
primitive WebServer lsb:httpd
status
发现在node2上,虽然实现了负载均衡,但是我们的目的是组成HA,不符合要求,我们需要把他们定义一个组,这样两个资源就在一个节点上启动
configure
help group 如何定义组
group Web WebIP WebSever
commit
show
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上
我们在将 node1给启动
网页依然在node2上,粘性生效