一、高可用集群

1、高可用集群的定义

   高可用集群,是指以减少服务中断(如因服务器宕机等引起的服务中断)时间为目的的服务器集群技术。简单的说,集群就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统就是集群的节点。

  高可用集群的出现是为了减少由计算机硬件和软件易错性所带来的损失。它通过保护用户的业务程序对外不间断提供的服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度。如果某个节点失效,它的备援节点将在几秒钟的时间内接管它的职责。因此,对于用户而言,集群永远不会停机。高可用集群软件的主要作用就是实现故障检查和业务切换的自动化。

2、高可用集群的结构

   要想实现、配置高可用集群,就必须要了解高可用集群的结构,从底至上分为三层结构

   先上高可用集群的结构图

corosync+pacemaker实现web集群高可用_第1张图片

   1)Messaging Layer

       信息层,心跳信息传输层,它是运行在每一个主机上的一个进程

       今天要讲的corosync就是运行在这一层的

   2)CRM,Cluster Resources Manager

       集群资源管理器,依赖于各自底层的心跳信息层。之所以有这一层是因为那些非ha_aware软件本身不具备集群高可用能力,才借助于CRM来实现的;而如果一个应用程序自己能够利用底层心跳信息传递层的功能完成集群事务决策的软件就叫ha_aware。

       在这层中,其实还有一层叫做LRM(Local Resource Manager)本地资源管理层,这一层是真正去把CRM层的决策去落实的层次;就好比,CRM层是公司的董事长,LRM就是总经理,CRM负责整个公司的远景规划及战略实施,然后分配给总经理(LRM)去实施,总经理再分摊给下面的各小弟(RA)去完成,这些在上图中也可以直观的表现出来

       pacemaker就是属于这一层的,而pacemaker的配置接口的crm(suse),所以我们安装的时候需要安装crmsh

   3)RA,Resource Agent

       资源代理就是能够接收CRM的调度,用于实现在节点上对某一个资源完成管理的工具,通常是一些脚本

   (1)heartbeat legacy

       heartbeat的传统类型,监听在udp的694端口上

   (2)LSB,linux standard base

       那些在/etc/rc.d/init.d/*的脚本就是属于LSB的

   (3)OCF,Open Cluster Framework

       开放集群架构,那些提供资源代理脚本的组织叫provider,pacemaker就是其中的一个provider

   (4)STONITH

       shoot the other node in the head,这个RA类型主要是做节点隔离的,专为配置stonith设备耐用。

       使用STONITH主要目的就是为了避免由于网络原因,节点之间不能完全通信(比如分为了两部分,左边3台,右边2台),左边的3台能收到各自的心跳信息,右边的2台也可以收到各自的心跳信息,就是左边部分和右边部分收不到各自的心跳信息,因此,它们都各自以为对方故障了,就会各自重新推选出一台做为DC(Designated Coordinator),从而出现了两个集群,这就导致了资源争用;如果恰好双方都往其共享存储写数据,很可能就会导致文件系统崩溃,这种现象就叫做集群分裂(brain-split)。

       为了避免集群分裂,就出现了法定票数(quorum,票数>半数票数的集群成为满足法定票数)这一说法,就是在集群通信故障时,为了避免资源抢占,应该让一方放弃成为集群,具体应该哪方放弃呢?这就是投票的结果了,只有具有法定票数的一方才有资格做为集群,相反的一方就应该退出集群,但它放弃后并不代表服务停止,所以应该让其释放资源,关闭电源。stonith设备就是在这里用的,要让退出集群的设备彻底失效,电源交换机就是这个原理了

       而如果一个集群只有两个节点的话,这又是一种特殊的集群,万一出现集群分裂后,它们双方可能都不会具有法定票数,那结果可想而知,资源不会转移,导致整个资源都故障了,因为没有仲裁设备

       说这么多,就是为了说明下面两个比较重要的概念

       ①、corosync默认启用了stonith功能,而我们要配置的集群并没有stonith设备,因此在配置集群的全局属性时要对其禁用

       ②、当一个集群没有法定票数时,资源是不会正常转移的,当一个节点出现故障时,资源不会正常的转移到正常的节点上,就会导致所有的资源都故障了。所以,应该定义法定票数不足时做忽略而不是停止所有资源

二、前景说明

1、拓扑图

corosync+pacemaker实现web集群高可用_第2张图片

2、服务器说明

   本篇博文主要讲corosync+pacemaker实现web的高可用性,所以,为了配置的方便,使用yum方式安装web和php到一台主机,做为主节点,另一台做为备用

   为了实现web的高可用性,两台web服务器挂载使用NFS文件系统,且NFS与MySQL数据库安装到一台服务器上

   当主节点出现故障的时候,能够实现IP自动转移到备用节点上,这就需要一个虚拟IP来实现流转,这里定义VIP:172.16.7.188

3、系统平台

   全部系统都为centos6.5

4、NFS

   在NFS上创建目录/www,web服务器的网页目录都挂载于此

三、前提准备(两个节点都一样,这里只演示在node1上操作)

1、各节点之间实现互相解析

   所有节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致

[root@node1 ~]# uname -n
node1.shuishui.com
[root@node1 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.7.10 node1.shuishui.com node1
172.16.7.20 node2.shuishui.com node2
[root@node1 ~]# ping node2
PING node2.shuishui.com (172.16.7.20) 56(84) bytes of data.
64 bytes from node2.shuishui.com (172.16.7.20): icmp_seq=1 ttl=64 time=1.41 ms

2、做双机互信

   设定两个节点可以基于密钥进行ssh通信,密码要设为空,否则在节点切换的时候将会失败

[root@node1 ~]# ssh-keygen -t rsa -P ''                                  /生成空密码
[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]   /发送到node2

   验证从node1 ssh到node2不需密码

[root@node1 ~]# ssh 172.16.7.20
Last login: Sun Apr 20 02:37:55 2014 from 172.16.250.87
[root@node2 ~]#

3、时间同步

[root@node1 ~]# ntpdate 172.16.0.1

4、确保网页都被挂载到了NFS上

[root@node1 ~]# curl node1.shuishui.com
web in nfs
[root@node1 ~]# curl node2.shuishui.com
web in nfs

5、手动停止服务并关闭开机自动启动

   加在集群中的服务就交由crm来管理了,不需用户参与

[root@node1 ~]chkconfig httpd off
[root@node1 ~]service httpd stop

四、corosync+pacemaker实现web高可用

1、安装corosync和pacemaker

   因为有依赖关系,所以我们最好使用yum方式安装,前提配置好YUM源

[root@node1 ~]# yum -y install corosync
[root@node1 ~]# yum -y install pacemaker

2、修改corosync的配置文件

   1)corosync安装完成了,提供了配置文件模板,我们只需改名即可使用

[root@node1 ~]# cd /etc/corosync/
[root@node1 corosync]# ls
corosync.conf.example  corosync.conf.example.udpu  service.d  uidgid.d
[root@node1 corosync]# mv corosync.conf.example corosync.conf

   2)修改配置文件,增加service段和aisexec段

totem {
        version: 2
        secauth: off
        threads: 0
        interface {
                ringnumber: 0
                bindnetaddr: 172.16.0.0      #绑定网络地址
                mcastaddr: 230.100.100.7     #心跳信息传递的组播地址
                mcastport: 5405
                ttl: 1
        }
}
logging {
        fileline: off
        to_stderr: no
        to_logfile: yes
        to_syslog: yes
        logfile: /var/log/cluster/corosync.log   /corosync的日志文件
        debug: off
        timestamp: on
        logger_subsys {
                subsys: AMF
                debug: off
        }
}
amf {
        mode: disabled
}
service {
        ver: 0
        name: pacemaker            #定义corosync在启动时自动启动pacemaker
}
aisexec {                          #表示启动corosync的ais功能,以哪个用户的身份运行
        user: root
        group: root
}

3、生成密钥文件

   对于corosync而言,各节点之间通信需要安全认证,所以需要安全密钥,生成后会自动保存至当前目录下,命名为authkey,权限为400

[root@node1 corosync]# corosync-keygen
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/random.
Press keys on your keyboard to generate entropy.
Press keys on your keyboard to generate entropy (bits = 272).

   生成的密钥文件是1024字节的,但是在这个生成密钥的过程中,系统会去调用/etc/random中的随机数,如果熵池中的随机数不够用,就会提示让我们逛敲键盘以来弥补随机数的不足,直到生成密钥。如果对安全不是要求太高,此过程可以使用伪随机数,伪随机数是有规律的,所以可能会被找到规律从而破解密钥,慎用。

   经过痛苦的敲键盘,终于成生了我们想要的密钥,接下来就是把密钥和刚才配置的corosync.conf复制到node2上

[root@node1 corosync]# ls
authkey  corosync.conf  corosync.conf.example.udpu  service.d  uidgid.d
[root@node1 corosync]# scp -p corosync.conf authkey  node2:/etc/corosync/

4、安装pacemaker的配置接口crmsh

   RHEL自6.4起不再提供集群的命令行配置工具crmsh,转而使用pcs;如果想继续使用crm命令,必须下载相关的程序包自行安装才可。crmsh依赖于pssh,因此需要一并下载,安装过程中还会有其它的依赖关系,所以使用yum方式进行安装

[root@node1 ~]# yum -y install pssh-2.3.1-2.el6.x86_64.rpm crmsh-1.2.6-4.el6.x86_64.rpm

5、启动corosync并查看相关信息

[root@node1 ~]# service corosync start
Starting Corosync Cluster Engine (corosync):               [  OK  ]

(1)查看corosync引擎是否正常启动:

[root@node1 ~]# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
Apr 20 12:07:38 corosync [MAIN  ] Corosync Cluster Engine ('1.4.1'): started and ready to provide service.
Apr 20 12:07:38 corosync [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.

(2)查看初始化成员节点通知是否正常发出:

[root@node1 ~]# grep  TOTEM  /var/log/cluster/corosync.log
Apr 20 12:07:38 corosync [TOTEM ] Initializing transport (UDP/IP Multicast).
Apr 20 12:07:38 corosync [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
Apr 20 12:07:38 corosync [TOTEM ] The network interface [172.16.7.10] is now up.
Apr 20 12:07:39 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
Apr 20 12:12:42 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.

   如果最下面显示的是一行,那说明是错误的,你还需启动node2的corosync

(3)检查启动过程中是否有错误产生(此处可忽略)。

[root@node1 ~]# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources
Apr 20 12:07:38 corosync [pcmk  ] ERROR: process_ais_conf: You have configured a cluster using the Pacemaker plugin for Corosync. The plugin is not supported in this environment and will be removed very soon.
Apr 20 12:07:38 corosync [pcmk  ] ERROR: process_ais_conf:  Please see Chapter 8 of 'Clusters from Scratch' (http://www.clusterlabs.org/doc) for details on using Pacemaker with CMAN

(4)查看pacemaker是否正常启动

[root@node1 ~]# grep pcmk_startup /var/log/cluster/corosync.log
Apr 20 12:07:39 corosync [pcmk  ] info: pcmk_startup: CRM: Initialized
Apr 20 12:07:39 corosync [pcmk  ] Logging: Initialized pcmk_startup
Apr 20 12:07:39 corosync [pcmk  ] info: pcmk_startup: Maximum core file size is: 18446744073709551615
Apr 20 12:07:39 corosync [pcmk  ] info: pcmk_startup: Service: 9
Apr 20 12:07:39 corosync [pcmk  ] info: pcmk_startup: Local hostname: node1.shuishui.com

(5)查看集群状态

[root@node1 ~]# crm_mon
Last updated: Sun Apr 20 12:20:24 2014
Last change: Sun Apr 20 12:12:42 2014 via crmd on node1.shuishui.com
Stack: classic openais (with plugin)
Current DC: node1.shuishui.com - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
0 Resources configured
Online: [ node1.shuishui.com node2.shuishui.com ]

   从集群状态信息中我们可以看到,节点node1和node2都在线,node1是DC且拥有法定票数,但是0 Rewources configured,集群中没有任何资源,所以接下来的任务就是使用pacemaker配置资源

6、crmsh使用简单说明,有迷糊的地方就help吧

[root@node1 ~]# crm              #进入CRM
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              #进入configure
crm(live)configure#               #两下tab可显示所有命令
?                  erase              ms                 rsc_template
bye                exit               node               rsc_ticket
cd                 fencing_topology   op_defaults        rsctest
cib                filter             order              save
cibstatus          graph              primitive          schema
clone              group              property           show
collocation        help               ptest              simulate
colocation         history            quit               template
commit             load               ra                 up
default-timeouts   location           refresh            upgrade
delete             master             rename             user
edit               modgroup           role               verify
end                monitor            rsc_defaults       xml
crm(live)configure# help           #在configure下获取帮助
Commands for resources are:
- `primitive`
- `monitor`
- `group`
- `clone`
- `ms`/`master` (master-slave)
In order to streamline large configurations, it is possible to
define a template which can later be referenced in primitives:
- `rsc_template`
In that case the primitive inherits all attributes defined in the
template.
There are three types of constraints:
crm(live)configure# help primitive            #查看primitive命令的使用格式
Usage:
...............
        primitive  {[:[:]]|@