> CentOS > CentOS教程 >

CentOS 6.5 Corosync+pacemaker实现httpd服务的高可用

  • Corosync:它属于OpenAIS(开放式应用接口规范)中的一个项目corosync一版本中本身不具备投票功能,到了corosync 2.0之后引入了votequorum子系统也具备了投票功能了,如果我们用的是1版本的,又需要用到票数做决策时那该如何是好呢;当然,在红帽上把cman + corosync结合起来用,但是早期cman跟pacemaker没法结合起来,如果想用pacemaker又想用投票功能的话,那就把cman当成corosync的插件来用,把cman当成corodync的投票功能,当然,这里结合了两个了Messaging Lader;Corosync目前有两个主流的版本:一个是2系列的,另一个是1系列的稳定版;2版本和1版本差别很大,1版本不具有投票功能,2版本之后引入了votequorum后支持投票功能了;

    OpenAIS自从诞生之后,红帽就基于这个规范研发了一个高可用集群的解决方案叫cman,并为cman提供了rgmangaer作为资源管理器,并且容合conga全生命周期的管理接口形成了RHCS; Conrosync是从OpenAIS这个大项目中分支出来的一个项目,而Pacemaker是heartbeat v3版本中分裂出来专门用于提供高可用集群CRM的组件,功能十分强大, Coreosync在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等,Corosync可以提供一个完整的HA功能,Corosync是未来的发展方向,在以后的新项目里,一般采用Corosync,而heartbeat_gui可以提供很好的HA管理功能,可以实现图形化的管理。 Pacemaker是一个集群管理器。它利用首选集群基础设施(OpenAIS 或heartbeat)提供的消息和成员能力,由辅助节点和系统进行故障检测和回收,实现性群集服务(亦称资源)的高可用性。corosync+pacemaker:在配置corosync时最好具有三个以上的节点,并且节点个数为奇数个,如果使用偶数个节点的话也没关系,只是要关闭不具有法定票数的决策策略功能;实现过程: 1、双机互信需要设置好,hosts文件需要解析好,时间要同步

    1.# vim /etc/hosts
    2.172.16.27.1 node1.tanxw.com
    3.172.16.27.2 node2.tanxw.com
    4.# ssh-keygen -t rsa -P ‘’
    5.# ssh-copy-id -i id_rsa.pub node2.tanxw.com

     

    2、安装corosync,这里我们用ansible来安装,要使用ansible在一台主机上操作多台主机得需要事先安装ansible,那这里我们就先说说安装和配置使用ansible,安装ansible也可以用yum来安装,不过需要解决依赖关系:

    1.# yum -y install python-jinja2   解决依赖关系
    2.# yum -y install ansible
    3.安装好之后再去/etc/ansible下配置两个节点的hostname
    4.# vim /etc/ansible/hosts  把里面的内容全都注释掉,加下面你的节点hostname
    5.[corosync]
    6.node1.tanxw.com
    7.node2.tanxw.com

     

    保存退出! 我们这里使用172.16.27.0这台主机安装ansible,操作172.16.27.1和.2这两台主机,测试一下:

    1.[root@node0 ~]# ansible corosync -m shell -a 'date'
    2.node2.tanxw.com | success | rc=0 >>
    3.Wed Apr 23 17:24:34 CST 2014
    4.node1.tanxw.com | success | rc=0 >>
    5.Wed Apr 23 17:24:34 CST 2014     --测试成功,成功时显示的颜色为绿色

     

    3、时间同步,需要事先配置好一台时间服务器,然后在crontab -e中输入:

    1.# crontab -e
    2.*/5 * * * * /usr/sbin/ntpdte 172.16.27.0 &> /dev/null   表示每隔5分钟同步一次

    好,准备工作做好了之后就可以安装corosync了,使用ansible查看两个节点是否已经安装了corosync:

     

    01.[root@node0 ~]# ansible corosync -m shell -a 'rpm -q corosync'
    02.node2.tanxw.com | FAILED | rc=1 >>
    03.package corosync is not installed
    04.node1.tanxw.com | FAILED | rc=1 >>
    05.package corosync is not installed
    06.# ansible corosync -m yum -a "name=corosync state=present"  全部输出显示为绿色说明安装成功
    07.[root@node0 ~]# ansible corosync -m shell -a 'rpm -q corosync'  再查看一下corosync的安装版本
    08.node2.tanxw.com | success | rc=0 >>
    09.corosync-1.4.1-17.el6.x86_64
    10.node1.tanxw.com | success | rc=0 >>
    11.corosync-1.4.1-17.el6.x86_64
    12.# cp /etc/corosync/corosync.conf.example /etc/corosync.conf  复制一份corosync的样本配置文件
    13.# vim /etc/corosync/corosync.conf   编辑配置文件修改如下内容
    14.compatibility: whitetank    #这个表示是否兼容0.8之前的版本
    15.totem {    #图腾,这是用来定义集群中各节点中是怎么通信的以及参数
    16.        version: 2        #图腾的协议版本,它是种协议,协议是有版本的,它是用于各节点互相通信的协议,这是定义版本的
    17.        secauth: on        #表示安全认证功能是否启用的
    18.        threads: 0        #实现认证时的并行线程数,0表示默认配置
    19.        interface {        # 指定在哪个接口上发心跳信息的,它是个子模块
    20.                ringnumber: 0    #环号码,集群中有多个节点,每个节点上有多个网卡,别的节点可以接收,同时我们本机的别一块网卡也可以接收,为了避免这些信息在这样的环状发送,因此要为这个网卡定义一个唯一的环号码,以避免心跳信息环发送。
    21.                bindnetaddr: 192.168.1.1        # 绑定的网络地址
    22.                mcastaddr: 226.94.1.1    #多播地址,一对多通信
    23.                mcastport: 5405        # 多播端口
    24.                ttl: 1        # 表示只向外播一次
    25.        }
    26.}
    27.logging {        # 跟日志相关
    28.        fileline: off
    29.        to_stderr: no        # 表示是否需要发送到错误输出
    30.        to_logfile: yes        #是不是送给日志文件
    31.        to_syslog: no        #是不是送给系统日志
    32.        logfile: /var/log/cluster/corosync.log        #日志文件路径
    33.        debug: off        #是否启动调试
    34.        timestamp: on        #日志是否需要记录时间戳
    35.        logger_subsys {        #日志的子系统
    36.                subsys: AMF
    37.                debug: off
    38.        }
    39.}
    40.amf {        # 跟编程接口相关的
    41.        mode: disabled
    42.}
    43.service {  #定义一个服务来启动pacemaker
    44.    ver: 0    #定义版本
    45.    name: pacemaker  #这个表示启动corosync时会自动启动pacemaker
    46.}
    47.aisexec {  #表示启动ais的功能时以哪个用户的身份去运行的
    48.    user: root
    49.    group: root  #其实这个块定义不定义都可以,corosync默认就是以root身份去运行的
    50.}

    这里我们改一个随机数墒池,再把配置好的corosync的配置和认证文件复制到另一个节点上去:

    1.# mv /dev/random /dev/m
    2.# ln /dev/urandom /dev/random  如果这把这个随机数墒池改了可以会产生随机数不够用,这个就要敲击键盘给这个墒池一些随机数;生成完这个key后把链接删除,再把墒池改回来;不过这样改可以会有点为安全,不过做测试的应该不要紧;
    3.# corosync-keygen
    4.# rm -rf /dev/random
    5.# mv /dev/m /dev/random
    6.对于corosync而言,我们各节点之间通信时必须要能够实现安全认证的,要用到一个密钥文件:
    7.# corosync-keygen    # 生成密钥文件,用于双机通信互信,会生成一authkey的文件
    8.# scp authkey corosync.conf node2.tanxw.com:/etc/corosync/   在配置好的节点上把这两个文件复制给另一个节点上的corosync的配置文件中去

     

    安装pacemaker

    # ansible corosync -m yum -a “name=pacemaker state=present”

    我们要想使用pacemaker配置的话需要安装一个pacemaker的接口,它的这个程序的接口叫crmshell,它在新版本的pacemaker已经被独立出来了,不再是pacemaker的组成部分了,早期装上pacemaker就会自带有crmshell,因此要想用crmshell的话得去安装crmshell,而安装crmshell又依赖于pssh的相关包,因此得安装这两个组件,(这里的这两个包是自己制件的),哪个节点配置就安装在哪个节点上就可以了,也无需两个节点都安装这两个包:

    1.crmsh-1.2.6-4.el6.x86_64.rpm
    2.pssh-2.3.1-2.el6.x86_64.rpm
    3.# yum -y install crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm

    一切都OK了之后就可以启动服务了,两个节点都需要启动:

    1.crmsh-1.2.6-4.el6.x86_64.rpm
    2.pssh-2.3.1-2.el6.x86_64.rpm
    3.# yum -y install crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm

    wKioL1NXyRmBSNL3AABYjROFGpk958.jpg

    wKioL1NXySOyAA8hAABgi5IYFDw826.jpg

    在这里crm是一个很复杂的命令,可以在命令行直接输入crm进入crm的命令行模式:# crm

    那在这里,我们如何去配置一个资源呢,虽然它跟heartbeat略有区别,但是概念基本上是一样的,下面我们就来配置一个web资源吧! 由于我们的corosync默认是启用stonith功能的,但是我们这里没有stonith设备,如果我们直接去配置资源的话,由于没有stonith功能,所以资源的切换并不会完成,所以要禁用stonith功能,但禁用stonoith需要我们去配置集群的全局stonith属性,全局属性是对所有的节点都生效;

    01.[root@node1 corosync]# crm configure    #进入crm命令行模式配置资源等
    02.crm(live)configure# property    #切换到property目录下,可以用两次tab键进行补全和查看
    03.usage: property [$id=<set_id>] <option>=<value>    # property的用法和格式
    04.crm(live)configure# property stonith-enabled=false        #禁用stonith-enabled
    05.crm(live)configure# verify        #检查设置的属性是否正确
    06.crm(live)configure# commit    #检查没问题就可以提交了
    07.crm(live)configure# show        #查看当前集群的所有配置信息
    08.node node1.tanxw.com
    09.node node2.tanxw.com        #两个节点
    10.property $id="cib-bootstrap-options" \   
    11.    dc-version="1.1.10-14.el6-368c726" \    #DC的版本号
    12.    cluster-infrastructure="classic openais (with plugin)" \    #集群的基础架构,使用的是OpenAIS,插件式的
    13.    expected-quorum-votes="2" \        #期望节点的票数
    14.    stonith-enabled="false"        #禁用stonith功能
    15.crm(live)configure#

     

    查看一下节点的运行状态:

    wKioL1NXyVSxH83_AAFMy2iN2yY039.jpg

    要注意:如果一个节点挂了,就不拥有法定票数了,那资源是不会切换的 集群的策略有几种: stopped :停止服务 ignore :忽略,继续运行 freeze :冻结,已经连接的请求继续响应,新的请求不再响应 suicide :自杀,将服务kill掉 这里我们定义一个web资源,那如何去定义一个资源,在定义web资源之前我们先启动测试我们的web服务是否正常,并以它们提供两个不同的页面以示区别:

    wKioL1NXybrg9zzjAACOM3dpSaE083.jpgwKiom1NXygLAtObIAACoXZ3v-4g562.jpg

    再进入crm定义我们所需要的资源吧!

    01.crm(live)# configure
    02.crm(live)configure# primitive webip ocf:heartbeat:IPaddr params ip=172.16.27.88
    03.crm(live)configure# verify
    04.crm(live)configure# commit
    05.crm(live)configure# show
    06.node node1.tanxw.com
    07.node node2.tanxw.com
    08.primitive webip ocf:heartbeat:IPaddr \
    09.    params ip="172.16.27.88"
    10.property $id="cib-bootstrap-options" \
    11.    dc-version="1.1.10-14.el6-368c726" \
    12.    cluster-infrastructure="classic openais (with plugin)" \
    13.    expected-quorum-votes="2" \
    14.    stonith-enabled="false"
    15.crm(live)configure#

    wKiom1NXyl_jJi7eAAIiaeSV140988.jpg

    wKioL1NXym2zahYQAALzkd6oiDk304.jpg

     

    定义一个组,把之后定义的资源加到这个组里面去: # group weservice webip webserver

    wKioL1NXypiRQkNhAAMNOsmOv_M296.jpg

    好了,我们在页面上测试一下,现在是运行在node1上,我们看看是不是node1上页面的内容,当然,真实的环境中我们的两个web的页面内容都应该是一样的,这里为了以示区别才设置两个不一样的页面内容的: wKiom1NXyt7CMUfgAACf77nHDc8708.jpg 让node1节点离线: wKioL1NXyuDDZnjwAAH10_rL48M476.jpg

    wKioL1NXyxXjDu2yAADmyyGOhf8189.jpg

     

    好了,这种功能我们也完成了,如果让node1上线它也不会转回的,因为我们没有定义它的倾向性和故障转回,所以node1回来就回来吧,而服务依然运行在node2上; crm(live)node# online node1.tanxw.com 让node1从新上线

     

    结束:

    到这里我们算是配置和运行起来了服务了,当然,还需要别的功能我们还可以添加,比如说排列约束,倾向性定义,或者添回别的资源进来都是可以的等等都可以一一添加理来,定义我们所需要的高可用集群,后续还会更新有关这方面的知识,希望大神门多多指定,在此先谢谢你的关注了!










(责任编辑:IT)