Linux运维 第五阶段(二)heartbeat V2(HA)
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 [email protected]:/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传递心跳信息,切换的过程会很快
以上是学习《马哥运维课程》做的笔记。
本文出自 “Linux运维重难点学习笔记” 博客,谢绝转载!