pacemaker + crmsh+corosync 高可用集群

来源:互联网 发布:java编程思想 中文 pdf 编辑:程序博客网 时间:2024/06/05 11:57

1.Pacemaker介绍

    pacemaker(直译:心脏起搏器),是一个群集资源管理器。它实现最大可用性群集服务(亦称资源管理)的节点和资源级故障检测和恢复使用您的首选集群基础设施(OpenAIS的或Heaerbeat)提供的消息和成员能力。   它可以做乎任何规模的集群,并配备了一个强大的依赖模型,使管理员能够准确地表达群集资源之间的关系(包括顺序和位置)。几乎任何可以编写脚本,可以管理作为心脏起搏器集群的一部分。   注意:pacemaker是个资源管理器,不是提供心跳信息的,因为它似乎是一个普遍的误解,也是值得的。pacemaker是一个延续的CRM(亦称Heartbeat V2资源管理器),最初是为心跳,但已经成为独立的项目。

2.pacemaker 特点

    (1)主机和应用程序级别的故障检测和恢复    (2)几乎支持任何冗余配置    (3)同时支持多种集群配置模式    (4)配置策略处理法定人数损失(多台机器失败时)    (5)支持应用启动/关机顺序    (6)支持,必须/必须在同一台机器上运行的应用程序    (7)支持多种模式的应用程序(如主/从)    (8)可以测试任何故障或群集的群集状态 

3.实现

使用corosync监控心跳,pacemaker时先资源转移,crmsh实现集群资源配置使用fence检查节点健康状况,实行跳电保护

4.安装

yum install -y corosync pacemaker crmsh-1.2.6-0.rc2.2.1.x86_64.rpm  pssh-2.3.1-2.1.x86_64.rpm

5.配置

corosync 配置文件在 /etc/corosync/ 目录下:mv corosync.conf.example corosync.conf ##有一个模板,直接拿来修改.....  #totem定义集群内各节点间是如何通信的,totem本是一种协议,专用于corosync专用于各节点间的协议,totem协议是有版本的;totem {    version: 2    #totme的版本,不可更改    secauth: off  #安全认证,开启时很耗cpu    threads: 0    #安全认证开启后并行线程数    interface {        ringnumber: 0   #回环号码,若主机有多块网卡,避免心跳汇流        bindnetaddr: 172.25.12.0  #心跳网段,corosync会自动判断本地网卡上配置的哪个IP地址是属于这个网络的,并把这个接口作为多播心跳信息传递的接口        mcastaddr: 226.94.1.1  #心跳信息组播地址(所有节点必须一致)        mcastport: 5405 #组播端口        ttl: 1   #只条一跳,避免组播报文环路    }}logging {    fileline: off    to_stderr: no    to_logfile: yes    to_syslog: yes    logfile: /var/log/cluster/corosync.log    debug: off    timestamp: on    logger_subsys {        subsys: AMF        debug: off    }}amf {    mode: disabled}#让pacemaker在corosync中以插件方式启动:service{    ver:0  #版本号    name:pacemaker  #模块名,启动corosync同时启动pacemaker}#运行身份aisxec{    user:root    group:root}.....

6.生成多播信息密钥

corosync-keygen 生成传递心跳信息时的预共享密钥,生成密钥时需要用到 /dev/random  一共需要1024位的长度# 生成后的密钥文件会在配置文件目录下自行生成一个authkey文件注意:/dev/random是 Linux系统下的随机数生成器,它会从当前系统的内存中一个叫熵池的地址空间中根据系统中断来生成随机数,加密程序或密钥生成程序会用到大量的随机数,就会出现随机数不够用的情况,random 的特性就是一旦熵池中的随机数被取空,会阻塞当前系统进程等待产生中断会继续生成随机数;由于此处会用到1024位长度的密钥,可能会存在熵池中的随机数不够用的情况,就会一直阻塞在生成密钥的阶段,所以我们用 /dev/urandom 来代替它,/dev/urandom不依赖系统的中断,也就不会造成进程忙等待,但是数据的随机性也不高mv /dev/{random,random.bak}ln -s /dev/urandom /dev/randomcorosync-keygen   #就不会卡住了chmod 400 authkey  # 密钥文件权限必须为 400 或 600scp -p authkey corosync.conf server7:/etc/corosync/scp -p authkey corosync.conf server8:/etc/corosync/  # 将刚生成的密钥与配置文件复制到第其他节点上,并保存权限;

7.service corosync start #所有节点启动服务

8.crm_mon #查看集群信息

Last updated: Fri May 26 20:27:03 2017Last change: Fri May 26 19:19:16 2017 via cibadmin on server6Stack: classic openais (with plugin)Current DC: server8 - partition with quorumVersion: 1.1.10-14.el6-368c7263 Nodes configured, 3 expected votes  #三个节点,三票0 Resources configured    #资源数Online: [ server6 server7 server8 ]  #在线节点

9.日志文件

/var/log/cluster/corosync.log启动完成后要在各个节点上进行一系列的确认,看各组件工作是否正常:grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log#确保   Cluster Engine  工作是否正常grep  "TOTEM"  /var/log/cluster/corosync.log# 查看初始化成员节点通知是否正常发出grep pcmk_startup /var/log/cluster/corosync.log# 查看 pcmk(pacemaker简写) 插件工作是否正常grep ERROR /var/log/cluster/corosync.log# 检查启动过程中是否有错误产生        # 日志出现了哪些错误,如果出现提示pacemaker不应该以插件方式运行直接忽略即可;# 可能会提示我们PE工作不正常;让我们用  crm_verify -L  -V 来查看

10.crm_verify -L -V

error: unpack_resources: Resource start-up disabled since no STONITH resources have been definederror: unpack_resources: Either configure some or disable STONITH with the stonith-enabled optionerror: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrityErrors found during check: config not valid# corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用# 即没有 STONITH 设备,此处实验性目的可以忽略;

11.crm

    (1)在crm管理接口所做的配置会同步到各个节点上    (2)任何操作都需要commit提交后才会生效;    (3)想要删除一个资源之前需要先将资源停止    (4)可以用 help COMMAND 获取该命令的帮助    (5)支持 TAB 补全

12.工作模式:

    (1)批处理模式,在shell中直接输入命令    (2)交互式[root@server8 ~]# crmcrm(live)# help   #获取当前可用命令This is crm shell, a Pacemaker command line interface.Available commands:cib              manage shadow CIBs # cib沙盒resource         resources management # 所有的资源都在这个子命令后定义configure        CRM cluster configuration # 编辑集群配置信息node             nodes management # 集群节点管理子命令options          user preferences # 用户优先级history          CRM cluster historysite             Geo-cluster supportra               resource agents information center # 资源代理子命令(所有与资源代理相关的程都在此命令之下)status           show cluster status # 显示当前集群的状态信息help,?           show help (help topics for list of topics)# 查看当前区域可能的命令end,cd,up        go back one level # 返回第一级crm(live)#quit,bye,exit    exit the program  # 退出crm(live)交互模式

13.常用子命令

(1)resource子命令 #定义所有资源的状态crm(live)resource# helpvailable commands:status           show status of resources #显示资源状态信息start            start a resource #启动一个资源stop             stop a resource #停止一个资源restart          restart a resource #重启一个资源promote          promote a master-slave resource #提升一个主从资源demote           demote a master-slave resource #降级一个主从资源manage           put a resource into managed modeunmanage         put a resource into unmanaged modemigrate          migrate a resource to another node #将资源迁移到另一个节点unmigrate        unmigrate a resource to another nodeparam            manage a parameter of a resource #管理资源的参数secret           manage sensitive parameters #管理敏感参数meta             manage a meta attribute #管理源属性utilization      manage a utilization attributefailcount        manage failcounts #管理失效计数器cleanup          cleanup resource status #清理资源状态refresh          refresh CIB from the LRM status #从LRM(LRM本地资源管理)更新CIB(集群信息库)reprobe          probe for resources not started by the CRM #探测在CRM中没有启动的资源trace            start RA tracing #启用资源代理(RA)追踪untrace          stop RA tracing #禁用资源代理(RA)追踪help             show help (help topics for list of topics) #显示帮助end              go back one level #返回一级(crm(live)#)quit             exit the program #退出交互式程序(2)configure子命令 #资源粘性、资源类型、资源约束crm(live)configure# helpAvailable commands:node             define a cluster node #定义一个集群节点primitive        define a resource #定义资源monitor          add monitor operation to a primitive #对一个资源添加监控选项(如超时时间,启动失败后的操作)group            define a group #定义一个组类型(将多个资源整合在一起)clone            define a clone #定义一个克隆类型(可以设置总的克隆数,每一个节点上可以运行几个克隆)ms               define a master-slave resource #定义一个主从类型(集群内的节点只能有一个运行主资源,其它从的做备用)rsc_template     define a resource template #定义一个资源模板location         a location preference # 定义位置约束优先级(默认运行于那一个节点(如果位置约束值相同,默认倾向性哪一个高,就在哪一个节点上运行))colocation       colocate resources #排列约束资源(多个资源在一起的可能性)order            order resources #资源的启动的先后顺序rsc_ticket       resources ticket dependency#property         set a cluster property #设置集群属性rsc_defaults     set resource defaults #设置资源默认属性(粘性)fencing_topology node fencing order #隔离节点顺序role             define role access rights #定义角色的访问权限user             define user access rights #定义用用户访问权限op_defaults      set resource operations defaults #设置资源默认选项schema           set or display current CIB RNG schemashow             display CIB objects #显示集群信息库对edit             edit CIB objects #编辑集群信息库对象(vim模式下编辑)filter           filter CIB objects #过滤CIB对象delete           delete CIB objects #删除CIB对象default-timeouts     set timeouts for operations to minimums from the meta-datarename           rename a CIB object #重命名CIB对象modgroup         modify group #改变资源组refresh          refresh from CIB #重新读取CIB信息erase            erase the CIB #清除CIB信息ptest            show cluster actions if changes were committedrsctest          test resources as currently configuredcib              CIB shadow managementcibstatus        CIB status management and editingtemplate         edit and import a configuration from a templatecommit           commit the changes to the CIB #将更改后的信息提交写入CIBverify           verify the CIB with crm_verify #CIB语法验证upgrade          upgrade the CIB to version 1.0save             save the CIB to a file #将当前CIB导出到一个文件中(导出的文件存于切换crm 之前的目录)load             import the CIB from a file #从文件内容载入CIBgraph            generate a directed graphxml              raw xmlhelp             show help (help topics for list of topics) #显示帮助信息end              go back one level #回到第一级(crm(live)#)(3)node子命令 #节点管理和状态crm(live)# nodecrm(live)node# helpNode management and status commands.Available commands:status           show nodes status as XML #以xml格式显示节点状态信息show             show node #命令行格式显示节点状态信息standby          put node into standby #模拟指定节点离线(standby在后面必须的FQDN)online           set node online #节点重新上线maintenance      put node into maintenance modeready            put node into ready modefence            fence node #隔离节点clearstate       Clear node state #清理节点状态信息delete           delete node #删除 一个节点attribute        manage attributesutilization      manage utilization attributesstatus-attr      manage status attributeshelp             show help (help topics for list of topics)end              go back one levelquit             exit the program(4)ra子命令 #资源代理类别都在此处crm(live)# racrm(live)ra# helpAvailable commands:classes          list classes and providers # 为资源代理分类list             list RA for a class (and provider) # 显示一个类别中的提供的资源meta             show meta data for a RA # 显示一个资源代理序的可用参数(如meta ocf:heartbeat:IPaddr2)providers        show providers for a RA and a classhelp             show help (help topics for list of topics)end              go back one levelquit             exit the program

14.禁用stonith设备(如果没有stonith设备,最好禁用):

这块我们要配置fence,所以stonith就不用禁用了configurecrm(live)configure# property stonith-enabled=falsecrm(live)configure# commitcrm_verify -L -V   #此时在检查就不会检查 stoith 设备了;

15.配置VIP

crm(live)#configurecrm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=172.25.12.200 nic='eth0' cidr_netmask='24' broadcast='172.25.12.255'# 只要IPaddr 不在一个以上资源代理类别下存在,ocf:heartbeat都可以省略crm(live)configure# verifycrm(live)configure# commitcrm(live)configure# cdcrm(live)# statusLast updated: Fri May 26 20:56:39 2017Last change: Fri May 26 20:56:34 2017 via cibadmin on server8Stack: classic openais (with plugin)Current DC: server8 - partition with quorumVersion: 1.1.10-14.el6-368c7263 Nodes configured, 3 expected votes1 Resources configuredOnline: [ server6 server7 server8  vip    (ocf::heartbeat:IPaddr):    Started server6 #vip在server6上运行

查看vip:

[root@server6 ~]# ip addr show eth02: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 52:54:00:0b:8f:1f brd ff:ff:ff:ff:ff:ff    inet 172.25.12.6/24 brd 172.25.12.255 scope global eth0    inet 172.25.12.100/24 brd 172.25.12.255 scope global secondary eth0    inet6 fe80::5054:ff:fe0b:8f1f/64 scope link        valid_lft forever preferred_lft foreverVIP 地址已经配置成功,crm定义的资源就会传到各个节点,并在各个节点上生效,此时将server6节点转换成standby,VIP就会转移到其它节点上[root@server6 ~]# crmcrm(live)# nodecrm(live)node# standby crm(live)node# cdcrm(live)# statusLast updated: Fri May 26 21:01:33 2017Last change: Fri May 26 21:01:28 2017 via crm_attribute on server6Stack: classic openais (with plugin)Current DC: server8 - partition with quorumVersion: 1.1.10-14.el6-368c7263 Nodes configured, 3 expected votes1 Resources configuredNode server6: standbyOnline: [ server7 server8 ]  #现在运行的就只有server7 server8了 vip    (ocf::heartbeat:IPaddr):    Started server8  #vip被转移到了server8上

查看转移后的vip:

[root@server8 ~]# ip addr show eth02: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 52:54:00:3e:fb:19 brd ff:ff:ff:ff:ff:ff    inet 172.25.12.8/24 brd 172.25.12.255 scope global eth0    inet 172.25.12.200/24 brd 172.25.12.255 scope global secondary eth0    inet6 fe80::5054:ff:fe3e:fb19/64 scope link        valid_lft forever preferred_lft foreverrm node online # 再将节点重新上线,但资源并没有回来,说明它不会做 failback(资源流转)注意:如果集群里只有两个节点时:将其中一个节点停止,资源就会消失而不是转移到另一个节点上,因为当前是两节点的集群,任何一个节点损坏,其它节点就没办法进行投票,status 中就会变成 WITHOUT quorum所以我用了三个节点,当其中一个节点停止时,其他两个还能进行投票当只剩下一个节点时,整个集群就会崩溃,上面的资源全部停掉,我们可以通过忽略投票的方式解决这个问题:crm(live)configure# property no-quorum-policy=ignorecrm(live)configure# commit 

实验:

定义一个高可用集群:1.VIP:172.125.12.2002.配置apache(httpd)服务3.定义约束,保证资源的先后启动顺序,将两个资源运行在同一个节点4.设置fence进行跳电保护

monitor 监控资源:

monitor <rsc> [:<role>] <interval>  [:<timeout>]  监控    哪个资源  哪个角色  多长时间监控一次  监控超时时长是多少

在做实验之前,先把之前的VIP删掉:
删除vip之前,先把它停掉

crm(live)# resource crm(live)resource# status vip    (ocf::heartbeat:IPaddr):    Started crm(live)resource# stop vipcrm(live)resource# status webip  (ocf::heartbeat:IPaddr):    Stopped crm(live)resource# cdcrm(live)# configure crm(live)configure# delete vipcrm(live)configure# commit

定义vip:

crm(live)configure# primitive webip IPaddr params ip=172.25.12.200 op monitor interval=10s timeout=20scrm(live)configure# verifycrm(live)configure# commit crm(live)configure# cdcrm(live)# statusLast updated: Fri May 26 19:00:35 2017Last change: Fri May 26 19:00:27 2017 via cibadmin on server6Stack: classic openais (with plugin)Current DC: server8 - partition with quorumVersion: 1.1.10-14.el6-368c7263 Nodes configured, 3 expected votes1 Resources configuredNode server6: standbyOnline: [ server7 server8 ] webip  (ocf::heartbeat:IPaddr):    Started server7

2.定义apache资源:

先在所有节点都装上apacheyum install httpd不用设置启动,将开机自启关闭crm(live)# configure crm(live)configure# primitive webserver lsb:httpd op monitor interval=30s timeout=15scrm(live)configure# verifycrm(live)configure# commit crm(live)configure# cdcrm(live)# statusLast updated: Fri May 26 19:03:47 2017Last change: Fri May 26 19:03:37 2017 via cibadmin on server6Stack: classic openais (with plugin)Current DC: server8 - partition with quorumVersion: 1.1.10-14.el6-368c7263 Nodes configured, 3 expected votes2 Resources configuredNode server6: standbyOnline: [ server7 server8 ] webip  (ocf::heartbeat:IPaddr):    Started server7  webserver  (lsb:httpd):    Started server8

3.资源捆绑(资源粘滞):

现在两个资源都启动了,但是分散在不同节点上,默认情况下资源是尽可能均衡的运行在各节点上的;两种解决办法:1>. group 组资源,将两个资源定义在一起,做为一组资源而运行;2>.colocation 也可以定义排列约束,也叫协同约束,两个资源必须在一起;第一种比较简单:(1)组的建立:crm(live)configure# group webip_before_webserver webip webservercrm(live)configure# commit (2)组的删除:要删除组的话,必须先在resource里停掉组资源,再在configure里删除掉组资源,这样删除的是资源的捆绑状态,删除完之后,资源还在,不过并不是捆绑了crm(live)# resource crm(live)resource# status Resource Group: webip_before_webserver     vip    (ocf::heartbeat:IPaddr):    Started      webserver  (lsb:httpd):    Started crm(live)resource# stop webip_before_webservercrm(live)resource# cdcrm(live)# configure crm(live)configure# delete webip_before_webservercrm(live)configure# commit crm(live)configure# cdcrm(live)# resource crm(live)resource# status vip    (ocf::heartbeat:IPaddr):    Started  webserver  (lsb:httpd):    Started要删除资源,顺序是一样的,先在resource里停掉资源,再在configure里删除掉资源,第二种比较复杂:crm(live)# configure crm(live)configure# colocation apache inf: webserver webipcrm(live)configure# shownode server6 \    attributes standby="on"node server7node server8primitive webip ocf:heartbeat:IPaddr \    params ip="172.25.12.200" \    op monitor interval="10s" timeout="20s"primitive webserver lsb:httpd \    op monitor interval="30s" timeout="15s"colocation apache inf: webserver webipproperty $id="cib-bootstrap-options" \    dc-version="1.1.10-14.el6-368c726" \    cluster-infrastructure="classic openais (with plugin)" \    expected-quorum-votes="3" \    stonith-enabled="false"crm(live)configure# cdcrm(live)# statusLast updated: Fri May 26 22:37:13 2017Last change: Fri May 26 22:16:30 2017 via cibadmin on server8Stack: classic openais (with plugin)Current DC: server8 - partition with quorumVersion: 1.1.10-14.el6-368c7263 Nodes configured, 3 expected votes2 Resources configuredOnline: [ server6 server7 server8 ] webip  (ocf::heartbeat:IPaddr):    Started server7  webserver  (lsb:httpd):    Started server7 ##两个资源都在7上了

定义顺序约束:

crm(live)configure#order webip_before_webserver mandatory: webip webservercrm(live)configure# commit注:mandatory 代表强制,webip、webserver 这两个资源必须按照我所给定的顺序启动

4.设置fence:

我这里所有的节点用的是虚拟机,软件fence,所有的虚拟机调用的都是物理机(真机)上的fence_virtd.service 服务所以先在物理机上进行fence_virtd的安装:yum install -y fence-virtd-libvirt.x86_64 fence-virtd-multicast.x86_64 fence-virtd.x86_64 配置fence:fence_virtd -cModule search path [/usr/lib64/fence-virt]:Listener module [multicast]:Multicast IP Address [225.0.0.12]:Multicast IP Port [1229]:Interface [br0]:Key File [/etc/cluster/fence_xvm.key]:Backend module [libvirt]:Replace /etc/fence_virt.conf with the above [y/N]? ymkdir /etc/cluster/cd /etc/cluster/用随机数生成key:dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=128 count=1将生成的key发放到各个节点(节点上的目录如果不存在就自己建立):scp fence_xvm.key  root@172.25.12.8:/etc/cluster/scp fence_xvm.key  root@172.25.12.7:/etc/cluster/scp fence_xvm.key  root@172.25.12.6:/etc/cluster/启动fence:systemctl start fence_virtd.service fence占用的是1229端口:netstat -anulp | grep :1229节点配置(三个节点进行一样的配置):yum install -y fence_virt查看:stonith_admin -I是否有 fence_xvm[root@server8 ~]# stonith_admin -I fence_xvm fence_virt fence_pcmk fence_legacy一定要确定stonith是开启状态的,要不然fence不起作用开启stonith:crm(live)configure# property stonith-enabled=truecrm(live)configure# commit 在资源中加入fence:fence默认是与资源分开在不同的节点的,除非只有一个节点

测试fence:

将server7的内核崩溃掉 观察它会不会重启:[root@server7 ~]# echo c > /proc/sysrq-trigger如果自动重启,则fence配置成功实验测试:访问 http://172.25.12.200 就能访问到server7上的http页面将server7 standbycrm(live)node# standby server7crm(live)node# cdcrm(live)# statusLast updated: Mon Jun  5 19:56:38 2017Last change: Mon Jun  5 19:56:26 2017 via crm_attribute on server6Stack: classic openais (with plugin)Current DC: server6 - partition with quorumVersion: 1.1.10-14.el6-368c7263 Nodes configured, 3 expected votes3 Resources configuredNode server7: standbyOnline: [ server6 server8 ] vmfence    (stonith:fence_xvm):    Started server6  Resource Group: webip_before_webserver     vip    (ocf::heartbeat:IPaddr):    Started server8      webserver  (lsb:httpd):    Started server8整个组资源就都转移到了server8上,刷新页面, http://172.25.12.200 访问的时server8上的http页面将server7上线,资源也不会流转回来crm(live)# statusLast updated: Mon Jun  5 19:59:38 2017Last change: Mon Jun  5 19:59:18 2017 via crm_attribute on server7Stack: classic openais (with plugin)Current DC: server6 - partition with quorumVersion: 1.1.10-14.el6-368c7263 Nodes configured, 3 expected votes3 Resources configuredOnline: [ server6 server7 server8 ] vmfence    (stonith:fence_xvm):    Started server6  Resource Group: webip_before_webserver     vip    (ocf::heartbeat:IPaddr):    Started server8      webserver  (lsb:httpd):    Started server8但是,在只有两个节点时,一个节点上运行fence(server6),一个节点上运行资源组(server7),在将server7 standby掉之后,再 online server7 资源会回流,因为它会默认将资源均衡的分配在不同节点上关于资源回流的总结:当资源少于节点数时,资源不会回流,当资源等于节点数时,会发生回流,当资源大于节点数时,会将资源重新分配(不一定是回流)