pacemaker:心脏起搏器,是一个集群资源管理器。它实现最大可用性群集服务的节点和资源级别故障检测和恢复使用首选集群基础设施提供的消息和成员能力。

pacemaker是个资源管理器,不提供心跳信息。

heartbeat3.0拆分后的组成部分:

    heartbeat:将原来的消息通信层独立为heartbeat项目,新的heartbeat只负责维护集群各节点的信息以及他们之前通信。

    cluster-glue:相当于一个中间层,它用来将heartbeat和pacemaker关联起来,主要包含2个部分,即LRM和STONITH。

    resource-agent:用来控制服务启停,监控服务器状态的脚本集合

    pacemaker:也就是cluster resource manager(CRM),用来管理整个HA的控制中心,客户端通过pacemaker来配置管理监控整个集群。


pacemaker特点

    主机和应用程序级别的故障检测和恢复

    几乎支持任何冗余配置

    同时支持多种集群配置模式

    配置策略处理法定人数损失

    支持应用启动/关机顺序

    支持多种模式的应用程序

    可以测试任何故障或集群的群集状态


pacemaker内部结构

600px-Stack.png

群集组件说明

    stonithd:心跳系统

    lrmd:本地资源管理守护进程。它提供了一个通用的接口支持的资源类型,直接调用资源代理。

    pengine:策略引擎。

    cib:群集信息库。

    crmd:群集资源管理守护进程。主要消息代理的PEnine和LRM,还选举一个领导者DC统筹活动的集群

    openais:OpenAIS的消息和成员层

    heartbeat:心跳消息层,OpenAIS的一种替代

    ccm:共识群集成员,心跳成员层

功能

CIB使用XML表示集群中所有资源的配置和当前状态,CIB的内容会被自动同步整个集群中,使用PEngine计算集群的理想状态,生成指令列表,然后输送给DC。

pacemaker集群中所有节点选举的DC节点作为主决策节点。如果当选DC的节点宕机,它会在所有的节点上迅速建立一个新的DC。DC将PEngine生成的策略传递给其他节点上的LRMD或CRMD通过集群消息传递基础结构。

当集群中有节点宕机PEngine重新计算理想策略。在某些情况下,可能有必要关闭节点,以保护共享数据或完成的资源回收,因为,pacemaker配置了stonithd设备。STONITH可以将其它节点爆头,通常是实现与远程电源断开。pacemaker会将STONITH设备配置为资源保存在CIB中,使他们可以更容易地监测资源失败或宕机。


实验操作centos6.X

拓扑图

wKiom1S02QTQcxOvAAFJSxjKOk0076.jpg


1、安装配置

yum install corosync pacemaker -y

cd /etc/corosync/

cp corosync.conf.example corosync.conf

2、修改配置文件

vim corosync.conf 
compatibility: whitetank 
totem {    #指定心跳信息传递的参数 
        version: 2                  
        secauth: off            #是否开启安全认证 
        threads: 0              #开启线程的个数 
        interface { 
                ringnumber: 0    #标识一个通信接口 
                bindnetaddr: 10.10.0.0  #指定心跳报文传输的网段  
                mcastaddr: 226.94.1.1    #指定心跳报文发送的组播地址 
                mcastport: 5405      #指定端口 
                ttl: 1                #生命周期,跨3层的话需要加大一点,不然对方接收不到,最大255 
        } 

logging { 
        fileline: off 
        to_stderr: no    #是否发送标准错误输出 
        to_logfile: yes  #是否记录到日志文件中 
        to_syslog: no    #是否记录到syslog,二者选其一即可 
        logfile: /var/log/cluster/corosync.log    #日志文件的路径 
        debug: off        #是否开启调试信息 
        timestamp: on    #日志中是否协商时间戳 
        logger_subsys { 
                subsys: AMF    #是否记录AMF 
                debug: off    #是否开启AMF的调试信息 
        } 

amf { 
        mode: disabled        #AMF的状态 

service {              #corosync启动时也将pacemaker启动 
    ver:  0 
    name: pacemaker 

aisexec {              #指定ais的用户和组的身份 
    user:  root 
    group:  root 
}


3、生成密钥

corosync-keygen

ll /etc/corosync/    #保证authkey的权限为400

4、拷贝到node2

scp -p authkey corosync.conf node2:/etc/corosync/

5、自从RH6之后就不再提供pacemaker的命令行工具,我们需要单独安装crmsh,它依赖pssh,另外可以使用pcs代替crmsh,下面会单独讲pcs使用。

rpm -ivh crmsh-2.1-1.6.i686.rpm pssh-2.3.1-4.1.i686.rpm

6、两个节点都需要启动corosync

service corosync start

7、查看corosync引擎是否正常启动 

grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log 

#查看初始化成员节点通知是否正常发出 

grep  TOTEM /var/log/cluster/corosync.log  

#查看pacemaker是否正常启动

grep pcmk_startup /var/log/cluster/corosync.log   
#检查启动过程中是否有错误产生 

 grep ERROR: /var/log/cluster/corosync.log  

#在node2上启动服务并查看日志信息

ssh node2 'service corosync start'  

8、crm_mon  #查看集群状态

crm status    #查看集群状态


9、接下来要给两个节点定一下资源配置,所有的操作都是在crm命令下进行的。

#crm

crm(live) # 进入crm模式并且按两下Tab键补全
?            cd            configure    exit          history       options     ra          site        up      
bye         cib         end         help        node        quit        resource    status  
crm(live) # help  查看每个命令的意思
This is crm shell, a Pacemaker  command   line interface.
Available commands:
     cib              manage shadow CIBs
     resource         resources management
     configure        CRM cluster configuration
     node             nodes management
     options          user preferences
     history            CRM cluster  history
     site             Geo-cluster support
     ra               resource agents information center
     status           show cluster status
     help,?           show help (help topics  for   list of topics)
     end, cd ,up        go back one level
     quit,bye, exit      exit   the program
crm(live) # configure
crm(live)configure #
?                  colocation          exit                 load               op_defaults        refresh            save               user
bye                commit             fencing_topology   location           order              rename             schema             verify
cd                   default-timeouts   filter             master             primitive          role               show               xml
cib                delete             graph              modgroup           property           rsc_defaults       simulate       
cibstatus          edit               group              monitor            ptest              rsc_template       template       
clone              end                help               ms                 quit               rsc_ticket         up             
collocation        erase               history              node               ra                 rsctest            upgrade        
crm(live)configure # order help 还可以用这种方式查看命令使用格式
usage: order < id > {kind|<score>}: <rsc>[:<action>] <rsc>[:<action>] ...

        [symmetrical=<



10、定义全局配置并提交

crm(live)#configure property stonith-enabled=false 禁止stonith设备正常情况下不应该禁止但是我们这里不考虑stonith设备

crm(live)#configure property no-quorum-policy=ignore 忽略法定投票因为节点就两个不可能超过半数票

crm(live)# configure  必须在configure目录下执行

crm(live)configure# verify

crm(live)configure# commit

INFO: apparently there is nothing to commit

INFO: try changing something first

资源类型:

添加资源之前必须要知道当前集群所支持的RA类型,corosync支持heartbeatLSB和ocf等类型的资源代理。目前较为常用的类型为LSB和OCF两类,STONITH类专为stonith设备而用。

查看当前集群所支持的RA类型列表

crm(live)# ra 在资源列表目录下

crm(live)ra# classes    查看资源的类型

lsb
ocf / heartbeat pacemaker
service

stonith

查看OCF类型下的资源代理

 crm(live)ra# list ocf

CTDB           ClusterMon     Dummy          Filesystem     HealthCPU      HealthSMART    IPaddr         IPaddr2        IPsrcaddr      LVM            MailTo
Route          SendArp        Squid          Stateful       SysInfo        SystemHealth   VirtualDomain  Xinetd         apache         conntrackd     controld
dhcpd          ethmonitor     exportfs       mysql          mysql-proxy    named          nfsserver      nginx          pgsql           ping             pingd

postfix        remote         rsyncd         rsyslog        slapd          symlink        tomcat 

crm(live)ra# list ocf heartbeat

CTDB           Dummy          Filesystem     IPaddr         IPaddr2        IPsrcaddr      LVM            MailTo         Route          SendArp        Squid
VirtualDomain  Xinetd         apache         conntrackd     dhcpd          ethmonitor     exportfs       mysql          mysql-proxy    named          nfsserver
nginx          pgsql          postfix        rsyncd         rsyslog        slapd           symlink          tomcat     

11、为集群添加资源

IP资源名:node1,IP类型:ocfheartbeat:IPaddr IP:10.10.0.11,启动监控程序,检测到失败后的方式为重启服务。

crm(live)# configure

crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=10.10.0.11 op monitor interval=30s timeout=20s on-fail=restart

crm(live)configure# verify     #校验

crm(live)configure# commit


12、定义本地资源httpd服务

crm(live)configureprimitive httpd lsb:httpd


13、为了避免资源分裂,可以把IP和服务加入到一个组内

crm(live)configuregroup webgroup vip httpd


14、查看IP是否生效

ifconfig

用浏览器查看服务是否正常


15、停掉node1,看是否node2能够正常提供服务,这是实现高可用最重要的一步。

crm(live)# node standby 让当前节点自动成为备用节点

crm(live)# status


16、资源粘性

我们有时候需要在资源因为节点故障转移到其它节点后,即便原来的节点恢复正常也禁止资源再次流转回来。这可以通过定义资源的黏性(stickiness)来实现。在创建资源时或在创建资源后,都可以指定指定资源黏性

资源黏性值范围及其作用:

等于0:这是默认选项。资源放置在系统中的最适合位置,这意味着当负载能力“较好”或较差的节点变得可用时才转移资源。此选项的作用基本等同于自动故障回复,只是资源可能会转移到非之前活动的节点上;

大于0:资源更愿意留在当前位置,但是如果有更合适的节点可用时会移动。值越高表示资源越愿意留在当前位置;
   小于0:资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置;
   INFINITY:如果不是因节点不适合运行资源(节点关机、节点待机、达到migration-threshold 或配置更改)而强制资源转移,资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复;
   -INFINITY:资源总是移离当前位置;
手动设置资源的默认黏性值:
# crm configure rsc_defaults resource-stickiness=100
 
资源约束
  资源vip和httpd有可能会分别运行于两个节点上,这对于通过此IP提供Web服务的应用来说是不成立的,即两者资源必须同时运行在某节点上,由此可见,即便集群拥有所有必需资源,但它可能还无法进行正确处理。资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。
pacemaker共给我们提供了三种资源约束方法:

1)Resource Location(资源位置):定义资源可以、不可以或尽可能在哪些节点上运行;
    2)Resource Collocation(资源排列):用以定义集群资源可以或不可以在某个节点上同时运行;
    3)Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序;

定义约束时,还需要指定分数。各种分数是集群工作方式的重要组成部分。其实,从迁移资源到决定在已降级集群中停止哪些资源的整个过程是通过以某种方式修改分数来实现的。分数按每个资源来计算,资源分数为负的任何节点都无法运行该资源。在计算出资源分数后,集群选择分数最高的节点。INFINITY(无穷大) 目前定义为 1,000,000。加减无穷大遵循以下3个基本规则:

1)任何值 + 无穷大 = 无穷大
    2)任何值 - 无穷大 = -无穷大
    3)无穷大 - 无穷大 = -无穷大

定义资源约束时,也可以指定每个约束的分数。分数表示指派给此资源约束的值。分数较高的约束先应用,分数较低的约束后应用。通过使用不同的分数为既定资源创建更多位置约束,可以指定资源要故障转移至的目标节点的顺序。

对于前述的vip和httpd可能会运行于不同节点的问题,我们还可以通过以下方法来解决:
# crm configure colocation httpd-with-vip INFINITY: httpd vip

我们还可以设置资源启动顺序,vip首先运行,再运行httpd
# crm configure order httpd-after-vip mandatory: vip httpd

此外,某些时候我们可能希望在正常时服务总能在某个性能较强的节点上运行,这可以通过位置约束来实现:
# crm configure location httpd-on-node1 httpd rule 200: #uname eq node1.test.com
这条命令实现了将httpd约束在node1上,且指定其分数为200;


增加nfs资源

1、配置NFS服务器

mkdir -pv /web

vim /etc/exports

/web/    10.10.0.0/12(ro,aysnc)

echo '<h1>cluster nfs server</h1>' > /web/index.html

service rpcbind start

service nfs start

showmount -e 10.10.21.221

2、节点挂载测试

mount -t nfs 10.10.21.221:/web /mnt

ll /mnt

total 4

-rw-r--r-- 1 root root 28 Jan 29 17:14 index.html

mount

umount /mnt

3、配置vip、httpd、nfs

crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=10.10.0.221 nic=eth0:0 cidr_netmask=12 op monitor interval=15m timeout=30s on-fail=restart

crm(live)configure# verify

crm(live)configure# commit

crm(live)configure# primitive httpd lsb:httpd

crm(live)configure# verify

crm(live)configure# commit

crm(live)configure# primitive nfs ocf:heartbeat:Filesystem params device=10.10.0.221:/web directory=/var/www/html fstype=nfs op monitor timeout=20s

property default-action-timeout=60

crm(live)configure# verify

crm(live)configure# commit

WARNING: nfs: default timeout 20s for start is smaller than the advised 60

WARNING: nfs: default timeout 20s for stop is smaller than the advised 60

出现WARNING的时候,运行下面这条命令

crm(live)configure# property default-action-timeout=60

crm(live)configure# show

node node1.test.com \

        attributes standby=off

node node2.test.com \

        attributes standby=off

primitive httpd lsb:httpd

primitive nfs Filesystem \

        params device="10.10.0.221:/web" directory="/var/www/html" fstype=nfs

primitive vip IPaddr \

        params ip=10.10.0.221 nic="eth0:0" cidr_netmask=12 \

        op monitor interval=15m timeout=30s on-fail=restart

property cib-bootstrap-options: \

        dc-version=1.1.11-97629de \

        cluster-infrastructure="classic openais (with plugin)" \

        expected-quorum-votes=2 \

        stonith-enabled=false \

        no-quorum-policy=ignore \

        last-lrm-refresh=1422524733 \

        default-action-timeout=60


4、定义组资源

这三个资源不在同一节点上。可以定义一个组来使资源在同一节点上。

crm(live)configure# group webservie vip nfs httpd

crm(live)configure# verify

crm(live)configure# commit

配置顺序约束

crm(live)configure# order vip_then_nfs_then_httpd inf: vip nfs httpd         

crm(live)configure# verify

crm(live)configure# commit

#表示启动顺序依次是vip、nfs、httpd


5、定义网络ping node监控

(1).配置ping node主资源

crm(live)configure# primitive pnode ocf:pacemaker:ping params host_list=10.10.0.1 multiplier=100 op monitor interval=10s timeout=60s         

crm(live)configure# verify

crm(live)configure# commit

#host_list:是网关或者可以ping通的其他节点,可以使用多个。

#multiplier:表示如果集群中的节点可以ping通,那么节点的分数就会乘以这个参数指定值来进行累加。比如node1,ping通一次就是1*100,2 次就是2*100,依次类推

(2).配置pnode的克隆资源

crm(live)configure# clone cl_pnode pnode

crm(live)configure# verify

crm(live)configure# commit

(3).配置ping node失败的时候,资源的故障转移

crm(live)configure# location nfs_on_ping webservie rule -inf: not_defined pingd or pingd number:lte 0 

crm(live)configure# verify

crm(live)configure# commit

#表示如果由ping node得出的分数小于等于0 或者某个节点没有定义域ping node 相关的属性的话,那么就进行资源的转移。