ha(high availablity)
一、相关概念
1、
director(Active,Passive两个node,或primary,standby),一个主node一个备node,两个node上的VIP相同MAC不同,一旦A-node故障,资源转移至P-node上时,前面的router要知道当前活动node的VIP对应的MAC地址,如何让前面的router知道?因为通告仅在主机刚接入网络时才通告,这时使用强行通告
HA的功能就是依靠资源在各节点间转移来完成
HA-resource(IP、SERVICE、STONITH(硬件设备))
在高可用集群中,对外提供的服务绝不能开机自启动,必须要由CRM管理(重要!!!)
failover(故障转移,如A节点故障资源转移到P节点)
failback(故障恢复,如A-node恢复正常,资源又转移回来,假设A的资源粘性>B)
资源粘性(资源和节点间的关系,资源更倾向于运行在哪个node,如A-node恢复正常要不要转移回来,取决于资源粘性)
HA集群事务(传递心跳信息、资源粘性比较的管理、事务协调等集群事务相关信息)
message layer(node间专门用来传递集群事务信息的通道,通过专用的信息通道传递,要求效率要高udp,这个层次称为message layer,每个node都监听在某个udp的port上,它仅用来传递信息,并不负责后期信息的计算和比较)
CRM(cluster resource manager,利用message layer,统计、收集集群上每个node资源的状态,计算出资源应该运行在哪个node上,再采取相应动作,作出高可用决策,CRM这个程序在每个node上都运行,计算是由推选的指定的协调员DC完成的,CRM不但监控节点,还监控节点上运行的资源的状态)
DC(designated coordinator,或Designated Controller,包括PE和TE,PE(policy engine,负责计算并得出结果),TE(transaction engine,TE用PE计算得出的结果,指挥着LRM将挂掉的node的服务down掉,重启该node服务,若仍有问题再转移资源开启另一node的服务start),例如A-node上的服务不工作时,试重启该node的服务,而不是直接转移node,转移node消耗的资源要比重启服务大的多)
LRM(local resource manager,LRM接受TE指挥,采取动作,负责真正执行,启用服务时(ifconfig、ip addr、脚本))
RA(resource agent,可理解为脚本,独特格式的脚本,LSB风格(linux standard base,负责集群资源管理的脚本),最起码具备start、stop、restart、status功能)
RG(resource group,将某服务涉及到的资源归为一类,同进同退,例如LVS服务中ipvs和VIP归为一组)
注:PE、TE、LRM均是CRM的组件,CRM依赖于message layer将那些本身不具有ha能力的服务(httpd,ip)也能工作在ha的场景中,提供ha功能,CRM是个通用平台,向RA提供高可用能力,如果没有CRM、RA能否实现ha?开发一软件实现CRM和RA的功能(这称为ha-aware application,ha-aware的软件)
资源约束(resource constraint,资源和资源之间的关系,倾向性,包括三种:location constraint、collation constraint、order constraint):
location constraint(位置约束,资源和节点的倾向性,资源对节点的依赖程度,作为资源粘性的补充,在同一主机上可能有多个资源,这些资源作为一个单位同进同退,某服务能否运行在这个node上取决于所有资源倾向性的分数之和,用分数score衡量,正值表示倾向于此节点,负值表示倾向于逃离此节点,例如,定义资源在A-node上为10,在P-node上定义为-1,则当A挂掉时才在P上运行,当A恢复服务则又在A上运行)
collation constraint(排列约束,定义资源和资源能否运行在同一node上,资源间的互斥性,资源和资源是倾向在一起还是分开,用score衡量,正值表示可以在一起,负值表示不能在一起)
order constraint(顺序约束,定义资源和资源间启动和关闭的次序,资源采取动作的次序,资源和资源间可能有依赖关系
资源隔离:
节点级别(STONITH,shoot the other node in the head)
资源级别(如FC SAN SWITCH,光交换机,可实现在存储级别拒绝某节点的访问)
2、
共享存储(DAS、NAS、SAN):
DAS(direct attachment storage,块级别传输数据,效率高,直接连接到主机的主板总线上,控制器controller,适配器adapter)
NAS(network attachment storage,文件服务器,文件级别传输数据,如NFS)
SAN(storage area network,延长了DAS的存储线缆,并能将这一node的磁盘空间共享给其它node使用,有FC SAN(借助光通道fiber channel),IP SAN(借助internet protocol,iscsi协议,i表示internet))
SCSI(small computer system interface,内置了芯片,代替CPU加载硬盘内容到内存中,使得CPU解脱出来可运行其它程序,类似DMA机制direct memory access,SCSI报文只能在SCSI总线上传输,若借助光网络可传输更远距离)
注:在server-side将硬盘分区格式化通过SCSI报文输出,client-side在自己本地通过scsi驱动看到的是硬盘设备(scsi设备),可分区格式化装OS,而且是块级别传输
注:集群FS,某一方持有锁通过集群事务告知对方,CFS不能阻止集群分裂,集群分裂的结果是共享存储崩溃,一旦发现脑裂,就STONITH或FENCE
iscsi-server共享存储挂了,如何做?做高可用(它本身就是共享存储,高可用也要用到共享存储,解决脑裂问题;若server的电源线挂了?使用两根电源线(对于高可用集群来说,其它node发现该节点挂了,要STONITH该node,要暴头两根电源线);存储设备的多路径(multipath,client和iscsi-server间的线缆高可用,两根线缆)
注:mysql的双主模型(借助共享存储,集群FS),如何知道对方挂了?两个节点就要用到仲裁机制判断对方是否在线:一、借助于一网关,自己若能ping通网关,却ping不通对方,就认为对方挂了;二、借助于一共享磁盘,每隔一段时间往磁盘里写数据,若能在磁盘上发现有对方写的数据认为对方没挂;三、watchdog,linux内核中的功能,用于协调两个进程(watchdog同共享磁盘一样,可理解为是个设备,每一个进程启动后,通过unix的管道不停地向watchdog中写数据,如每隔5秒发一次数据,进程若发现不再往里写了会试图重启这个进程),watchdog经过特殊改造可实现仲裁功能
3、
多节点集群:
高可用集群中若有奇数个node(至少三个),将不再采用第三方组件(仲裁机制)来判定其它node是否在线,采用quorum法定票数决策
例如有三个node组成高可用集群,分别为abc,这三个node运行在同一组播内,某一node会向其它node传递事务信息,DC为当前集群作决策,假设每个node的quorum都是1,c节点出故障,ab大于quorum,则c认为它不在集群中,若DC恰好在c上,则在ab上通过CRM再推选出一个DC用来决策集群上的事务(收集信息、状态计算、集群事务的转换),将c上运行的资源收集起来,让当前某一活动node继续运行,提供正常服务
当某一node认为它已不是集群,要采取什么动作?集群的全局资源策略(集群中不具备法定票数的资源管理策略without_quorum_policy):
freeze(不再接收新的请求,当前连进的继续提供服务,不具备法定票数时用此项)
stop(最理想状况)
ignore(仅有两个node时采用此项)
注:高可用集群中一定要用隔离设备,即使是IP也会资源争用,只不过它没有共享存储危害大
若高可用集群中有四个node,abcd法定票数依次为4212,总票数只要是奇数即可,例如ab联系不上cd了,根据quorum将cd隔离
左对称(若d故障,资源可转至a或b或c,若定义了c对d上的资源为负无穷,则只能转至a或b了)
右对称(若d故障,其它node中仅有一个或两个允许资源转移,剩下的对d上的资源都定义为负无穷)
注:RHCS(redhat cluster suite)中可自定义资源转移组(叫故障转移域failover domain),若某一node出故障时,仅允许转移的范围,N-m表示N个node运行m个服务,N-n表示N个node运行n个服务(与node数相同的服务);例如有三个服务(smtp,httpd,ipvs)各运行在abc上,空闲d作为备用node,当a或b或c出故障时,均能转移到d
4、
message layer、CRM、RA有多少种实现方式?
heartbeat V1(最古老的version,既提供messagelayer,又有CRM功能(叫haresources))
heartbeat V2(走向成熟的version,受欢迎的version,既提供messagelayer又有CRM功能,对haresources作了改进,提供了两个CRM(haresouces和crm),使用crm时它会监听在某个接口上,接受外在的工具进行管理(如通过图形界面管理集群资源)
heartbeat V3(分裂成几个独立的小项目(heartbeat、pacemaker、cluster-glu),CRM是pacemaker(心脏起搏器),保留核心messagelayer)
corosync(目前流行,redhat6上使用,它本身是纯粹的messagelayer,比heartbeat更优,但不带有pacemaker组件,通常使用corysync+pacemaker(角色相当于heartbeat V3))
cman(cluster manager,redhat5中提供高可用引擎,不是纯粹的message layer,很多功能在内核中实现,到redhat6改进的简洁了例如可在用户空间实现的corosync)
keepalived(与上面讲到的理论不同,在配置上有它独到之处,在VIP管理上基于VRRP(virtual router redundant protocol)实现,可非常简单的配置双主模型(corosync也可实现双主,但配置麻烦,要对资源做很多管理),keepalived本身就是为LVS的director高可用专门开发的组件,配置便捷,但在功能的通用性上不如以上几种)
CRM:
haresources(heartbeatV1,heartbeatV2)、crm(heartbeatV2)
pacemaker(应用在两种message layer上,分别是heartbeatV3和corosync)
rgmanager(在cman之上专门提供的CRM)
resource(资源有很多类型,有些资源必须要运行在多个node上,如STONITH设备,每个node都要运行STONITH,在某一node出故障时将它暴头):
primitive(主资源,在某一时刻只能运行在某一节点上)
clone(克隆类资源,如STONITH,克隆好几份在集群的每个node都运行;如集群文件系统CFS,分布式锁管理器dlm,distributed lock manager,CFS自带的工具(程序),某一node持有的锁,其它node都能看到,这个程序要配置为高可用集群中的资源,这个资源要运行在高可用集群中的每个node上)
group(把某些资源归类到一起同进同退,资源容器,通常组中仅有primitive类的资源)
master/slave(特殊的clone类资源,只能运行两份,在有主从关系的两个node上运行,如drbd,distributed replicate block device分布式复制块设备,2.6.33后被drbd被整合在内核中,之前的内核只需安装相关模块即可)
HA-service与resource:服务上会有多个资源;从属于一个服务的所有资源必须同时运行在一个node上(资源定义成组,同进同退);如果资源没有定义为组,这些资源是平衡地运行在每个node上(默认balance法则),例如两个node两个资源,这两个资源分别运行在这两个node上,例如两个node三个资源,这三个资源轮流按次序分散地运行在这两个node上
RA(不仅仅是脚本,start|stop|restart|status,平时通过status监控,若某一node故障,要调用它在另一node执行start等,它实现了让CRM能够将某个定义成了高可用资源的资源被管理,接受LRM传递过来的控制指令完成对应的资源管理)
RA classes:
legacy(heartbeatV1的RA)
LSB(redhat中shell风格的脚本)
OCF(open clusterframework,不同的vender提供不同的version,如pacemaker的RA,linbit(drbd),只要遵循OCF规范都能拿来用
STONITH(专门用来管理硬件STONITH设备)
STONITH设备:
PDU(power distributionunits,电源分布单元,电交换机,该设备接上网线,可接收由其它node发来的控制指令,从而断掉某个node的电源,不同的厂商认证方式会不同,STONITH机制也会不同,提供管理STONITH设备的管理软件)
UPS(uninterruptible power supplies不间断电源)
blade power control devices(刀片服务器,高度模块化,内置电源控制器,可接受指令)
lights-out devices(轻量级设备,专业级服务器上自带的硬件接口(小的管理模块,可接受远程管理),如IBM的RSA,HP的ilo,DELL的DRAC)
testing devices(如#ssh 172.168.100.1 ‘reboot’)
meatware(肉件,手动fence)
注:stonithd(监控当前主机运行的stonith资源,可让多个node间互相通信);stonith plug-in(提供插件管理软件,接受选项及不同的参数);高可用集群默认的管理策略(没有stonith设备是不允许启动的);只要有共享存储就一定要有STONITH设备
在高可用集群中,对外提供的服务绝不能开机自启动,必须要由CRM管理
提供message layer功能的软件,要开机自启动,并监听在udp/694port上,用来传递各node的集群事务信息(要加密,做hash计算,否则任何一台主机配置并运行了与当前node上相同的服务,则会充当集群上node)
若高可用集群中仅两个node(单播、组播、广播都可),若多个node(组播、广播);node间通信(串行线互联,以太网互联),建议使用单独的网卡通信
若高可用集群上有两个node,当某一主节点在运行服务时,依赖于某共享文件系统,这个共享文件系统默认只运行在主节点上,当主挂了,备才挂载共享文件系统(使用heartbeat提供的RA,再提供参数就能实现自动转移时挂载)
注:FS崩溃(DAS和SAN都会,NAS不会)
注:组播(多播,mcast,使用D类IP,224.0.0.0~239.255.255.255,流向组地址中的数据,在组播组内的主机都能接收到);
224.0.0.0~224.0.0.255(预留地址, 224.0.0.0保留不做分配,其它地址供路由协议使用);
224.0.1.0~224.0.1.255(是公用组播地址,用于Internet);
224.0.2.0~238.255.255.255(重要,用户可用的组播地址(临时组地址),全网范围内有效);
239.0.0.0~239.255.255.255(本地管理组播地址,仅在特定的本地范围内有效)
二、操作:
1、
redhat5.8 32bit环境使用heartbeat V2
heartbeat软件或高可用服务是靠节点名称识别各node(NODE_NAME<-->IP),每个node都要能解析自己及其它所有node,建议使用本地hosts文件,而非DNS(不能将高可用寄托在DNS上),整个高可用集群各node的/etc/hosts文件一样,节点名称要与命令#uname -n结果保持一致(或#hostname结果);
配置SSH双机互信(高可用功能使用时,要能够在一个正常的node开启或关闭其它node的主机或其上的服务;
集群各node时间要同步(彼此心跳信息要同步,若时间不同步可能会误杀)
以上四点尤其注意(主机名、/etc/hosts文件、ssh双机互信、时间同步)
关闭iptables(若开启要放行694/udp)和selinux
node1-side:
#vim /etc/sysconfig/network(更改主机名,或使用#sed -i ‘s@\(HOSTNAME=\).*@\1node1.magedu.com@g’ /etc/sysconfig/network)
HOSTNAME=node1.magedu.com
#hostname node1.magedu.com
#uname -n
node1.magedu.com
#vim /etc/hosts(添加各node主机名与IP对应关系)
192.168.1.59 node1.magedu.com node1
192.168.1.60 node2.magedu.com node2
#scp /etc/hosts root@192.168.1.60:/etc/
#ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ‘’
#ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2
#ssh node2 ‘ifconfig’
#vim /etc/ntp.conf(此机作为ntp-sever,设置仅允许node2到这台机子上同步时间,添加更改如下信息)
restrict 192.168.1.60
#server 0.rhel.pool.ntp.org(注销掉其它server,本机在局域网内使用,不联互联网,仅与自己同步,本机的时间就是ntp-server的时间)
……
server 127.127.1.0 # local clock(开启此项,仅与自己本机同步)
fudge 127.127.1.0 stratum 10
#service ntpd start(123/udp,服务刚启动需要等3-5分钟才开始一次同步,如果这时立即在client使用ntpdate强制同步时间,会报错例如no server suitable for synchronization found,过一会再同步即可)
#chkconfig --level 35 ntpd on
node2-side:
#sed -i ‘s@\(HOSTNAME=\).*@\1node2.magedu.com@g’ /etc/sysconfig/network
#hostname node2.magedu.com
#uname -n
node2.magedu.com
#ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ‘’
#ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1
#ssh node1 ‘ifconfig’
#vim /etc/ntp.conf(添加一行server NTP_SERVER,指定时间服务器地址即可)
server 192.168.1.59
#ntpdate node1(运行此命令不能开启本地ntpd服务,此命令是以粗暴方式马上就调整好时间,如果时间相差太多,中间的时间可能会是穿越的(空白的);最好是将本地服务开启,利用ntpd服务自身来同步会比较柔和,服务会根据时钟慢慢调整,例如本地比服务器时间慢3秒,服务会将本机以每秒加快点的速度追赶上服务器,中间不会有跳跃的穿越的时间,为使该实验快速进行,本例使用ntpdate方式同步)
#crontab -e
5/* * * * * /sbin/ntpdate node1 &> /dev/null(crontabl的环境变量只有与系统中PATH不同,避免出错,这里写绝对路径;定时任务每执行一次就要向管理员发邮件告知,避免一直发邮件使用&> /dev/null;保存位置/var/spool/cron/root)
以下几个程序的下载位置(http://fedoraproject.org/wiki/EPEL)(注意版本此例是epel5中i386)
heartbeat(主程序)
heartbeat-devel
heartbeat-gui
heartbeat-ldirectord(专为ipvs高可用提供规则自动生成及后端RS健康状况检查的组件)
heartbeat-pils(装载库提供的通用插件和接口)
heartbeat-stonith
准备好本地光盘的yum源
node1-side:
#for I in {1..2}; do ssh node$I ‘yum -y --nogpgcheck localinstall perl-MailTools-1.77-1.el5.noarch.rpm’ ; done
#for I in {1..2}; do ssh node$I ‘yum -y --nogpgcheck localinstall heartbeat-2.1.4-11.el5.i386.rpmheartbeat-gui-2.1.4-11.el5.i386.rpm heartbeat-pils-2.1.4-11.el5.i386.rpm heartbeat-stonith-2.1.4-11.el5.i386.rpm libnet-1.1.6-7.el5.i386.rpm’ ; done
#rpm -ql heartbeat
/etc/ha.d/rc.d/*(类似系统中/etc/rc.d/init.d/*)
/etc/ha.d/resource.d/*(资源代理脚本,例如IPaddr专门用于配置VIP到某活动node上,而且可以监控IP地址是否生效,另系统中/etc/rc.d/init.d/*下的LSB风格的脚本都可以用)
heartbeat配置中有三个重要文件:
authkeys(密钥文件,权限600,实现加密认证,避免其它node冒充成为我们定义的集群中的node);
ha.cf(heartbeat服务自身的配置文件,核心配置文件,配置的有高可用集群中有几个node,各node名称,多长时间检测一次心跳,集群中事务信息传递要不要加密,若两个node的话是否加ping node(或仲裁磁盘)等等配置);
haresouces(heartbeatV2提供两种CRM,一个是haresources,配置文件就是haresources,一个是crm,若要使用crm管理资源,在ha.cf文件末加crm respawn或者crm on)
#cp /usr/share/doc/heartbeat-2.1.4/{authkeys,ha.cf,haresources} /etc/ha.d/
#cd /etc/ha.d
#chmod 600 authkeys
(1)举例(heartbeatV2,haresources的使用):
#vim /etc/ha.d/authkeys
auth 1
1 md5 f642725b9a037194c(md5后跟随机数,此随机数不要手动写,自动生成,越随机越好,找一段粘贴即可,不要太长,否则影响性能,生成随机数方法一:#dd if=/dev/random count=1 bs=512 | md5sum,方法二:#openssl rand -base64 128)
#vim /etc/ha.d/ha.cf(格式:指令 值,顶头的表示可启用的选项)
#debugfile /var/log/ha-debug(出错时打开此功能,可输出更详细的信息,便于调试)
#logfile /var/log/ha-log(用指定文件记录日志信息)
logfacility local0(用系统syslog功能记录日志,保存在/var/log/messages)
keepalive 1(多久发一次心跳,不写单位默认是秒,若用ms毫秒则必须要写)
#deadtime 30(多长时间判定对方dead,时间短的话会误杀)
#warntime 10(未收到心跳的警告时长)
#initdead 120(等待第二个node启动的时长)
udpport 694(服务监听的端口)
#baud 19200(heartbeat传递心跳支持两种,以太网和串行线,此句指串形线的速率(波特率))
bcast eth0(广播方式传递事务信息)
#mcast eth0 225.0.0.1 694 1 0(此句重要,多播,或组播,生产环境下使用,225.0.0.1表示mcast group,694端口,1表示ttl,0表示loop不循环)
#ucast eth0 192.168.1.60(单播,设备eth0后跟的是对方的地址,此句仅适用于两个node的情形)
auto_failback on(自动故障恢复)
node node1.magedu.com
node node2.magedu.com(这两句重要,告诉集群有几个node,有哪些node,一定要与node名称保持一致)
#ping 10.10.10.254(ping node)
#ping_group group1 10.10.10.254 10.10.10.253(还可将多个地址定义为一个组,只要能ping通组中任一主机即可,防止上面那个网关出问题后,两个node都ping不通它)
#respawn userid /path/name/to/run
#respawn hacluster /usr/lib/heartbeat/ipfail(这两句定义,当某一node故障时是重启服务,而不是down掉该node)
#vim /etc/ha.d/haresources(每一行定义一个集群服务,将服务的所有资源归为一组)
node1.magedu.com IPaddr::192.168.1.222/16/eth0(在文末添加此行,注意192.168.1.222是VIP地址)
格式:active_node_name resource1 resource2
例:node1 10.0.0.170 Filesystem::/dev/sda1::/data1::ext2(资源和资源用空格隔开,资源的参数用双冒号隔开,node1是默认用作主节点的名称,Filesystem是RA(/etc/ha.d/resource.d/Filesystem,可自动配置资源,可接受参数))
#scp -p /etc/ha.d/{authkeys,ha.cf,haresources} node2:/etc/ha.d/
注:先找/etc/ha.d/resource.d/*再找/etc/rc.d/init.d/*
/usr/lib/heartbeat/findif(配置VIP时,若当前主机有两个网卡(其上配置的地址不在同一网段),这个脚本会自动匹配与VIP在同一网段的那个网卡,并在其别名上配VIP地址,/usr/lib/heartbeat/*这个目录下的脚本文件,是与heartbeat管理相关的脚本文件)
/etc/ha.d/resource.d/{IPaddr,IPaddr2}(IPaddr是用ifconfig命令配置,IPaddr2是用ip addr命令配置,建议使用IPaddr2功能强大)
#echo “<h1>node1.magedu.com</h1>” > /var/www/html/index.html(两个node都要准备网页文件)
#service httpd start
#elinks -dump http://192.168.1.59(先测试下是否能在本地打开,node2也要测试)
#service httpd stop
#chkconfig --level 2345 httpd off(重要,高可用服务一定不能开机自启动,要接受CRM管理)
#chkconfig --list httpd
#chkconfig --list heartbeat(确保heartbeat要开机自启动)
#service heartbeat start
#ssh node2 ‘service heartbeat start’(必须要远程启动另一node)
#tail /var/log/messages
用windows物理机浏览器测试
#/usr/lib/heartbeat/hb_standby(这个脚本可实现手动将当前node自动转移,此脚本是将当前node转为备node,那另一node自然就成主node了)
补充(配置高可用服务自动挂载共享目录):
node3-side(单独拿出一台主机配置nfs共享目录):
#mkdir -pv /web/htdocs
#echo “<h1>nfs.magedu.com</h1>” > /web/htdocs/index.html
#vim /etc/exports
/web/htdocs 192.168.1.0/24(ro)
#service nfs start
#showmount -e 192.168.1.127
Export list for 192.168.1.127:
/web/htdocs 192.168.1.0/24
node1-side:
#service heartbeat stop
#ssh node2 ‘service heartbeat stop’
#mount -t nfs 192.168.1.127:/web/htdocs /mnt(测试能否正常挂载,记得要卸载,node2也测试下)
#ls /mnt
index.html
#umount /mnt
#vim /etc/ha.d/haresources
node1.magedu.com IPaddr::192.168.1.222/24/eth0 Filesystem::192.168.1.127/web/htdocs::/var/www/html::nfs httpd
#scp /etc/ha.d/haresources node2:/etc/ha.d/
#service heartbeat start
#ssh node2 ‘service heartbeat start’
#tail /var/log/messages
#/usr/lib/heartbeat/hb_standby
(2)举例(heartbeatV2,crm的使用,通过GUI来管理资源):
crmd运行在每个node上,并监听在某个socket上(为管理员管理资源提供接口API,node间依赖message layer可相互通信
注:开发某一程序借助提供的API就可方便地管理资源,管理功能及扩展性得到极大提升(GUI、CLI均可)
在上例基础上操作:
node1-side:
#service heartbeat stop
#ssh node2 ‘service heartbeat stop’(先停止集群服务再配置)
#vim /etc/ha.d/ha.cf
#bcast eth0
mcast eth0 225.0.0.1 694 1 0
node node1.magedu.com
node node2.magedu.com
crm respawn(在最后一行添加此句,或写成crm on,表示使用crm来管理集群资源)
注:crm与haresources并不兼容,crm不会去读haresources的配置文件,如果配置了crm还要使用haresources,借助于/usr/lib/heartbeat/haresource2cib.py这个脚本,这个python脚本会将/etc/ha.d/haresources文件转换为cib文件,并保存在/var/lib/heartbeat/crm/cib.xml,再启动集群服务(cib,clusterinformation base,crm配置高可用集群的机制,crm将有关的所有配置都保存到了cib中,格式为xml)
注:/usr/lib/heartbeat/send_arp(这个脚本用于,某一node故障,node切换后,当前node的MAC与IP告知到路由器或交换机或其它设备上);/usr/lib/heartbeat/{tengine,pengine,stonithd,quorumd,crmd,ccm,lrmd},其中ccm(clusterconfiguration manager),lrmd(LRM)
#/usr/lib/heartbeat/haresource2cib.py(这个脚本执行时会调用ha_propagate(当配置了集群中任意一个node的cib文件后,这个脚本会通过ssh双机互信统统都通知到其它node而不用scp))
#scp /etc/ha.d/ha.cf node2:/etc/ha.d/
#ssh node2 ‘/usr/lib/heartbeat/haresource2cib.py’
#/usr/lib/heartbeat/ha_propagate(以后若改动了authkeys,ha.cf则可直接运行这个脚本会自动同步到其它node)
#service heartbeat start
#ssh node2 ‘service heartbeat start’
#tail -f /var/log/messages
#netstat -tnlp(5560/tcp,mgmtd)
#cibadmin --help(专门用于解析cib.xml)
#crmadmin --help(此命令用于管理node,如-K NODE_NAME关闭某node的crmd,-S NODE_NAME查看某node的状态,-D查看当前DC在哪个node,-N查看所有node的名字)
#crm_verify --help
#crm_mon(monitor,每隔15秒刷新一次,用于查看状态)
#crm_resource --help(管理资源)
#crm_standby --help
#crm_failcount --help
#crm_attribute --help
#crm_sh(进入crm的shell,进入后help)
注:crm-->pacemaker(资源迁移,约束定义,资源定义,资源属性定义,集群属性定义等都可在命令行下完成,得到极大扩展,功能异常强大)
#hb_gui &(打开图形界面配置,首先win下要安装xmanager enterprise套件,若出错Traceback(most recent call last)……Could not opendisplay,File-->Properties-->SSH-->Tunneling-->Forward X11connections to:Xmanager,重启xshell即可)
注:进到图形界面后查看哪个node是DC,最好在DC所在node配置
no quorum policy(不满足法定票数时的策略,stop默认,freeze,ignore)
symmetric cluster(对称集群)
stonith enabled(要手动配置stonith设备)
stonith action(reboot,poweroff)
default resource stickiness(资源粘性,0任意node可转移,此项要结合locationconstraint来判定到底在哪个node上运行)
is managed default(可管理)
将resources中group_1删除,重建资源
右键resources-->add new item-->选group(ID:webservice,order:true,collocated:true)-->OK
注:组要先定义,定义好组后再定义各资源,否则没有组的资源是分散地按顺序依次在不同的node运行
注:在GUI下注意添加资源的顺序,切换时是按添加各资源的先后顺序启动各资源,所以添加资源时,先VIP,再filesystem,最后httpd
resource ID:webip,belong togroup:webservice,type:选择IPaddr,add parameter(添加ip 为192.168.1.222,nic为eth0,cidr_netmask为24,iflabel为eth0:0)-->Add
注:clone(clone_max表示最多克隆多少个资源,clone_node_max表示最多运行在多少个node上)
右键webservice-->Add New Item-->native-->注意ResourceID:webstore,Type:选Filesystem,parameters:device为192.168.1.127:/web/htdocs,directory为/var/www/html,fstype为nfs-->Add
右键webservice--> Add New Item-->native-->注意ResourceID:httpd,Type:选httpd-->Add(没有参数定义)
配置好后,右键webservice-->Cleanup Resource(最好在组中的每个资源都clean upresource,防止之前配置改动过,影响当下的执行)
注:每次运行都会记录当前状态,以决定故障时转移到哪个node,在每一次对资源做改动时,要对此前状态进行清理,再start
测试:右键webservice-->start(观察各资源间的启动顺序,在windows端用浏览器查看)
在当前node右键-->Standby(查看是否转移,与配置文件/etc/ha.d/ha.cf中auto_failback on有关)
以上是通过组把三个资源绑在一起,也可通过constraint将资源绑在一起
将上例的组删掉,重新创建资源(注意选择native,其它如资源名字和相关属性与上例相同)
在Constraints中,右键Colocations-->Add new item-->选colocation-->ID:httpd_with_webstore,from:httpd,to:webstore,Score:选INFINITY-->OK
右键Colocations-->Add new item-->选colocation-->ID:webstore_with_webip,From:webstore,to:webip,Score:选INFINITY
注:通常选启动IP再启动httpd,否则httpd启动时会监听在某一地址上,会启动不起来
在Constraints中,右键Order-->Add new item-->选order-->ID:webstore_before_httpd,From:httpd,To:webstore,Score:选INFINITY
右键Order-->Add new item-->选order-->ID:webip_before_httpd,From:httpd,To:webip,Score:选INFINITY
在Constraints中,右键Locations-->Add new item-->item Type:选location-->ID:webip_on_node2,Resources:选webip,Score:INFINITY-->AddExpression(Attributed:#uname,Operation:eq,Value:选node2.magedu.com-->OK
点linux-ha,Configurations中Default Resource Stickness:100
注:以上两条设置,location位置约束是各资源(同进同退的资源)score之和,结合资源粘性来决定资源在哪个node运行,例如:node1(资源粘性为100,位置约束为0),node2(资源粘性100,位置约束INFINITY,则当这两个node都正常运行时,资源优先选择node2
测试:
按从上至下依次右键各资源点start;
在node1-side远程将node2上heartbeat服务stop,观察这时资源在node1上运行;
在node1-side远程再将node2上heartbeat服务start,这时服务重新又在node2上运行了
注:若模拟node2关机(强制关闭电源),其它node会一直等node2传递的心跳信息,等过了超时时间才转移,这个过程会很慢;若是模拟node2故障,是服务停止话,这样它会给其它node传递心跳信息,切换的过程会很快
==============================================================
通过heartbeat可将资源(IP和程序服务等资源)从一台已故障的server转移到另一台正常运转的server上使之继续提供服务,一般称为HA服务;
heartbeat的HA是server级别的,而不是service级别,服务故障不会导致切换,在server级别出故障才导致切换(如:server宕机、heartbeat服务本身故障、心跳连接线故障才会切换),但可通过脚本监测服务故障后把heartbeat的服务停掉以此完成切换
注:在实际生产应用场景中,其功能和另一开源软件keepalived有相同之处,仅是在功能上相同,但在实际业务应用及原理方面有很大的不同
http://linux-ha.org
heartbeat主备模式(通过修改配置文件,可指定哪一台server作为masterserver,那另一台将自动成为热备backup server,然后在backup server上配置heartbeat守护程序来监听来自master server的心跳信息,如果backup server在指定时间内未监听到master server的心跳,就会启动故障转移程序failover,并取得master server上相关资源服务的所有权,接替take over master server继续不间断的提供服务,从而达到资源及服务HA的目的);
heartbeat主主模式(两台server互为主备,它们之间会相互发送报文来告诉对方自己当前的状态,如果在指定时间内未收到对方发送的心跳报文,一方就认为对方失效或宕机了,这时每个运行正常的主机就会启动自身的资源接管模块来接管运行在对方主机上的资源或服务,继续为用户提供服务);
heartbeat一般可较好的实现一台主机故障后,企业业务仍能不间断的持续运行,所谓业务不间断,在failover期间也是需要切换时间的,heartbeat的切换时间一般在5-20s
heartbeat的心跳连接(至少要两台主机,每台主机两个网卡,两台主机间要做到互相通信和互相监测):
串行电缆(串口线,有长度限制,距离不能太远);
通过一根网线将两网卡直连(常用,推荐);
通过网线和switch连接两网卡(正常LAN的方式,次选,有switch增加了故障点);
注:可使用串行电缆和网线直连网卡,这两种可同时使用,双保险
heartbeat split brain裂脑(或分区集群或大脑垂直分割):
两台HA server在指定时间内,无法互相检测到对方心跳而各自启动failover功能,取得资源及服务所有权,而此时两台server都还在正常运行,这样导致同一个IP或服务在两台server上同时运行,发生冲突,这两台server就会有一台或两台都不正常,导致用户不能正常访问server,例如占用同一个VIP,若应用是DB或storage服务,用户写的数据会分别写到两台server上,导致数据不一致,最终数据恢复极为困难或难以恢复;
注:若storage服务是NAS等公共存储硬件则相对会好些
split-brain发生的多种原因:
heartbeat服务本身配置不当,例如两端心跳线通信方式不同(单播、多播、广播);
HA server之间心跳线链路故障,导致无法正常通信(心跳线坏了(断了,老化了);网卡硬件故障及相关驱动出问题;IP配置导致冲突或无效IP等;心跳线间的设备故障;仲裁的机器出问题等);
HA server间开启了firewall阻挡了心跳信息传输;
防止split-brain的手段:
在网卡设备和网线设备上同时使用串行电缆和以太网线缆连接,双保险;
企业级行业方案,靠特殊设备stonith、fence,在检测到split-brain时强行关闭一个心跳节点,相当于在程序上备node发现心跳故障,发送关机命令到主node(备认为主出问题了,补刀,将主挂透,不连累大家);
做好对split-brain的监控报警,如短信及邮件,在问题发生时人为的第一时间介入仲裁,降低损失,根据业务实际需求要能容忍一定的损失,对于一般网站业务这个损失是可控的,如baidu监控有上行和下行,有与人交互的过程;
启用磁盘锁,正在服务一方锁住磁盘,在split-brain发生时让对方完全抢不走共享磁盘资源,使用此方法的问题,若占用共享磁盘的一方不主动解锁,另一方则永远得不到共享磁盘,现实生产中若服务node突然死机或崩溃则无法执行解锁命令,那备node就无法接管共享资源和应用服务,于是有人在HA中设计了智能锁,正在服务的一方只在发现心跳线全部断开时,即察觉不到对方时才启用磁盘锁,平时就不上锁了;
报警报在server接管之前,给人员处理留足够时间,例如1min内报警了,在5min内server没有自动接管待人员介入先处理,这5min将导致用户无法写数据,若5min内无人操作,server将自动接管;
报警后,不直接自动server接管,而由人员控制接管;
增加仲裁机制,确定谁该获得资源(方式一ping网关,能ping通网关的接管服务;方式二使用第三方软件仲裁,ali有类似的应用);
注:fence是HA cluster环境的术语,在硬件领域上fence设备叫IPMI,intelligent power management interface智能电源管理设备(或叫远程电源管理卡),这些设备都是带以太网口的,用来在HA切换触发时通过网络重启server;
内部fence设备(远程电源管理卡):IBM(RSA、RSAII)、HP(ILO、ILO2)、DELL(iDRAC、iDRAC3),该卡上有独立的系统和一个以太网口,只要不断网,通过web管理端连入该设备,配合snmp可监控到该server的所有信息(CPU温度、raid状态、风扇转速等),另一功能是只要有网登录后打开一个console,需browser支持java,类似VNC,从而进行操作;
外部fence设备:APC(UPS电源生产商,PowerSwitch,这是一个带以太网口的电源插座,每个接口对应一个ID号,用来在命令中指定对哪一个ID号上的电源进行切断或重启);
注:RHCS的仲裁机制是仲裁盘,通过额外存储实现,比如SAN,通过mkqdisk命令制作一个特殊块设备,对于双node的HA,两server的投票数均为1,仲裁盘在RHCS中可设置投票数,例如设仲裁盘的投票数为2,双方node使用ping网关的方式将自己的存活状态写到仲裁盘上,当某一server故障,仲裁盘将没有此node的存活信息,则会启动fence设备来重启或关闭该node,此种方法缺点判断时间比较长
heartbeat消息类型:
心跳信息(为约150byte的数据包,可以是单播、多播、广播的方式,控制心跳频率及出现故障要等待多久进行故障转移);
集群转换消息(ip-request、ip-request-resp,主故障备接管,当主恢复时,主发ip-request消息要求备释放资源,备释放后给主发ip-request-resp通知主它不再拥有该资源及服务,主在收到备的ip-request-resp启动资源及服务,主对外正常提供服务);
重传请求(rexmit-request,控制重传心跳请求);
注:心跳控制消息都是用udp发送,port在配置文件/etc/ha.d/ha.cf中指定
heartbeat是通过IP地址接管和ARP广播进行故障转移的,在主node故障,备node在接管资源后会立即强制更新所有LAN内所有主机本地的ARP表,此时会清除LAN内主机本地缓存的vip地址和mac地址对应的解析记录,确保LAN本地的主机和新的主server的对话;
管理IP(即配置在物理网卡上的真实IP,在LB和HA环境中,真实IP不对外提供服务,仅作为管理用);
VIP(virtual IP,IP别名alias,如eth0:NUM,NUM为0-255之间的数,由VIP对外提供服务,#ifconfigeth0:0 192.168.1.222/24 up,生产环境中域名是与VIP关联的,和真实IP没关系,例如正在提供服务的主node故障,切至备node上,接管的备node会自动配置VIP,如果使用管理IP的话要来回进行迁移,这是难以做到的,而且管理IP若迁移了,只能在机房连接server了);
辅助IP(#ip addr add 192.168.1.222/24 broadcast 192.168.1.255 dev eth0,#ip addr del192.168.1.222/24 broadcast 192.168.1.255 dev eth0,heartbeatV3和keepalived都采用此种方式);
注:用IP别名和辅助IP这两种方式在HA环境中作用一样,只是命令不同;使用ip addr add配置的信息,查看时用ip addr show,用ifconfig是查看不到的
heartbeat资源路径(/etc/ha.d/resource.d/*,此路径下有大量脚本,这也是heartbeat比keepalived强的原因之一,若自己开发的脚本可放在此路径下,再在/etc/ha.d/haresources文件中配置调用此脚本即可);
默认文件配置路径(/etc/ha.d/{ha.cf,authkeys,haresources},ha.cf参数配置文件,authkeys认证文件,haresources资源配置文件(配置IP资源、服务及脚本);
rhel6(/usr/share/heartbeat/{hb_standby,hb_takeover})
rhel5(/usr/lib64/heartbeat/{hb_standby,hb_takeover})
heartbeat控制脚本要求:
脚本要在/etc/init.d/下或/etc/ha.d/resource.d/下;
脚本需要有/etc/init.d/httpd start|stop功能;
脚本要有可执行权限;
脚本名要与haresources中调用脚本时写的一致;
注:
heartbeat可控制httpd、nginx、haproxy等服务;但如果有写数据的服务例如MySQL,要么用共享存储,要么主备node的数据库要实时同步才可随意切换两个node,否则数据不一致导致split-brain;
heartbeat可仅控制VIP的飘移,不负责服务资源的启动和停止,也可以既负责VIP飘移和服务的start|stop,若是MySQL最好用heartbeat两个都控制,heartbeat两个都控制的情况下,若MySQL或httpd的服务故障,这时heartbeat的HA不会转移,它是server级别故障才会切换,备node这时不会接管take over,这要通过脚本单独实现(例如用脚本定时检测httpd或mysqld服务是否正常,若不正常关闭heartbeat,使得主动强制切换);
应用:
heartbeat+{haproxy|nginx};
keepalived+LVS;
heartbeat+MySQL(dual master);
LVS+MySQL(slave);
heartbeat+{NFS|MFS});
LB器、数据库主库、存储的主存储、webserver等这些应用的高可用都可通过heartbeat和keepalived实现,一般keepalived+LVS,而heartbeat+LVS+ldirectord比较麻烦;
若是数据同步配合drbd的HA业务最好用heartbeat,其自带的脚本可与服务完美结合
如果解决了数据同步不用drbd,就可考虑使用keepalived,如共享存储或inotify+rsync(或sersync+rsync)
维护要点:
heartbeat不要开机自启动,若master node故障,最好人为介入处理,防止split-brain;
修改配置前执行#service heartbeat stop,新业务上线一般改配置的文件是/etc/ha.d/haresources;
所有配置放到SVN,commit后对比,再push到正式环境;
可通过heartbeat自带的命令先配置好VIP,准备好配置文件,在流量低谷时重启;
LB和HA server的位置都非常重要,操作时一定要谨慎小心,要事先写好操作步骤及回滚步骤,再动手操作,否则极易导致网站宕机影响用户体验,尤其是涉及到DB和storage的HA
准备环境:
VIP:10.96.20.8
master:eth0(10.96.20.113)、eth1(172.16.1.113,不配网关及dns)、主机名(test-master)
backup:eth0(10.96.20.114)、eth1(172.16.1.114,不配网关及dns)、主机名(test-backup)
注:规范vmware中标签,Xshell中标签,公司中的生产环境所有主机均应在/etc/hosts文件中有相应记录,方便分发及管理维护
test-master(分别配置主机名/etc/sysconfig/network结果一定要与uname -n保持一致,/etc/hosts文件,ssh双机互信,时间同步,iptables,selinux):
[root@test-master ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.5(Santiago)
[root@test-master ~]# uname -rm
2.6.32-431.el6.x86_64 x86_64
[root@test-master ~]# uname -n
test-master
[root@test-master ~]# ifconfig | grep eth0 -A 1
eth0 Link encap:Ethernet HWaddr00:0C:29:1F:B6:AC
inet addr:10.96.20.113 Bcast:10.96.20.255 Mask:255.255.255.0
[root@test-master ~]# ifconfig | grep eth1-A 1
eth1 Link encap:Ethernet HWaddr00:0C:29:1F:B6:B6
inet addr:172.16.1.113 Bcast:172.16.1.255 Mask:255.255.255.0
[root@test-master ~]# route add -host 172.16.1.114 dev eth1 #(添加主机路由,心跳传送通过指定网卡出去,此句可追加到/etc/rc.local中,也可配置静态路由#vim /etc/sysconfig/network-scripts/route-eth1添加172.16.1.114/24via 172.16.1.113)
[root@test-master ~]# ssh-keygen -t rsa -f ./.ssh/id_rsa -P ''
Generating public/private rsa key pair.
Your identification has been saved in./.ssh/id_rsa.
Your public key has been saved in./.ssh/id_rsa.pub.
The key fingerprint is:
29:c3:a3:68:81:43:59:2f:0a:ad:8a:54:56:b0:1e:12root@test-master
The key's randomart image is:
+--[ RSA 2048]----+
| E o.. |
| .+ + |
|.+.* . |
|oo* o. . |
|+o.. = S |
|+. o . + |
|o o . |
| . |
| |
+-----------------+
[root@test-master ~]# ssh-copy-id -i ./.ssh/id_rsa root@test-backup
The authenticity of host 'test-backup(10.96.20.114)' can't be established.
RSA key fingerprint is63:f5:2e:dc:96:64:54:72:8e:14:7e:ec:ef:b8:a1:0c.
Are you sure you want to continueconnecting (yes/no)? yes
Warning: Permanently added 'test-backup'(RSA) to the list of known hosts.
root@test-backup's password:
Now try logging into the machine, with"ssh 'root@test-backup'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keysthat you weren't expecting.
[root@test-master ~]# crontab -l
*/5 * * * * /usr/sbin/ntpdatetime.windows.com &> /dev/null
[root@test-master ~]# service crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]
[root@test-master ~]# wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@test-master ~]# rpm -ivh epel-release-6-8.noarch.rpm
warning: epel-release-6-8.noarch.rpm:Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing... ########################################### [100%]
1:epel-release ########################################### [100%]
[root@test-master ~]# yum search heartbeat
……
heartbeat-devel.i686 : Heartbeatdevelopment package
heartbeat-devel.x86_64 : Heartbeatdevelopment package
heartbeat-libs.i686 : Heartbeat libraries
heartbeat-libs.x86_64 : Heartbeat libraries
heartbeat.x86_64 : Messaging and membershipsubsystem for High-Availability Linux
[root@test-master ~]# yum -y install heartbeat
[root@test-master ~]# chkconfig heartbeat off
[root@test-master ~]# chkconfig --list heartbeat
heartbeat 0:off 1:off 2:off 3:off 4:off 5:off 6:off
test-backup:
[root@test-backup ~]# uname -n
test-backup
[root@test-backup ~]# ifconfig | grep eth0-A 1
eth0 Link encap:Ethernet HWaddr00:0C:29:15:E6:BB
inet addr:10.96.20.114 Bcast:10.96.20.255 Mask:255.255.255.0
[root@test-backup ~]# ifconfig | grep eth1-A 1
eth1 Link encap:Ethernet HWaddr00:0C:29:15:E6:C5
inet addr:172.16.1.114 Bcast:172.16.1.255 Mask:255.255.255.0
[root@test-backup ~]# route add -host 172.16.1.113 dev eth1
[root@test-backup ~]# ssh-keygen -t rsa -f ./.ssh/id_rsa -P ''
Generating public/private rsa key pair.
Your identification has been saved in./.ssh/id_rsa.
Your public key has been saved in./.ssh/id_rsa.pub.
The key fingerprint is:
08:ea:6a:44:7f:1a:c9:bf:ff:01:d5:32:e5:39:1b:b8root@test-backup
The key's randomart image is:
+--[ RSA 2048]----+
| . |
| = . |
| . = * |
| . . . .. + + |
|. + . ..SE . |
| o = . . |
|. . = . |
| o . . . |
|o .o... |
+-----------------+
[root@test-backup ~]# ssh-copy-id -i ./.ssh/id_rsa root@test-master
The authenticity of host 'test-master(10.96.20.113)' can't be established.
RSA key fingerprint is63:f5:2e:dc:96:64:54:72:8e:14:7e:ec:ef:b8:a1:0c.
Are you sure you want to continueconnecting (yes/no)? yes
Warning: Permanently added 'test-master'(RSA) to the list of known hosts.
root@test-master's password:
Now try logging into the machine, with"ssh 'root@test-master'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keysthat you weren't expecting.
[root@test-backup ~]# crontab -l
*/5 * * * * /usr/sbin/ntpdatetime.windows.com &> /dev/null
[root@test-backup ~]# service crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]
[root@test-backup ~]# wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@test-backup ~]# rpm -ivh epel-release-6-8.noarch.rpm
[root@test-backup ~]# yum -y installheartbeat
[root@test-backup ~]# chkconfig heartbeat off
[root@test-backup ~]# chkconfig --list heartbeat
heartbeat 0:off 1:off 2:off 3:off 4:off 5:off 6:off
test-master:
[root@test-master ~]# cp /usr/share/doc/heartbeat-3.0.4/{ha.cf,authkeys,haresources} /etc/ha.d/
[root@test-master ~]# cd /etc/ha.d
[root@test-master ha.d]# ls
authkeys ha.cf harc haresources rc.d README.config resource.d shellfuncs
[root@test-master ha.d]# vim authkeys #(使用#dd if=/dev/random count=1 bs=512 | md5sum生成随机数,sha1后跟随机数)
auth 1
1 sha1912d6402295ac8d47109e56b177073b9
[root@test-master ha.d]# chmod 600 authkeys #(此文件权限600,否则启动服务时会报错)
[root@test-master ha.d]# ll !$
ll authkeys
-rw-------. 1 root root 692 Aug 7 21:51 authkeys
[root@test-master ha.d]# vim ha.cf
debugfile /var/log/ha-debug #(调试日志)
logfile /var/log/ha-log
logfacility local1 #(在rsyslog服务中配置通过local1接收日志)
keepalive 2 #(指定心跳间隔时间,即2s发一次广播)
deadtime 30 #(指定备node在30s内没收到主node的心跳信息则立即接管对方的服务资源)
warntime 10 #(指定心跳延迟的时间为10s,当10s内备node没收到主node的心跳信息,就会往日志中写警告,此时不会切换服务)
initdead 120 #(指定在heartbeat首次运行后,需等待120s才启动主node的各资源,此项用于解决等待对方heartbeat服务启动了自己才启,此项值至少要是deadtime的两倍)
udpport 694
#bcast eth0 #(指定心跳使用以太网广播方式在eth0上广播,若要使用两个实际网络传送心跳则要为bcast eth0 eth1)
mcast eth0 225.0.0.11 6941 0 #(设置多播通信的参数,多播地址在LAN内必须是唯一的,因为有可能有多个heartbeat服务,多播地址使用D类IP(224.0.0.0--239.255.255.255),格式为mcast devmcast_group port ttl loop)
auto_failback on #(用于主node恢复后failback)
node test-master #(主node主机名,uname -n结果)
node test-backup #(备node主机名)
crm no #(是否开启CRM功能)
[root@test-master ha.d]# vim haresources
test-master IPaddr::10.96.20.8/24/eth0 #(此句相当于执行#/etc/ha.d/resource.d/IPaddr 10.96.20.8/24/eth0 stop|start,IPaddr即是/etc/ha.d/resource.d/下的脚本)
[root@test-master ha.d]# scp authkeys ha.cf haresources root@test-backup:/etc/ha.d/
authkeys 100% 692 0.7KB/s 00:00
ha.cf 100% 10KB 10.3KB/s 00:00
haresources 100% 5944 5.8KB/s 00:00
[root@test-master ha.d]# service heartbeat start
Starting High-Availability services:INFO: Resource is stopped
Done.
[root@test-master ha.d]# ssh test-backup 'service heartbeat start'
Starting High-Availability services:2016/08/07_22:39:00 INFO: Resource isstopped
Done.
[root@test-master ha.d]# ps aux | grep heartbeat
root 63089 0.0 3.1 50124 7164 ? SLs 22:38 0:00 heartbeat: mastercontrol process
root 63093 0.0 3.1 50076 7116 ? SL 22:38 0:00 heartbeat: FIFOreader
root 63094 0.0 3.1 50072 7112 ? SL 22:38 0:00 heartbeat: write:mcast eth0
root 63095 0.0 3.1 50072 7112 ? SL 22:38 0:00 heartbeat: read:mcast eth0
root 63136 0.0 0.3 103264 836 pts/0 S+ 22:39 0:00 grep heartbeat
[root@test-master ha.d]# ssh test-backup'ps aux | grep heartbeat'
root 3050 0.0 3.1 50124 7164 ? SLs 22:39 0:00 heartbeat: mastercontrol process
root 3054 0.0 3.1 50076 7116 ? SL 22:39 0:00 heartbeat: FIFOreader
root 3055 0.0 3.1 50072 7112 ? SL 22:39 0:00 heartbeat: write: mcast eth0
root 3056 0.0 3.1 50072 7112 ? SL 22:39 0:00 heartbeat: read:mcast eth0
root 3094 0.0 0.5 106104 1368 ? Ss 22:39 0:00 bash -c ps aux | grep heartbeat
root 3108 0.0 0.3 103264 832 ? S 22:39 0:00 grep heartbeat
[root@test-master ha.d]# netstat -tnulp |grep heartbeat
udp 0 0 225.0.0.11:694 0.0.0.0:* 63094/heartbeat: wr
udp 0 0 0.0.0.0:50268 0.0.0.0:* 63094/heartbeat:wr
[root@test-master ha.d]# ssh test-backup 'netstat -tnulp | grep heartbeat'
udp 0 0 0.0.0.0:58019 0.0.0.0:* 3055/heartbeat:wri
udp 0 0 225.0.0.11:694 0.0.0.0:* 3055/heartbeat:wri
[root@test-master ha.d]# ip addr | grep 10.96.20
inet 10.96.20.113/24 brd 10.96.20.255 scope global eth0
inet 10.96.20.8/24 brd 10.96.20.255 scopeglobal secondary eth0
[root@test-master ha.d]# ssh test-backup 'ip addr | grep 10.96.20'
inet 10.96.20.114/24 brd 10.96.20.255 scope global eth0
[root@test-master ha.d]# service heartbeat stop
Stopping High-Availability services: Done.
[root@test-master ha.d]# ip addr | grep 10.96.20
inet 10.96.20.113/24 brd 10.96.20.255 scope global eth0
[root@test-master ha.d]# ssh test-backup 'ip addr | grep 10.96.20'
inet 10.96.20.114/24 brd 10.96.20.255 scope global eth0
inet 10.96.20.8/24 brd 10.96.20.255 scope global secondary eth0
[root@test-master ha.d]# service heartbeat start
Starting High-Availability services:INFO: Resource is stopped
Done.
[root@test-master ha.d]# ip addr | grep 10.96.20
inet 10.96.20.113/24 brd 10.96.20.255 scope global eth0
inet 10.96.20.8/24 brd 10.96.20.255 scope global secondary eth0
[root@test-master ha.d]# ssh test-backup'ip addr | grep 10.96.20'
inet 10.96.20.114/24 brd 10.96.20.255 scope global eth0
本文转自 chaijowin 51CTO博客,原文链接:http://blog.51cto.com/jowin/1717663,如需转载请自行联系原作者