理论部分:http://caduke.blog.51cto.com/3365689/1545211

实验环境:

    node1.yh.com:172.16.100.15/16/eth0(vmnet1)

    node2.yh.com:172.16.100.16/16/eth0(vmnet1)

    win7:172.16.100.101/16(vmnet1,ping node)

实验目的:

    使用haresource(heatbeat V1)格式的RA和crm牌(heatbeat V2)的CRM进行高可用实验

准备工作:

    1、各个节点的uname -n与hostname要一样,最好修改/etc/sysconfig/network主机名

    2、在/etc/hosts文件中写入所有HA节点的IP和对应主机名。

    3、使用ntp服务器和crontab来保证各节点的时间保持一致。

        /etc/ntp.conf的配置如下即可:

        driftfile /var/lib/ntp/drift    
        restrict 127.0.0.1      
        restrict 172.16.0.0 mask 255.255.0.0      
        server    127.127.1.0    # local clock      
        fudge    127.127.1.0 stratum 10   
        includefile /etc/ntp/crypto/pw      
        keys /etc/ntp/keys

        # crontab -l    
         */2 * * * * /usr/sbin/ntpdate 172.16.100.15

    4、建立双机互信:(2个节点都做)

        # ssh-keygen -t rsa -P ''    
        #ssh-copy-id -i .ssh/id_rsa.pub root@node2.yh.com(节点2执行node1.yh.com)      
        # date ; ssh node2.yh.com  'date'

    5、安装用于测试的服务,比如httpd,但是一定保证开机不能自动启动

        # chkconfig httpd off

    6、解决依赖关系:

        制作rpm包时,解决依赖关系需要安装如下程序包。    
        # yum -y install glib2-devel libnet-devel libtool-ltdl-devel net-snmp-devel bzip2-devel libxml2-devel openhpi-libs gnutls-devel python-devel

        安装制作好的rpm包时,解决依赖关系需要安装如下程序包。    
        #yum -y install perl-MailTools net-snmp-libs

        # yum install PyXML libnet ipvsadm –y

        # rpm -ivh  heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-gui-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm

实验配置:

    软件安装好以后,所有的配置模板都在/usr/share/doc/heart-2.1.4中,需要复制。

    # cp /usr/share/doc/heartbeat-2.1.4/{authkeys,ha.cf,haresources} /etc/ha.d/


修改防止主机随意加入的密钥:

    /etc/ha.d/authkeys:

        auth 1去掉前面的注释符,然后表示使用第几个验证方式。这里选择使用第二种。然后使用openssl产生一个加密字符串放在sha1后面

        #1 crc    
         2 sha1 19d7faa993912bf4      
        #3 md5 Hello!

       #openssl rand -hex 8    
         19d7faa993912bf4

        # chmod 600 authkeys


修改主配置文件:

   /etc/ha.d/ha.cf(下面只需要注意不带注释符的即可)

        logfile        /var/log/ha-log如果不使用messages日志,可以单独使用日志文件    
       #keepalive 2 心跳时间,默认单位是秒。如果使用毫秒,必须加单位      
       #deadtime  30 死亡时间,多长时间联系不到,就认为它挂了。不能小于keepalive      
       #warntime  10 警告时间,多久没有收到心跳了      
       #initdead  20 一个节点时不成立的,所以这里是等待第二个节点上线的时间。      
       #udpport   694基于单播或多播传递心跳的端口      
       #baud     19200指定串行线缆的速率的      
       #bcast    eth0广播方式传递心跳      
        mcast eth0 225.0.0.1 694 1 0在哪个网卡上监听哪个组播IP的组播端口,后面默认即可。组播地址如果是多人实验环境,那么最好不要使用一个组播IP。225不要动,其他可以改,但也是有范围的。    
                如果在多块网卡上都提供多播信息,后面的2个值必须配置      
                第一个是TTL,表示只向下传递几跳。这里表示只能传递1次,避免循环      
                第二个是loop,0表示不能循环。      
                最好的方式      
                mcast eth0 225.4.40.3 694 1 0      
       #ucast eth0 192.168.1.2单播,后面跟的是对方的IP地址。这种方式不好。如果有多个,需要些多个。由于配置是有所变动的,所以并不是直接复制的。      
        auto_failback on是不是自动执行故障转回的。当node1为主节点,但是挂掉后,再恢复时,会自动恢复其主节点地位。      
       #stonith baytech /etc/ha.d/conf/stonith.baytech      
                命令行中stonith -L 可以列出所有支持stonith的RA资源代理。      
                每个不同的设备都有自己的配置参数。      
                可以使用meatware。      
                这里是实验环境也可以不使用。但有些环境必须使用才能启动服务。      
       #watchdog /dev/watchdog帮助主进程监视子进程的。如果子进程挂掉,可以自动重启,但是要启动,必须保证内核能够支持这个虚拟设备。如果自己收不到自己的心跳信息,就会将自己的主机重启。


        node   key3这里的key3是主机名,而且这个主机名必须和uname -n一样。    
                而且写出所有的节点。      
                node node1.yh.com      
                node node2.yh.com      
        ping 172.16.100.101这里是ping node.后面还可以ping组

        compression     bz2使用什么压缩    
        compression_threshold 2当报文大于多少时才压缩,否则浪费CPU。


修改资源配置文件:

    /etc/ha.d/haresource:

        这里面的内容定义了资源优先在哪个节点上启动,所以只需要定义一个节点即可。

        node1.yh.com 172.16.100.10/16/eth0 httpd

        这里定义了IP/netmask/配置网卡,httpd服务。当然还可以有文件系统,比如nfs

             node1.yh.com 172.16.100.10/16/eth0 Filesystem::172.16.100.1:/web/htdocs::nfs(选用)

        文件系统的定义方法:Filesystem::nfsIP:/目录::本地挂载目录::文件系统类型

    注意:OCF的RA相比LSB格式的脚本功能更加强大,但如果使用IPaddr2格式的RA在使用ifconfig命令时看不到的,因为他使用的是ip addr设置的。

复制配置文件:

    # scp ha.cf authkeys haresources  172.16.100.16:/etc/ha.d

启动heartbeat服务:

    # service heartbeat start

    # ssh node2.yh.com ‘service heartbeat start’(有必要这样做)

    #  ss -lanpu | grep 694(已经被监听)

    # 在节点上查看httpd服务器的状态。


使用node1.yh.com成为备用节点:

    # /usr/lib64/heartbeat/hb_standby(node1上执行,然后node2称为了主节点)

    # /usr/lib64/heartbeat/hb_tabkeover(node1上执行,node1继续成为主节点)

      /usr/lib64/heartbeat/目录下还有其他命令,比如情况arp缓存的命令。

    当然,也可以使node1直接宕机,使得node2成为主节点。

    但由于配置了auto_failback,node1恢复正常时,node1会再次成为主节点。


使用图形界面的配置工具:

   1、/etc/ha.d/ha.cf中添加’crm on或者是’crm respawn’,并复制到node2.yh.com,

       然后重启两个节点的服务。这时/etc/ha.d/haresource中的配置便失效了。

    2、由于打开图形界面需要用户hacluster,所以需要给此用户加一个密码。

       而且这个用户只能使用这个密码在这个主机上登录,并不是通用的。

       # passwd hacluster

    3、启动图形界面

       # hb_gui &


配置图形界面下的高可用服务:

    Connection→输入密码→OK

  使用Resources添加单个资源:

    增加IP资源:

    右击Reasource→Add New Item→native→Resource ID:webip、

    Type:IPaddr(选中任意选项,输入ip进行快速搜索,属于LSB格式,ifconfig查看。

              IPaddr2必须使用ip addr查看,且ipaddr2与lvs有冲突)

    Parameters:ip输入172.16.100.10,Add parameters增加参数可以选择网卡nic,

         cidr_netmask选择使用子网掩码;broadcast选择使用广播地址;

         lvs_support选择添加lvs支持,然后Value中添加true

    在最下面也可以定克隆和主从资源。

    最后Add。

    选中资源webip,然后在右侧栏中有Attributes有target_role,

       其值started表示集群启动时就启动资源。stopped表示集群启动时不启动资源。

   增加文件系统资源:

    Resource ID:webstore

    device:    172.16.100.1:/web/htdocs(nfs资源)

    directory:  /web/htdocs(节点上挂载点)

    fstype:    nfs(文件系统类型,当然也可以添加集群文件系统ocfs2)

   增加web服务:

    Resource ID:webserver

    httpd选中即可点击Add。


定义资源约束:

    定义好上面的资源后,会发现各个服务是分别运行在不同的节点上的,且无法改变。

    这时就需要使用group来将其绑定,但是只有组资源是无法加入现有资源的。

    所以定义资源约束是最好的选择。

  定义排列约束colocations:使得web资源都在同一个节点运行

    Constraints→colocations→Item Type:colocation→ID:webip_with_webstore

    From:webip   To:webstore   Score:INFINITY

      在下面的描述中可以看到,此配置时以To:webstore为准的。

      1:确保webip和webstore在相同的节点上。

      2:假如webstore不能配置在某节点上,webip同样不能配置在那个节点上。

      3:假如webip不能配置在某个节点上,webstore不会受到影响。

    Constraints→colocations→Item Type:colocation→ID:webstore_with_webserver

    From:webstore  To:webserver  Score:INFINITY

  定义顺序约束Orders:使得web资源启动按照IP→Filesystem→httpd

    Constraints→Order→Item Type:order→ID:webstore_after_webip

    From:webstore  To:webip 

      描述:此时已webip为准。

      1、webip先启动,webstore后启动。

      2、假如webip不能启动,webstore也不用启动。

      3、先停止webstore,再停止webip。

      4、假如不能停止webstore,那么webip也不能停止。


定义资源组group:

    Resources→Item Type:group→ID:mysqlservice→Resource ID:mysqlip

    Type:IPaddr2     ip:172.16.100.11    nic:eth0

    mysqlservice→Item Type:native→Resource ID:mysqlstore

    Type:Filesystem

    device  :172.16.100.1:/mysqldata

    directory:/mydata/

    fstype  :nfs

    mysqlservice→Item Type:native→Resource ID:mysqlserver

    Type:mysqld(使用lsb格式即可)


定义nfs服务:

    在定义web服务时,只需要将nfs输出目录输出即可。但是定义mysql服务却又诸多限制。

    mysql服务一般不会使用nfs,因为nfs是文件级别的文件系统,性能差等

    一般mysql会使用SAN块设备,廉价的可以是drbd分布式块。

    但这里为了实验,也可以使用nfs。但需要注意以下几点:

    1、mysql用户的ID、GID包括nfs设备在内的节点都要相同

    2、/etc/exports文件:/mysqldata  172.16.0.0/16(rw,async,no_root_squash)

    3、在某一个节点挂载并初始化mysql后,需要将的属主、属组都改为mysql

       # chown –R  mysql.mysql  /mysqldata/data(mysql产生的目录)

    4、如果还有其他服务使用nfs,不能重启nfs,需要重新输出即可

       # exportfs  -arv

  

将以上HA节点当做lvs的分发器的实现:

    1、在任意节点将ipvsadm规则做出来,复制到各HA节点,并清空运行规则

       当然其他配置照旧,比如打开路由转发等。

       # service ipvsadm save

       # scp /etc/sysconfig/ipvsadm node2.yh.com:/etc/sysconfig

       # ipvsadm –C

    2、添加ipvs的group:

        在普通的LVS配置时,需要手动配置VIP和ipvs规则,所以这里仍然是分开的:

        ipvs提供规则,VIP需要单独配置

      ipvsservice→ipvsIP→ipvsIP:

       IPaddr2→ip:172.16.100.11,nic:eth0,cidr_netmask:32,lvs_support:true

      ipvsservice→ipvsrules→ipvsrules:

       ipvsadm添加即可

关于LSB脚本:

    如果手动写LSB脚本,那么这个状态必须有固定输出格式:

    running正在运行

    stopped已经停止,不能写为not running,因为不识别not。


将以上面的ipvs高可用使用ldirectord进行高可用:

说明:在生产环境中,如果不是自己提供监控脚本,ipvsadm的实用性并不高。因为ipvs不能实时监测后端RS的健康状态,所以后续又出现了ldirectord项目,它可以针对不同的后端服务采用不同的监测手段,而不是简单的探测RS的存活状态。比如提供http、https、imap、mysql、smtp等监测手段。所以相比ipvsadm,ldirectord更为实用。

    但是ldirector只是调用ipvs,并提供健康状态监测。

    ldirectord可以脱离heartbeat高可用服务单独使用,且由于其在/etc/init.d/ldirectord有服务脚本,所以可以当做服务启动、关闭。

    在配置ldirector高可用时,类似于ipvs的高可用,依然需要在heartbeat配置VIP,然后ldirectord提供规则。


安装:# rpm -ivh heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm

查看:# rpm -ql heartbeat-ldirectord

        /etc/ha.d/resource.d/ldirectord  这是一个OCF的RA代理脚本

        /etc/init.d/ldirectord可以直接使用service 启动、停止

        /etc/logrotate.d/ldirectord日志滚动工具

        /usr/sbin/ldirectord

        /usr/share/doc/heartbeat-ldirectord-2.1.4

        /usr/share/doc/heartbeat-ldirectord-2.1.4/COPYING

        /usr/share/doc/heartbeat-ldirectord-2.1.4/README

        /usr/share/man/man8/ldirectord.8.gz帮助文档

        /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf配置样例,需要复制到/etc/ha.d下修改。

 

配置:

1、# cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d

2、# vim /etc/ha.d/ldirectord.cf


# Global Directives   全局配置

checktimeout=3        为防止RS负载过大等情况造成短时间失联,允许多等待的时间

checkinterval=1       检查健康状况的时间间隔

#fallback=127.0.0.1:80

autoreload=yes        改动配置文件时,程序会自动重新载入配置,无需手动干预

logfile="/var/log/ldirectord.log" 在本机上使用单独的日志

#logfile="local0"         syslog或rsyslog的日志

#emailalert="admin@x.y.z" 出现问题时接受报警信息的Email

#emailalertfreq=3600      邮件发送频率

#emailalertstatus=all     发送最详细的错误信息

quiescent=yes             以静默模式工作。下面有详细解释。


# Sample for an http virtual service定义单个服务的虚拟主机。

virtual=172.16.100.8:80   定VIP:port,而下面的内容不能顶头写

        real=172.16.100.1:80 gate  10

                          定义RS的IP:port,lvs模式为DR,权重为10。权重默认为1,未写

        real=172.16.100.172:80 gate 11

        fallback=127.0.0.1:80 gate

                          当所有RS宕机时,提供ldirectord服务的主机返回的错误信息

        service=http      定义健康状态监测时具体检测哪项服务。详见下面解释

        checktype=negotiate  定义检测RS健康状态时的机制。详见下面解释

        request=".test.html" 测试请求RS的httpd服务的哪个页面。此lvs服务的全局配置

        receive="OK"         使用正则表达式检测".test.html"中是否包含"OK"

        virtualhost=172.16.100.8   

                             如果VIP提供的是多个虚拟主机,则在这里写。

                             由于这里是测试环境,所以直接写VIP。

                             当只有一个virtualhost时,后面不能再加一个假的

                             而且后面的request和receive可以删除

        scheduler=wrr        调度方法

        #persistent=600      定义持久连接时间

        #netmask=255.255.255.255

        protocol=tcp         见详解 

        checkport=80


详解:

    quiescent = yes|no

        当为yes时,即使RS宕掉,ldirectord依然会基于持久连接模板向发送数据。

        所以需要改为no。或者采用以下方法清除持久连接模板中的数据:

            echo 1 > /proc/sys/net/ipv4/vs/expire_quiescent_template

    protocol = tcp|upd|fwm

        fwm为防火墙标记,需要使用iptables的mangle表的PREROUTING进行打标记。

        后面“virtual=1”就是表示使用防火墙标记。

    checktype = connect|external|negotiate|off|ping|checktimeout

        connect:纯粹的连接测试

        external:调用自己的检测脚本。需指定路径checkcommand=/path/to/script

        negotiate:自动协商。

    service = dns|ftp|http|https||imap|imaps|ldap|mysql|nntp|none|oracle|pgsql|

              pop|pops|radius|simpletcp|sip|smtp

        当checktype = negotiate时,会使用以上服务进行检测。


所有ldirectord节点的其他配置:

1、# scp /etc/ha.d/ldirectord.cf node2.yh.com:/etc/ha.d

2、# service httpd start

        实验环境时,各ldirectord节点httpd需要启动,且提供的错误页面最好不同。


使用CRM图形界面配置ldirectord的服务:

    以上内容只是为ldirectord提供了一个ipvs规则和其运行环境。

    真正使ldirectord服务变的高可用,就需要将其加入HA服务。否则只能单机使用。

具体步骤:

    Ressources→Item Type:group→ID:ldirectordcluster→Resource ID:webip

    Type→IPaddr2→ip:172.16.100.11,nic:eth0,cidr_netmask:32,lvs_support:true

    

    ldirectordcluster→Item Type:native→Resource ID:ldirectord

    Type→ldirectord(ocf)→configfile:/etc/ha.d/ldirectord.cf

后端RS上的操作:

    1、定义arp_ignore和arp_announce

    2、添加VIP

    3、添加主机路由,使得从RS的eth0接口出去的数据包源IP是VIP