V 3 corosync&pacemaker
一、相关概念:
补充 {
what is high Availability?
A=MTBF/(MTBF+MTTR)
MTBF(mean time betweenfailures平均无故障时间)
MTTR(mean time to repair平均修复时间)
two ways improve availability?
increase MTBF to very large values
reduce MTTR to very low values
hardware failure causes?
design failure(rare);randomfailure(rare);infant mortality(high rate of failure)使用不当;wear out(high rate of failure)用坏了
increase hardware MTBF?
use better components;preemptivelyreplace hardware prior to wear out在用坏前提前替换掉
software failure causes?
implementation defects(very common)任一软件代码超过三行都有缺陷;typicaly measured in defects per KLOC
increase software MTBF?
experienced engineering team;peer reviewof all code;simple design;compact code foot print;static and runtimeanalysis tools such as valgrind,lint,high compiler warning levels,coverity,lcov;testcoverage of the software
}
corosync(redhat6.X的RHCS,比heartbeat更简单,是纯粹的message layer,每个版本都有一个名称,www.corosync.org,支持更多node,最佳16个,最多达100个,被各大linux流行版本所采用,如suse、debian、redhat)
openais(redhat5.X的RHCS,作为内核中信息通信的API,借助于CMAN完成message layer,不同版本有不同的代称,例如whitetank版本wilson版本等,使用rgmanager完成资源管理,openais是接口,一大堆的API)
corosync是openais发展到wilson版本后衍生出来的开放性集群引擎
openais在9.0版本后分成两个项目,一部分是corosync(只保留了集群引擎),另一部分是openais(保留了AIS规范和corosync的一部分子功能);有时需要corosync提供AIS,这时就要安装openais插件
AIS(application interface standard,应用接口规范,是用来定义API的开放性规范的集合,这些应用程序作为中间件为应用服务提供一种开放的、高移植性的程序接口,在实现高可用过程中是亟需的)
SAF(service availability forum,服务可用性论坛是一开放性论坛,它开发并发布这些免费规范,使用AIS规范的API,可以减少应用程序的复杂性、缩短应用程序的开发时间,这些规范的主要目的就是为了提高中间组件可移植性和应用程序的高可用性)
SAF AIS(是一个开放性工程,在不断更新,而openais是基于SAF标准的集群框架的应用程序接口规范,openais提供一种集群模式(集群框架、集群成员管理、通信方式、集群监测等),能为集群软件工具提供满足AIS标准的集群接口,但没有集群资源管理的功能)
pacemaker(比crm特性更丰富,支持全CLI配置,也支持GUI管理工具)
Hawk(Web GUI,图形界面资源管理工具,SLES(suse linux enterprise server)也使用corosync+pacemaker)
LCMC(linux cluster management console,GUI)
Conga(RHCS,基于web的管理界面,luci是控制端,ricci是被控制端要安装在每一个node上,配置ricci成为luci的管理对象,并配置好yum源,后续的pacemaker、corosync都会自动安装)
keepalived(vrrp,virtual route redundency protocol,仅支持2个node,在双主模型下keepalived比较理想,若多于2个node只能使用heartbeat、corosync这套组件)
注:HA集群中节点数最好大于两个(大于两个,为奇数个,就不使用ping node或仲裁磁盘)
二、操作(环境redhat5,2.6.18,32bit,两个node,同上篇):
准备软件包(http://clusterlabs.org/rpm/):
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(pacemaker默认依赖heartbeat,安装上不启用即可)
heartbeat-libs-3.0.3-2.3.el5.i386.rpm
pacemaker-1.0.12-1.el5.centos.i386.rpm
pacemaker-libs-1.0.12-1.el5.centos.i386.rpm
resource-agents-1.0.3-2.6.el5.i386.rpm
libesmtp-1.0.4-5.el5.i386.rpm(需单独下载https://dl.fedoraproject.org/pub/epel/5/i386/repoview/letter_l.group.html)
其它软件包介绍:
ldirectord-1.0.3-2.6.el5.i386.rpm(专用于ipvs,作为ipvs的补充,可帮助生成ipvs规则及后端RS的health_check,灵活地应用在高可用集群中,与corosync和heartbeat都能结合工作,用于heartbeat的包为heartbeat-ldirectord-2.1.4-11.el5.i386.rpm)
openais-debuginfo-1.1.3-1.6.el5.i386.rpm(不做开发可不安装,以插件方式工作在corosync)
openaislib-1.1.3-1.6.el5.i386.rpm
准备环境(参照集群第二篇heartbeatV2文章)有:时间同步、主机名、ssh双机互信、本地yum源
注:redhat5系统使用corosync1.2.7(1系列的),redhat6使用2系列的
node1-side:
将以上rpm包放至/root目录下
#cd
#scp ./* node2:/root
#for I in {1..2};do ssh node$I ‘yum -y --nogpgcheck localinstall /root/*.rpm’;done
#for I in {1..2};do ssh node$I ‘yum -y install httpd’;done
#rpm -ql corosync
/etc/corosync/corosync.conf.sample
/etc/init.d/corosync
/usr/sbin/corosync
/usr/sbin/corosync-keygen(生成密钥,它是从/dev/random(随机数来自熵池,磁盘中断的时间间隔和击键的时间间隔)下获取随机数,如果不够会等待,提示我们狂敲键盘让其自动生成)
注:heartbeat中的authkeys(密钥手动生成,且明文传输,要改权限为600)
#cd /etc/corosync
#cp corosync.conf.example corosync.conf
#man corosync.conf
totem { }(图腾,每个node同其它node通信通过totem定义)
logging { }
event { }
#vim /etc/corosync/corosync.conf
totem {
version: 2(配置文件的版本号,唯一合法的版本号为2,不是说我们改动过就是第一版之类的,是被corosync所支持的版本,各版本间语法不同)
secauth: on(安全认证,为安全要开启,用HMAC/SHA1加密,会消耗系统资源)
threads: 2(开启多个线程执行加密或多播,若secauth为off这项就没用,若为on此项才有意义)
interface {
ringnumber: 0(每个接口所定义的环,若仅有一个node不定义此项,若有多个node,每个node有两块网卡(冗余),定义多个node上的eth0是一个环,eth1是一环,若有多个node没定义此项,消息在网络中会形成环路一起传递下去)
bindnetaddr: 192.168.1.0(绑定的网络地址,若一个node上有两块网卡,在哪个网络上传递信息,在哪个网络进行多播,这项定义的是网络,不能写IP,是IP所在的网络地址)
mcastaddr: 226.94.1.1(D类IP,仅能使用224.0.2.0~238.255.255.255)
mcastport: 5405
}
}
logging {
fileline: off(定义不同的日志间打印分隔符)
to_stderr: no(发到标准错误输出,也就是屏幕)
to_logfile: yes(使用指定文件记录日志)
to_syslog: no(用系统自带的syslog记录/var/log/messages,只开一项即可)
logfile: /var/log/cluster/corosync.log(此目录不存在,记得在开启服务前要创建此目录)
debug: off(出错时打开此项调试)
timestamp: on(记录时间戳,能定位错误,若开启此项每记录一次日志都要获取一次当前系统时间(一次系统调用要返回用户空间,内核通过硬件获取时间),多记录一个条目会使文件体积变大)
logger_subsys {(子系统信息)
subsys: AMF
debug: off
}
}
amf {
mode: disabled(没安装openais,未启用)
}
service {(添加此段,启动corosync时,将pacemaker也启动)
ver: 0
name: pacemaker
#use_mgmtd: yes
}
aisexec {(运行openais所指定用户和组,由于未安装openais,此段忽略)
user: root
group: root
}
#corosync-keygen(会生成authkey文件,权限400,非文本文件)
#file /etc/corosync/authkey
/etc/corosync/authkey: data
#ll !$
-r-------- 1 root root 128 Jul 10 02:28/etc/corosync/authkey
#scp -p authkey corosync.conf node2:/etc/corosync/
#for I in {1..2};do ssh node$I ‘mkdir /var/log/cluster/’;done
#service corosync start
#ssh node2 ‘service corosync start’
#grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log(查看corosync引擎是否正常启动)
#grep TOTEM /var/log/cluster/corosync.log(查看初始化成员节点通知是否正常发出)
#grep ERROR: /var/log/cluster/corosync.log(查看启动过程是否有错误,此实验没有STONITH设备,会报错,执行#crm configure property stonith-enabled=false即可)
#grep pcmk_startup /var/log/cluster/corosync.log(查看pacemaker是否启动)
#crm_mon
注:没有配置ping node很有可能集群分裂
#crm(取代了heartbeatV2中的crm_sh,比crm_sh强大的多,进入后help,可管理resource、node、ra,可查看node和resource的status,支持cd命令,支持命令补全等)
注:crm命令在任一node运行都行,它会自动连接DC从而使配置保存
crm(live)#ra
crm(live)ra# list lsb
crm(live)ra# list ocf
crm(live)ra# classes
heartbeat
lsb
ocf / heartbeat pacemaker
stonith
crm(live)ra# meta [ocf:[heartbeat:]IPaddr
crm(live)ra# meta ocf:heartbeat:Filesystem(或meta Filesystem)
crm(live)ra# providers IPaddr
heartbeat
crm(live)ra# providers Filesystem
heartbeat
crm(live)ra# providers Dummy
heartbeat pacemaker
crm有两种模式:
交互模式(下配置,执行commit命令后才生效);
批处理模式(下配置立即生效,例如#crm configure property stonith-enabled=false)
crm(live)# configure
crm(live)configure# property stonith-enabled=false(交互模式)
crm(live)configure# property no-quorum-policy=ignore
crm(live)configure# verify(检查配置文件是否正确)
crm(live)configure# commit(在交互模式下,要提交)
crm(live)configure# show [xml](display CIBobjects)
node node1.magedu.com
node node2.magedu.com
property$id="cib-bootstrap-options" \
dc-version="1.0.12-unknown"\
cluster-infrastructure="openais"\
expected-quorum-votes="2"\
stonith-enabled="false"
no-quorum-policy="ignore"
crm(live)configure# show xml(打开/var/lib/heartbeat/crm/cib.xml文件)
crm(live)# configure
crm(live)configure# primitive webipocf:heartbeat:IPaddr params ip=192.168.41.222 nic=eth0 cidr_netmask=24 iflabel=eth0:0(打开另一终端,crm(live)configure# help primitive,crm(live)ra# meta ocf:heartbeat:IPaddr,参考语法配置正确)
crm(live)configure# primitive webstore ocf:heartbeat:Filesystem params device=192.168.41.128:/web/htdocs directory=/var/www/html fstype=nfs op start timeout=60 op stop timeout=60(这里的start timeout和stop timeout必须要定义,因为默认值是20秒,小于建议的60秒,op后指定的这些选项只能比建议的长)
crm(live)configure# primitive httpd lsb:httpd
crm(live)configure# group webservice webip webstore httpd
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
crm(live)configure# edit(可直接编辑配置,是在vim下配置)
crm(live)configure# cd
crm(live)#exit
[root@node1 ~]#
[root@node1 ~]# crm
crm(live)# node
crm(live)node# help
crm(live)node# show
crm(live)node# list
crm(live)node# standby(或#crm node standby)
crm(live)node# online(或#crm node online)
crm(live)node# clearstate node1.magedu.com
crm(live)# resource
crm(live)resource# help
crm(live)resource# stop webservice
crm(live)resource# start webservice
crm(live)resource# restart webservice
crm(live)resource# list
Resource Group: webservice
webip (ocf::heartbeat:IPaddr)Started
webstore (ocf::heartbeat:Filesystem)Started
httpd (lsb:httpd) Started
crm(live)resource# status
crm(live)resource# cleanup webservice
Cleaning up webip on node1.magedu.com
Cleaning up webip on node2.magedu.com
Cleaning up webstore on node1.magedu.com
Cleaning up webstore on node2.magedu.com
Cleaning up httpd on node1.magedu.com
Cleaning up httpd on node2.magedu.com
Waiting for 7 replies from the CRMd.......
[root@node1 ~]# crm_mon(在以上node和resource上操作时,观察监控的变化)
以上是通过组将各资源绑在一起,以下是通过constraint将资源绑在一起
crm(live)# resource
crm(live)resource# stop webservice
crm(live)resource# cd
crm(live)# configure
crm(live)configure# delete webservice
crm(live)configure# show
crm(live)configure# commit
[root@node1 ~]# crm_mon(将组删除后可看到,三个资源是分散地运行在不同的node上)
============
Last updated: Thu Nov 5 23:54:54 2015
Stack: openais
Current DC: node2.magedu.com - partitionwith quorum
Version: 1.0.12-unknown
2 Nodes configured, 2 expected votes
3 Resources configured.
============
Online: [ node1.magedu.com node2.magedu.com]
httpd (lsb:httpd): Started node1.magedu.com
webstore (ocf::heartbeat:Filesystem): Startednode2.magedu.com
webip (ocf::heartbeat:IPaddr): Started node1.magedu.com
crm(live)configure# help colocation
crm(live)configure# colocation httpd_with_webstore inf: httpd webstore
crm(live)configure# colocation webstore_with_webip inf: webstore webip
crm(live)configure# order webstore_before_httpd mandatory: httpd webstore
crm(live)configure# order webip_before_httpd mandatory: httpd webip
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
crm(live)configure# exit
bye
[root@node1 ~]# crm node standby(将当前node备用,并在另一终端打开#crm_mon)
……
httpd (lsb:httpd): Startednode2.magedu.com
webstore (ocf::heartbeat:Filesystem): Started node2.magedu.com
webip (ocf::heartbeat:IPaddr): Started node2.magedu.com
[root@node1 ~]# crm node online
……
httpd (lsb:httpd): Startednode1.magedu.com
webstore (ocf::heartbeat:Filesystem): Started node1.magedu.com
webip (ocf::heartbeat:IPaddr): Started node1.magedu.com
crm(live)configure# location webip_on_node1webip rule 100: #uname eq node1.magedu.com(位置约束)
crm(live)configure# rsc_defaults resource-stickiness=200(资源粘性)
注:位置约束和资源粘性结合起来决定资源到底在哪个node运行,这两项都设置后,资源粘性(定义资源乐意运行在当前node),位置约束(倾向性,定义资源乐意运行在哪个node),若在node1上#crm node standby,资源转移至node2,而当node1重新online后资源不会切换(若当前node1故障不能工作,资源同样转移到node2)(如果按例子中设置仅定义位置约束,则在node1上standby后,会切至node2,当node1重新online后,资源又切至node1)
crm(live)configure# exit
bye
[root@node1 ~]# crm_mon(当前运行在node1)
……
Online: [ node1.magedu.com node2.magedu.com]
httpd (lsb:httpd): Startednode1.magedu.com
webstore (ocf::heartbeat:Filesystem): Started node1.magedu.com
webip (ocf::heartbeat:IPaddr): Started node1.magedu.com
[root@node1 ~]# service corosync stop(将node1服务停止)
Signaling Corosync Cluster Engine(corosync) to terminate: [ OK ]
Waiting for corosync services tounload:.. [ OK ]
[root@node2 ~]# crm_mon(资源运行在node2上)
……
Online: [ node2.magedu.com ]
OFFLINE: [ node1.magedu.com ]
httpd (lsb:httpd): Startednode2.magedu.com
webstore (ocf::heartbeat:Filesystem): Started node2.magedu.com
webip (ocf::heartbeat:IPaddr): Started node2.magedu.com