首页 > 代码库 > HA集群之CoroSync+Pacemaker浅析及实现

HA集群之CoroSync+Pacemaker浅析及实现

一、CoroSync

   corosync最初只是用来演示OpenAIS集群框架接口规范的一个应用,可以说corosync是OpenAIS的一部分,然而后面的发展超越了官方最初的设想,越来越多的厂商尝试使用corosync作为集群解决方案。如Redhat的RHCS集群套件就是基于corosync实现。

   corosync只提供了message layer(即实现HeartBeat + CCM),而没有直接提供CRM,一般使用Pacemaker进行资源管理。

wKioL1Nt0P3DlQxqAAJOPLEyf9E482.jpg



   OpenAIS是基于SA Forum 标准的集群框架的应用程序接口规范。OpenAIS提供一种集群模式,这个模式包括集群框架,集群成员管理,通信方式,集群监测等,能够为集群软件或工具提供满足AIS标准的集群接口,但是它没有集群资源管理功能,不能独立形成一个集群。

   服务可用性论坛(SA Forum)是一个开放性论坛,它开发并发布AIS规范。AIS是应用接口规范,是用来定义应用程序接口(API)的开放性规范的集合,应用程序作为中间件为应用服务提供一种开放、高移植性的程序接口,是在实现高可用应用过程中是亟需的。使用AIS规范的应用程序接口(API),可以减少应用程序的复杂性和缩短应用程序的开发时间,这些规范的主要目的就是为了提高中间组件可移植性和应用程序的高可用性。


二、Pacemaker

   Pacemaker是由Linux-HA工程的Heartbeat项目中的CRM组件发展而来。 Heartbeat 3开始,Heartbeat 3 按模块把的原来Heartbeat拆分为多个子项目。CRM组件单独由另一独立项目Pacemaker 负责。单独成一个项目之后,Pacemaker以做一个可扩展性高可用集群资源管理器(A scalable High-Availability cluster resource manager)为目标,并同时支持Corosync和Heartbeat 。

   具体组件请看上图。


三、基于corosync实现web高可用基础配置

1.配置主机名

       节点名称很关键,集群每个节的名称都得能互相解析。/etc/hosts中的主机名配置结果必须跟”uname -n”的解析的结果一致。

       node1/node2都添加:

node1示例:
# vim /etc/hosts
172.16.1.11 node1.hoo.com node1
172.16.1.12 node2.hoo.com node2
# ifconfig eth0 172.16.1.11  up
# hostname node1.hoo.com
# uname -n
# vim /etc/sysconfig/network  //重启才生效,source也不生效
hostname=node1.hoo.com


2.时间同步

   node1,node2都配置

# crontab -e
*/5 * * * * /usr/sbin/ntpdate  172.16.0.1 &> /dev/null


3.配置node之间SSH互信

node1:
#ssh-keygen  -t rsa -f ~/.ssh/id_rsa  -P ‘‘
# ssh-copy-id -i .ssh/id_rsa.pub root@node2.hoo.com
node1:
#ssh-keygen  -t rsa -f ~/.ssh/id_rsa  -P ‘‘
# ssh-copy-id -i .ssh/id_rsa.pub root@node1.hoo.com
node1:测试
#  ssh node2.hoo.com ‘date’;date


4.安装httpd

   node1,node2

# yum install httpd -y
# ssh node2 "yum install httpd -y "
# ss -tunl | grep 80
# ssh node2 "ss -tunl | grep 80"

   node1,node2均关闭httpd的自启动,httpd由Pacemaker管理

# chkconfig httpd off
# ckconfig --list httpd  //检查

   node1,node2提供测试页

[root@node1 ~]# echo "node1.hoo.com" >/var/www/html/index.html
[root@node2 ~]# echo "node2.hoo.com" >/var/www/html/index.html


5.安装corosync和pacemaker

   所有节点均安装

# yum install corosync pacemaker -y
# rpm -ql corosync
    //配置目录:/etc/corosync
    //配置模板:/etc/corosync/corosync.conf.example
    //服务器脚本:/etc/rc.d/init.d/corosync


6.安装资源管理器客户端命令接口工具crmsh

  从pacemaker 1.1.8开始,crmsh发展成了一个独立项目,叫crmsh。pacemaker默认不提供命令接口工具,需要单独安装crmsh。

//crmsh依赖pssh
# yum -y install pssh-2.3.1-2.el6.x86_64.rpm
# yum -y install crmsh-1.2.6-4.el6.x86_64.rpm


7.配置主配置文件

[root@node1 ~]# cd /etc/corosync/
[root@node1 corosync]# cp corosync.conf.example corosync.conf
[root@node1 corosync]# vi corosync.conf
compatibility: whitetank   #表示是否兼容0.8之前的版本
totem {        #图腾,定义集群中各节点中通信机制以及参数
        version: 2    #图腾的协议版本号,不修改
        secauth: on   #安全认证功能是否启用,当使用aisexec时,会非常消耗CPU
        threads: 0    #实现认证时的并行线程数,0表示默认配置
        interface {   # 指定在哪个接口发心跳信息,子模块
                ringnumber: 0   #冗余环号,节点有多个网卡是可定义,避免心跳信息成环。
                bindnetaddr: 192.168.1.0   #绑定心跳网段
                mcastaddr: 226.94.8.8      #心跳组播地址
                mcastport: 5405            #心跳组播使用端口
                ttl: 1                     #表示只向外播一次
        }
}
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
                debug: off
        }
}
service {
  ver:  0
  name: pacemaker        #定义corosync启动时同时启动pacemaker
  # use_mgmtd: yes
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
aisexec {     #表示启动ais的功能时,以哪个用户的身份运行
              #这个块可不定义,corosync默认就是以root身份运行的
  user: root
  group: root
}
amf {     # 跟编程接口相关的
        mode: disabled
}


8.生成认证key

   用corosync-keygen生成key时,由于要使用/dev/random生成随机数,因此如果新装的系统操作不多,如果没有足够的熵,狂敲键盘即可,随意敲,敲够即可。(关于random使用键盘敲击产生随机数的原理可自行google)

   实验演示没有足够的熵,这里将采用投机的方式,生产环境,切切不可。

//投机的认证方式
# mv /dev/random /dev/lala
# ln /dev/urandom /dev/random   //将随机数生成器链接至伪随机数生成器
# corosync-keygen    //生成密钥文件,用于节点通信,会生成authkey文件
# rm -rf /dev/random        //删除链接
# mv /dev/lala /dev/random     //还原随机数生成器


9.copy配置给node2

[root@node1 corosync]# scp authkey corosync.conf node2:/etc/corosync/


10.启动corosync

[root@node1 corosync]# service corosync start
[root@node1 corosync]# ssh node2  "service corosync start"


11.检查启动情况

//查看corosync引擎是否正常启动
[root@node1 corosync]# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages
//查看初始化节点通知是否正常发出
[root@node1 corosync]# grep  TOTEM  /var/log/messages
//检查启动过程中是否有错误产生
[root@node1 corosync]# grep ERROR: /var/log/messages | grep -v unpack_resources
//查看pacemaker是否正常启动
[root@node1 corosync]# grep pcmk_startup /var/log/messages


四、基于corosync实现web高可用资源管理

1.crmsh使用介绍

[root@node1 ~]# crm  //进入crmsh
crm(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  #CRM配置,包含资源粘性、资源类型、资源约束等
    node             nodes management  #节点管理
    options          user preferences  #用户偏好
    history          CRM cluster history  #CRM 历史
    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# show     #查看当前配置
crm(live)configure# verify   #检查当前配置语法
crm(live)configure# commit   #提交配置
crm(live)configure# cd
crm(live)# ra   //进入RA(资源代理配置)模式
crm(live)ra# help
This level contains commands which show various information about
the installed resource agents. It is available both at the top
level and at the `configure` level.
Available commands:
    classes          list classes and providers    ##查看RA类型
    list             list RA for a class (and provider)  ##查看指定类型(或提供商)的RA
    meta,info        show meta data for a RA   ##查看RA详细信息
    providers        show providers for a RA and a class  ##查看指定资源的提供商和类型
    help,?           show help (help topics for list of topics)
    end,cd,up        go back one level
    quit,bye,exit    exit the program
crm(live)ra# cd
crm(live)# status   //查看集群状态


2.stonith参数的调整

   禁用stonith功能,corosync默认是启用stonith功能的,没有stonith设备,若直接去配置资源的话,verif会报错,无法commit。

[root@node1 corosync]# crm configure    #进入crm命令行模式配置资源等
crm(live)configure# property    #切换到property目录下,可以用两次tab键进行补全和查看
usage: property [$id=<set_id>] <option>=<value>    # property的用法和格式
crm(live)configure# property stonith-enabled=false   #禁用stonith-enabled
crm(live)configure# verify      #检查设置的属性是否正确
crm(live)configure# commit    #提交
crm(live)configure# show     #查看当前集群的所有配置信息


3.配置web集群

   a).定义IP

crm(live)configure# primitive webip ocf:heartbeat:IPaddr params ip=172.16.1.100
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status

     验证

[root@node1 ~]# ifconfig
发现:eth0:0有IP

     转移资源

[root@node2 ~]# ssh node1 ‘service corosync stop‘
[root@node2 ~]# ssh node1 ‘ifconfig‘
[root@node2 ~]# ifconfig
发现:IP转移

b).配置httpd资源

crm(live)configure# primitive webserver lsb:httpd   //定义资源,资源类型为lsb
crm(live)configure# verify
crm(live)configure# show
crm(live)configure# commit
crm(live)# status
    //资源运行于两个节点上,默认以均衡的方式进行工作,尽可能将不同的资源运行在不同的节点上;


4.资源约束定义

   若想将多个资源运行在同一个节点上,则,做成组,或定义排列约束。

   资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。

   pacemaker共给我们提供了三种资源约束方法:

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

   a).定义组,将资源运行在同一个节点上

//定义资源组webservice
crm(live)configure# help group
crm(live)configure# group webservice webip sebserver
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
crm(live)configure#cd
crm(live)# status

    浏览器访问测试,成功!

   测试:


//让node1离线,测试是否转移:
crm(live)# node
crm(live)node# help standby
crm(live)node# standby node1.hoo.com   //需要使用完整名称
crm(live)configure#cd
crm(live)# status
    //转移到node2
让node1重新上线:
# crm node online node1.hoo.com
# crm status

b).定义排列约束

先删除组:
crm(live)configure#help delete
crm(live)configure# delete webservice
                //无法删除,正在运行
crm(live)configure#cd
crm(live)# resource
crm(live)resource# help
crm(live)resource# help stop
crm(live)resource# stop sebservice
crm(live)resource# status webservice
crm(live)resource#cd
crm(live)configure#delete webservice
crm(live)configure#show
crm(live)configure#commit
crm(live)configure#cd
crm(live)#status
        //负载均衡
//定义排列约束:
crm(live)configure#help colocation
    //role(可省):每一个资源都可以定义很多角色, 每一个资源代理在启动一个资源时,会经过很多阶段,刚准备启动叫premote,启动起来叫start,停止为stop。role在主从模型中用的多点,定义主的启动了,从的才能启动或其它role。
crm(live)configure#colocation webserver_with_webip inf: webserver webip 
            //让webserver与webip在一起
crm(live)configure#verify
crm(live)configure#commit
crm(live)configure#cd
crm(live)#status

c).定义顺序约束

义顺序约束:
crm(live)configure#help order
    //kind类型:Mandatory | Optional | Serialize
           强制,可选,顺序
crm(live)configure# order webip_before_webserver mandatory: webip webserver
            //按启动顺序写,从左至右
crm(live)configure#commit
crm(live)configure#show

d).定义位置约束

crm(live)configure#location webip_on_node2 webip 200: node2.hoo.com                      
     //定义为webip运行在node2的倾向性为200
crm(live)configure#verify
crm(live)configure#cd
crm(live)#status
    //已转移到node2,node1默认为0;

   观察,停掉node2

//停掉node2
# service corosync stop
#crm status
    //资源没有转移到node1上,资源也没有显示了;
    //显示:Current DC: node1.magedu.com - partition WITHOUT QUORUM,表明,node2挂了,node1不具备法定票数,不具备法定票数的默认操作为suicide或stop;suicide全部资源全挂,不显示任何资源
    //两节点集群是一个特殊的集群,当node2挂了,希望资源转移到node1上,此时需要定义全局属性,一旦不具备法定票数时,应该忽略,而不是停止资源:
//上线node2:
#service corosync start
#crm status
    //显示在node2上启动了;
#crm configure
crm(live)configure#property  no-quorum-policy=ignore
crm(live)configure#verify
crm(live)configure#show
crm(live)configure#commit
//观察,停掉node2:
# service corosync stop
#crm status
    资源转移到node1,
    仍显示:Current DC: node1.magedu.com - partition WITHOUT QUORUM
//启动node2:
#service corosync start
#crm status
    //资源转移到node2,node2倾向性大

   node1添加倾向值,观察


crm(live)configure#location webserver_on_node1 webserver 200: node1.hoo.com
            //定义为webserver运行在node1的倾向性为200
crm(live)configure#verify
crm(live)configure#commit
crm(live)configure#show
#crm status
    //此时仍在node2;
//停止node2:
# service corosync stop
#crm status
    //转移到node1;
//上线node2:
#service corosync start
#crm status
    //显示仍在node1;因为node1与node2倾向性一样,最终的倾向性取决于所有倾向性之和;

e).定义资源默认粘性

       资源粘性生效于当前运行节点。资源运行在哪里,即在哪里生效。

crm(live)configure#help
crm(live)configure#edit
    //删除webserver定义的对node1的200的倾向性;
#crm status
        //此时所有服务都运行在node2
//配置粘性:
crm(live)configure#rsc-defaults resource-stickness=100
crm(live)configure#verify
crm(live)configure#show
crm(live)configure#commit
crm(live)configure#cd
crm(live)# status

     测试:


//故障node2:
# service corosync stop
#crm status
    //资源转移到node1;
//上线node2:
#crm status
    //资源没有转移;
    //对当前node的粘性和为200,与对node2的倾向性相同,故留在当前节点
    //粘性定义,无关任一node,只生效当前所运行节点;

 f).定义资源监控

//强行kill掉当前节点httpd
#killall httpd
#ss -tnl
#crm status
    //显示服务照常运行
#service httpd status
       //显示:httpd dead but subsys locked,subsys没有删除
       //kill掉服务,不会自动重启;因为,节点没有故障,所有资源不会转移,默认情况下,pacemaker不会对任何资源进行监控,所以,即便是资源关掉了,只要节点没有故障,资源依然不会转移;要想达到资源转移的目的,得定义监控(monitoer);
//定义监控:
#crm configure
crm(live)configure#cd
crm(live)#status
        //仍然在节点上运行着
crm(live)#resource
crm(live)resource# status
        //仍然显示:start,没有定义监控,意识不到httpd停掉
crm(live)resource# stop webserver
crm(live)resource# stop webip
crm(live)resource# status
crm(live)resource# cleanup webserver
crm(live)resource# cleanup webip
            //如果服务被非法关闭,需要清理,以免后续配置的一些麻烦
crm(live)resource# cd
crm(live)resource# configure
crm(live)configure# help monitor
crm(live)configure# monitor webserver 20s:15s
                                //监控时间:超时时间
crm(live)configure# verify
crm(live)configure#commit
crm(live)configure#cd
crm(live)# resource
crm(live)resource# start webip
crm(live)resource# start webserver
crm(live)resource#cd
crm(live)# status
        //资源在node2上启动;

     测试:

# service httpd stop
# ss -tnl
    //查看日志:
#tail /var/log/cluster/corosync.log
    //查看node2的httpd是否自启:
#ss -tnl
     //启动成功;
//监控的意义:一旦发现服务没启动,就会尝试在当前主机上重启;
//配置ngnix争用端口                                
#service httpd stop  && service ngnix start                                 
#ss -tnl
crm(live)#status
            //重启无法成功,资源转移到node1

   补充:

//定义资源的同时可以定义监控:
crm(live)configure# primitive vip ocf:heartbeat:Ipaddr  params ip=172.16.100.41 op monitor interval=30s timeout=15s op start timeout=20s op stop timeout=20s                            crm(live)resource#show                       
crm(live)configure#delet vip
                    //直接删除上面的定义



补充:CRM中的几个基本概念

1.资源类型

  • primitive(native:基本资源,原始资源

  • group:资源组

  • clone:克隆资源(可同时运行在多个节点上),要先定义为primitive后才能进行clone。主要包含STONITH和集群文件系统(cluster filesystem)

  • master/slave:主从资源,如drdb(下文详细讲解)

2.RA类型

  • Lsb:linux表中库,一般位于/etc/rc.d/init.d/目录下的支持start|stop|status等参数的服务脚本都是lsb

  • ocf:Open cluster Framework,开放集群架构

  • heartbeat:heartbaet V1版本

  • stonith:专为配置stonith设备而用

3.资源粘性

资源粘性表示资源是否倾向于留在当前节点,如果为正整数,表示倾向,负数则会离开,-inf表示正无穷,inf表示正无穷。

4.资源约束

资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。

  • Resource Location(资源位置):定义资源可以、不可以或尽可能在哪些节点上运行;

  • Resource Collocation(资源排列):排列约束用以定义集群资源可以或不可以在某个节点上同时运行;

  • Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序;

定义约束时,还需要指定值。资源安按值管理是集群工作方式的重要组成部分。从迁移资源到决定在已降级集群中停止哪些资源的整个过程是通过以某种方式改变资源值来实现的。值按每个资源来计算,资源值为负的任何节点都无法运行该资源。在计算出资源值后,集群选择值最高的节点。

   有两个特殊值:inf(正无穷,表示只要有可能就要)、-inf(负无穷,表示只要有可能就不要)

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




本文出自 “潇洒哥是先知” 博客,请务必保留此出处http://hoolee.blog.51cto.com/7934938/1409395