什么是高可用集群呢?以前我不知道的时候感觉这东西很高端的说,等明白了以后发现高可用集群也就是当一台主机出现故障(包括物理故障和服务故障)后,在很短时间内有其它服务器来接替它的工作,代它响应客户请求,就这么简单。显然我们只知道这个是不够的,我们必须得从内部原理上来理解高可用集群的实现机制。

    信息层:有两个节点的webserver集群,RS1平时响应客户请求,RS2做备用在RS1节点故障的时候来取代它来响应客户请求,但是RS2怎么知道RS1故障了呢?第一种方法:每个几秒钟RS2去检测RS2的状态,如果检测不到RS2就取代它。第二种方法:两台主机用心跳线连接起来,大家相互传递着心跳信息(UDP时间很短所以解析度可以很高),如果在某一刻感受不到R1的心跳信息了,R2就去取代它响应客户请求。 我们知道第一种办法是有缺陷的:假如每5秒探测一下,假如恰好刚探测完R1挂点了,而剩下的5秒就出现了空白,所以高可用时我们一般采用第二种方法,所有集群用心跳线连接,平时在心跳线上传递着健康状态信息,当某台主机出现故障,其它节点随时可以知道它的情况,在逻辑上我们称之为信息层。来个图来表示:  


逻辑上它是信息层,但是我们需要用程序来实现这个功能,而且这个程序运行在每一个节点上,平时他们通过心跳线传递着健康状态信息,常见的软件有:

        1.Heartbeat 
        2.keepalived
        3.ultramonkey
        4.Corosync(openAIS的子项目)

        Heartbeat 是比较常用的软件,Keepalived配置先对比较简单,而ultramonkey好像不怎么常用,Corosync比heartbeat功能还要强大,功能更加丰富。

但是我们需要知道的是信息层仅传递状态信息当服务或主机出现问题它不负责作出任何动作,但是它为其它程序提供了一个API接口,可以供其它程序调用,其它程序通过信息层传递过来的信息,来实现服务的转移,这个软件我们称之为集群资源管理器(Cluster Resource Manager),这个层次在逻辑上称之为资源管理层,实现这个层次的软件常见的有:
        Heartbeat V1(legacy)
        Heartbeat V2(CRM)
        Heartbeat V3(Pacemaker)  + Cluster-glue
        Cman(Cluster manager)
        web界面:RHCS:luci/ricci,SUSE:hawk  

        Heartbeat V1 版也就是legacy版可以提供配置文件haresource.cf来管理服务的转移。
        Heartbeat V2 版名字就叫CRM,它提供了一个监听端口,可以用其它GUI工具来配置管理集群
        Heartbeat V3 版后资源管理器独立出来,而不是作为Heartbeat的一部分了,它的名字叫Pacemaker功能异常强大,还提供了命令行工具来管理集群。
        Cman 是红帽开发的一个资源管理器,在红帽5.X版本上可能遇到,6.x版本后红帽也开始使用强大的pacemaker
        Luci/ricci红帽开发的web界面资源管理器,hawk SUSE他们开发的没接触过


资源管理器根据信息层传递的健康信息来决定节点服务的启动或者停止,总是说资源,下面我们来谈谈资源,资源说白了就是一个完整服务需要用到的子项目 如:要运行web服务,IP地址,http的进程得需要吧,我们把这些子项目称之为集群资源。这些资源也是有类型的,可以分这么几类:

        primitive 也称之为local类型,同一时刻只能运行在一个节点
        group 组资源,组资源运行在一个节点上
        clone 需要在每个Node上运行的资源
        Master-Slave 只能运行在两个节点,一主一从

        资源管理器来决定集群资源的启动与停止,大家又知道资源之间是有相互关系的,比如我们的集群资源有:IP,httpd, 共享存储,显然httpd是需要先挂载共享存储,自己才运行的,否则自己运行起来也毫无意义的,所以我们又对资源定义了约束,常见约束有:

        位置约束 它定义了某个资源流在哪个节点的倾向性,举个例子,三个节点RS1,RS2,RS3,假如RS1挂了,资源应该向哪个节点转移?也就是资源更倾向于谁
        顺序约束 它定义了资源的启动顺序。比如:共享存储要先于httpd启动吧。
        排列约束 它定义了资源间的排列关系。比如:IP资源与httpd资源能不能运行在一起,还是必须在一起。

我们知道资源管理器是来决定各个资源的启动与终止的,有这种情况,RS1,RS2平时用共享存储,平时RS1挂载着共享存储,来响应客户的请求,加入RS1出现了故障,RS不能检测它的状态信息,这个时候假如RS1还能正常工作只不过联系不上RS2了,假如这个时候RS2也挂载了共享存储,当他们同时在共享存储写同一个文件时文件系统会崩溃,而这个后果我们是不能接受的,所以资源转移之前需要先完成其他节点的隔离,隔离一般分为两种:资源隔离和主机隔离。

        资源隔离 就是让被隔离资源不能能再使用这个资源。
        主机隔离 就是直接让改主机关机。

比如出现了这种状况总共五个节点,由于某种原因分为了两个组,一个组3个节点,另一个组两个节点,那到底哪个组中节点启动服务呢?这个时候就要引入quorum,即法定票数。在一个集群中会有一个角色叫DC(事务协调员),它负责统计各整个集群的事务信息,然后形成CIB(集群信息库),然后同步集群信息库到各个节点上。当节点出现分裂后,每个组会推选出DC,由它来统计各个组的法定票数quorum,大于原来总票数的二分之一的一组继续运行服务,小于二分之一的停止服务。每个节点可投的票数可以使不一致的,比如2个节点的一组的某个机器性能异常强大,我们就可以给这个节点多分配几票,而那3个节点都是1票,出现这种分裂,那2个节点运行服务,而那3个节点的组终止服务。集群能否继续存在的一个策略就是看quorum是否大于总票数的二分之一。

我们继续往下进行,资源管理器来决定是否集群是否继续运行下去,如果满足策略,集群会继续运行,这个时候资源管理器会调用资源代理(RA)来实现资源的启动与停止,资源管理本身没有启动资源的能力。那RA又是什么呢?你想想什么东西能启动我们的资源?相信大家都用过,那就是平时在/etc/rc.d/init.d下的服务脚本,它也是RA的一种。我们来看看RA有几种类型:

        LSB(Linux standard base):这个就是我们常见的/etc/rc.d/init.d下的标准Linux脚本
        Heartbeat V1 :Heartbeat V1上提供的脚本
        OCF(Open Cluster Framwork):OCF脚本是比LSB更强大的一种脚本,支持更多的参数
        STONITH:直接终止主机的RA设备,比如电源交换机

资源管理器通过HA隔离故障的节点或者节点上的资源,转移这些资源到其它节点,有些同学开始问了,这个资源怎么转移过去?呵呵,其实是在另一个节点上启动一模一样的资源而已。比如:设置一个VIP,启动本机上的httpd,挂载原来的共享设备,这样整个服务有在一个节点宕机后无痛的重建起来,期间的间隔时间很短,在几秒之间,从而实现了高可用。


我们根据原理来做一个简单的高可用实验吧
规划:
信息层:Heartbeat2
资源管理层:Heartbeat v2 的CRM
资源代理有:IPaddr,httpd
集群资源:IP,httpd服务
配置工具:Heartbeat_gui
VIP:172.16.1.1
RIP1:172.16.1.2
RIP2:172.16.1.3
一、构建前准备:
    1.1 Hostname 与 /etc/hosts解析一致


          rs1上操作:

  1. sed -i '$a\
  2.                 172.16.1.3        rs1.laoguang.me        rs1 ' /etc/hosts
  3. sed -i '$a\
  4.                 172.16.1.4        rs2.laoguang.me        rs2 ' /etc/hosts        
  5. sed -i 's/HOSTNAME.*/HOSTNAME=rs1.laoguang.me/' /etc/sysconfig/network
  6.   hostname rs1.laoguang.me
复制代码
         rs2上操作:
  1. sed -i '$a\
  2.          172.16.1.3  rs1.laoguang.me  rs1 '  /etc/hosts
  3.          sed -i '$a\
  4.          172.16.1.4        rs2.laoguang.me        rs2 ' /etc/hosts
  5. sed -i 's/HOSTNAME.*/HOSTNAME=rs2.laoguang.me/' /etc/sysconfig/network
  6.          hostname rs2.laoguang.me
复制代码

     1.2 建立双机互信


         r1上操作:

  1. ssh-keygen -t rsa -P ""  确认  ##生成认证key 在/root/.ssh下以id_rsa开头,pub的是公钥,另一个是私钥,把公钥拷到另一个主机
  2.          ssh-copy-id -i /root/.ssh/id_rsa.pub rs2   
复制代码
         r2上操作:
  1. ssh-keygen -t rsa -P ""  确认  ##生成认证key 在/root/.ssh下以id_rsa开头,pub的是公钥,另一个是私钥,把公钥拷到另一个主机
  2. ssh-copy-id -i /root/.ssh/id_rsa.pub rs1
复制代码

          ssh连接测试一下,是否输入密码,如果没有测表示成功


        1.3. 安装httpd
          两台机器上安装httpd,并禁止开机启动

  1. yum -y install httpd ##安装Httpd
  2.          chkconfig httpd off  ##不能开机启动,由资源调度器来完成
  3.          ##编辑主页面,echo “<h1>RS1</h1>" > /var/www/html/index.html     ##rs2生成不一样的内空
复制代码
        1.4 同步节点时间
  1. date -s "20121012 10:10" ;ssh rs2 ' date -s "20121012 10:10" '   ##如果有NTP就同步NTP时间
复制代码
二、安装Heartbeat(CRM有中集成),heartbeat_gui(crm配置文件xml格式的,不太容易写,所以有gui来配置)
         2.1 需要的软件包有
  1. heartbeat-2.1.4-9.el5.i386.rpm          ##heartbeat包
  2. heartbeat-devel-2.1.4-9.el5.i386.rpm    ##开发包
  3. heartbeat-gui-2.1.4-9.el5.i386.rpm      ##GUI界面配置工具
  4. heartbeat-pils-2.1.4-10.el5.i386.rpm    ##依赖包
  5. heartbeat-stonith-2.1.4-10.el5.i386.rpm ##devel依赖
  6. libnet-1.1.4-3.el5.i386.rpm             ##也是依赖包
  7. perl-MailTools-1.77-1.el5.noarch.rpm        ##GUI依赖包
复制代码
       2.2 每个节点安装这些软件包
  1. yum -y --nogpgcheck localinstall  *.rpm   ##在软件包目录下操作
复制代码
       2.3 准备配置文件
  1. rpm -ql heartbeat    ##查看生成样例配置文件位置,copy过来
  2.   cd /usr/share/doc/heartbeat-2.1.4/
  3.   cp ha.cf authkeys  /etc/ha.d    ##ha.cf 信息层配置文件  authkeys节点认证文件 
  4.   cd /etc/ha.d
复制代码
        2.4 修改配置文件 ha.cf
  1. crm on    #这个需要添加,指要用heartbeat V2版的资源管理器,v1的用的是haresource.cf配置文件
  2.         #logfile        /var/log/ha-log ##可以定义日志自定义存放位置,默认是/var/log/message
  3.         logfacility     local0  ##日志发送的facility
  4.         keepalive 2         ##发送心跳信息间隔
  5.         deadtime 15         ##多少秒收不到心跳就以为它挂点了
  6.         warntime 5          ##多少秒收不到心跳就发出警告信息
  7.         initdead 120        ##服务启动或者重启多少秒忽略心跳
  8.         udpport        694  ##心跳信息发送端口
  9.         mcast eth0 225.1.2.1 694 1 0 ##多播组,上面有详细的参数解释
  10.         auto_failback on    ##主节点挂点,从节点代替,当主节点又正常了,是否归还资源
  11.         node   rs1.laoguang.me  ##定义集群节点
  12.         node   rs2.laoguang.me  ##定义集群节点
  13.         ping 172.16.0.1     ##最好是一个网关
  14.         compression     bz2 ##是否压缩心跳报文
  15.         compression_threshold 2 ##大于多少才压缩
复制代码
       2.5 编辑authkeys
  1. dd if=/dev/urandom bs=1 count=256 | md5sum ##生成MD5随机数
  2.     619c9925cb10802d49d4b6b09c83ef82
  3. vim authkeys
  4.     auth 3   ##表示用第3种加密方式
复制代码
      2. 6 启动服务
  1.         service heartbeat start 
  2.         ssh rs2 'service heartbeat start'
  3.         ##查看各节点日志是不报错
  4.         tail /etc/log/message
  5.         ##然后查看各节点有没有正常启动
  6.         crm_mon  ##如果显示Online则代表正常
复制代码

     2.7启用GUI界面,配置管理资源

  1. hb_gui  ##启动gui工具
复制代码

三、配置集群资源
       3.1 新建资源组   右击Resources -- Add New item -- group --ID:WebService(这个自定义)

             --Resource ID:WebIP(自定义),选择资源代理IPaddr,添加IP为172.16.1.1--Add 添加


      

     3.2 新建资源httpd   右击WebService组 -- Add New item -- Native -- Resource ID:WebServer(自定义) --

           选择资源代理httpd -- Add 添加


      

       3.3 启动资源 右击WebService组,start 显实 running on 某个节点,表示成功,测试访问VIP
       3.4 停止已运行资源节点上的httpd 看资源能否正常转移,如果能,表示构建成功