美文网首页
HeartBeat高可用配置

HeartBeat高可用配置

作者: liangxifeng833 | 来源:发表于2017-12-21 10:58 被阅读132次

    一.问题简单描述

    • HA即(high available)高可用,又被叫做双机热备;
    • 用于关键性业务。简单理解就是,有2台机器 A 和 B,正常是 A 提供服务,B 待命闲置,当 A 宕机或服务宕掉,会切换至B机器继续提供服务。
    • 当A修复之后,启动后,根据配置A可以继续接管服务;
    • 常见的实现高可用的开源软件有 heartbeatkeepalived
    • 下面我们使用 heartbeat 来做 HA 集群,并且把 apache 服务作为 HA 对应的服务。

    二.系统版本说明(测试)

    • Ubuntu:14.04 64bit (主从均一致)
    • apache: 2.4.12

    三.服务器配置

    • 主服务器 A

      • eth0网卡IP: 192.168.9.145
      • 主机名: dal.api.loc (可以临时修改测试:sudo hostname dal.api.loc)
      • uname -n
        dal.api.loc
        
    • 从服务器 B

      • eth0网卡IP:192.168.9.22
      • 主机名:ljdal.loc
    • 浮动IP: 192.168.9.19 也就是vip(虚拟ip),不需要

    四.先安装apache服务器

    • 因为我的两台测试机已经有apache了,但都是编译安装的,所以再次调整启动脚本如下:(主从主机配置一致)

      sudo ln -s /usr/local/apache/bin/apachectl /etc/init.d/apachectl
      //sysv-rc-conf是ubuntu下管理/etc/init.d/下服务的命令,相当与centos的chkconfig
      sudo sysv-rc-conf apachectl off //将apache设置为非开机自启动
      sudo sysv-rc-conf --list | grep apachectl 
      apachectl    2:off    3:off   4:off   5:off
      
    • A的apache虚拟主机配置

      <VirtualHost 192.168.9.19:8001>
          DocumentRoot "/home/ning/www/lxf_test
          ServerName dal.api.loc
          ErrorLog "/usr/local/apache/logs/bug.ljlj-error_log"
          CustomLog "/usr/local/apache/logs/bug.ljlj-access_log" common
          RewriteEngine on
      </VirtualHost>
      <VirtualHost 192.168.9.149:8001>
          DocumentRoot "/home/ning/www/lxf_test
          ServerName dal.api.loc
          ErrorLog "/usr/local/apache/logs/bug.ljlj-error_log"
          CustomLog "/usr/local/apache/logs/bug.ljlj-access_log" common
          RewriteEngine on
      </VirtualHost>
      
    • 在/home/ning/www/lxf_test/index.html中写入

      Hello I am dal.api.loc主节点
      
    • B的apache虚拟主机配置

      <VirtualHost 192.168.9.19:8001>
        DocumentRoot /home/lxf/www
        ServerName ljdal.loc
        ErrorLog logs/ljdal-error_log
        CustomLog logs/ljdal-access_log common
      </VirtualHost>
      <VirtualHost 192.168.9.22:8001>
        DocumentRoot /home/lxf/www
        ServerName ljdal.loc
        ErrorLog logs/ljdal-error_log
        CustomLog logs/ljdal-access_log common
      </VirtualHost>
      

    五.A/B主机Host配置

    192.168.9.145     dal.api.loc
    192.168.9.22       ljdal.loc 
    

    六.A机安装beartbeat

    sudo apt-get install heartbeat
    

    七.A机最主要的三个文件(如果没有则自行创建)

    /etc/ha.d/authkeys //安全验证
    /etc/ha.d/ha.cf       //基本配置
    /etc/ha.d/haresources //配置浮动ip以及服务
    

    八.A机 authkeys 配置

    • 配置内容:(注意:下面的 HI!代表秘钥,可以自行修改),当然还有其他验证方式可以自行查阅
        auth 2
        2 sha1 HI!
      
    • 修改权限
        sudo chmod 600 authkeys
      

    九.A机配置 ha.cf

    • 配置内容:
      ebugfile /var/log/ha-debug                                                                                                                           
      logfile   /var/log/ha-log 
      keepalive 2
      deadtime 30
      warntime 10
      initdead 120   
      udpport 694 
      logfacility    local0
      ucast eth0 192.168.9.22
      node    dal.api.loc
      node    ljdal.loc
      auto_failback on  
      watchdog /dev/watchdog
      
    • 配置说明

      debugfile /var/log/ha-debug:该文件保存heartbeat的调试信息。
      logfile /var/log/ha-log:heartbeat的日志文件。
      keepalive 2:心跳的时间间隔,默认时间单位为秒s。
      deadtime 30:超出该时间间隔未收到对方节点的心跳,则认为对方已经死亡。
      warntime 10:超出该时间间隔未收到对方节点的心跳,则发出警告并记录到日志中。
      initdead 60:在某系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔,取值至少为deadtime的2倍。
      udpport 694:设置广播通信使用的端口,694为默认使用的端口号。
      ucast eth1 192.168.9.22:设置对方机器心跳检测的网卡和IP。
      auto_failback on:heartbeat的两台主机分别为主节点和从节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给从节点由从节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取资源并取代从节点,否则不取代从节点。

    十.A机haresources 配置

    • 配置信息(该配置信息配置后,代表 )

      dal.api.loc IPaddr::192.168.9.19/24/eth0:0 apachectl
      
    • 以上dal.api.loc代表 主节点,那么配置ha.cf 配置文件中的 ljdal.loc 也就自然成为了 从节点;

    • 192.168.9.19 代表vip(虚拟ip)

    • /24 表示这个IP掩码是255.255.255.0, 表示这个地址的前24(也就是IP前三位十进制)位为网络位

    • eth0:0 代表vip的虚拟网卡设备名

    • apachectl 代表在 /etc/init.d/apachectl 的apache服务启动脚本, 如果有多个服务可以通过空格分割,启动heartbeat的时候,服务从左向右启动,关闭heartbeat的时候,服务从右向左关闭;

    十一.把主节点A上的三个配置文件拷贝到从节点B

    • 基本操作
        # cd /etc/ha.d
        # sudo scp authkeys ha.cf haresources root@192.168.9.22:/etc/ha.d
      
    • 修改从节点B的 ha.cfucast
        ucast eth0 192.168.9.145
      

    十二.启动A节点的 heartbeat

    • 启动顺序是:先主A,后从B,(当然: 先从B,后主A也可以,只不过启动B后vip并没有分配,当启动A后vip分配到A,后续当A挂掉后,B会自动分配vip)
        sudo service heartbeat start
        或/etc/init.d/eartbeat  start
      
    • 启动A成功后,A会自动将vip 192.168.9.19配置到linux系统的 eth0:0网卡上
     ifconfig 
     eth0      Link encap:以太网  硬件地址 8c:89:a5:be:08:03  
             inet 地址:192.168.9.145  广播:192.168.9.255  掩码:255.255.255.0
             inet6 地址: fe80::8e89:a5ff:febe:803/64 Scope:Link
             UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
             接收数据包:188574 错误:0 丢弃:254 过载:0 帧数:0
             发送数据包:108060 错误:0 丢弃:0 过载:0 载波:0
             碰撞:0 发送队列长度:1000 
             接收字节:31455063 (31.4 MB)  发送字节:13805397 (13.8 MB)
     eth0:0    Link encap:以太网  硬件地址 8c:89:a5:be:08:03  
             inet 地址:192.168.9.19  广播:192.168.9.255  掩码:255.255.255.0
             UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
    
    
    • 并且会自动启动apache

      sudo netstat -tunlp | grep 80  
      tcp6       0      0 :::8001                 :::*                    LISTEN      22679/httpd         
      tcp6       0      0 :::80                   :::*                    LISTEN      22679/httpd   
      
    • 这时访问 http://192.168.9.19:8001/

      image.png
    • 查看A的日志 cat /var/log/ha-log

      image.png

    十三.启动B节点的 heartbeat

    • 启动方式与A节点一样,启动后会提示:
        Starting High-Availability services: INFO:  Resource is stopped Done.
      
      以上并不是错误,个人理解:因为这时候,A节点在接管服务,所以这时候B节点不用分配 vip 地址,如果A节点挂了,这个时候B节点会自动将服务接管过来,下面我们继续测试;
    • 查看B节点的ip,并没有 eth0:eth0,因为A节点正常;
      eth0      Link encap:以太网  硬件地址 68:f7:28:62:bf:47  
                inet 地址:192.168.9.22  广播:192.168.9.255  掩码:255.255.255.0
                inet6 地址: fe80::6af7:28ff:fe62:bf47/64 Scope:Link
                UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
                接收数据包:1848852 错误:6 丢弃:0 过载:0 帧数:3
                发送数据包:1509616 错误:0 丢弃:0 过载:0 载波:0
                碰撞:0 发送队列长度:1000 
                接收字节:1479395706 (1.4 GB)  发送字节:751655464 (751.6 MB)
                中断:20 Memory:e1300000-e1320000 
      
      

    十四.模拟A节点挂掉

    • 关闭A节点上 heartbeat

      sudo /etc/init.d/heartbeat stop
      Stopping High-Availability services: Done.
      
    • 登录B节点,查看ip,出现 eth0:eth0 vip,代表接管成功,服务又B提供

      eth0      Link encap:以太网  硬件地址 68:f7:28:62:bf:47  
              inet 地址:192.168.9.22  广播:192.168.9.255  掩码:255.255.255.0
              inet6 地址: fe80::6af7:28ff:fe62:bf47/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
              接收数据包:1848852 错误:6 丢弃:0 过载:0 帧数:3
              发送数据包:1509616 错误:0 丢弃:0 过载:0 载波:0
              碰撞:0 发送队列长度:1000 
              接收字节:1479395706 (1.4 GB)  发送字节:751655464 (751.6 MB)
              中断:20 Memory:e1300000-e1320000 
      
      eth0:0    Link encap:以太网  硬件地址 68:f7:28:62:bf:47  
              inet 地址:192.168.9.19  广播:192.168.9.255  掩码:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
              中断:20 Memory:e1300000-e1320000 
      

      如果在分配vip失败,查看日志:
      cat /var/log/ha-log

      Dec 20 02:00:05 centos.a heartbeat: [2905]: info: glib: ucast: write   socket priority set to IPTOS_LOWDELAY on eth0
      Dec 20 02:00:05 centos.a heartbeat: [2905]: info: glib: ucast: bound   send socket to device: eth0
      Dec 20 02:00:05 centos.a heartbeat: [2905]: ERROR: glib: ucast: error setting option SO_REUSEPORT(w): Protocol not available
      

      以上错误说明是linux版本内核太低,可以使用广播代替 单播,也就是修改ha.cf(A节点与B节点配置一致)

        bcast eth0 # Linux
      
    • 查看B节点的日志 cat /var/log/ha-log

        Dec 19 19:29:20 ljdal.loc heartbeat: [13187]: info: Received shutdown notice from 'dal.api.loc'.
        Dec 19 19:29:20 ljdal.loc heartbeat: [13187]: info: Resources being acquired from dal.api.loc.
        Dec 19 19:29:20 ljdal.loc heartbeat: [13246]: info: acquire local HA resources (standby).
        Dec 19 19:29:20 ljdal.loc heartbeat: [13246]: info: local HA resource acquisition completed (standby).
        Dec 19 19:29:20 ljdal.loc heartbeat: [13187]: info: Standby resource acquisition done [foreign].
        ...
        mach_down(default)[13287]:  2017/12/19_19:29:20 info:     mach_down takeover complete for node dal.api.loc.
      
    • 再次访问:http://192.168.9.19:8001,发现服务被B接管了


      image.png

    十五.注意

    • 因为heartbeat是通过 udpport 694 的传输的,所以在 Centos 下要开启防火墙的 udp 的 694 端口,注意如果防火墙配置不好会导致脑裂(也就是A, B主机通信失败,各自接管资源,防火墙配置:http://m.blog.csdn.net/anonymalias/article/details/8478587

      vim /etc/sysconfig/iptables, 加入如下一行
      -A RH-Firewall-1-INPUT -p udp -s 192.168.11.202 -m udp --dport 694 -j ACCEPT
      

      重启 iptables

        /etc/init.d/iptables restart
      

      查看防火墙配置是否成功,执行命令: iptables -L -n

      fhq.jpg

      关闭selinux

        //临时关闭
        setenforce 0
        getenforce //出现一下信息代表关闭成功
        Permissive
      
      //永久关闭 
       vim /etc/selinux/config
       SELINUX=disabled
      
    • Centos下安装请参考
      http://www.cnblogs.com/liwei0526vip/p/6391833.html

    总结

    • heartbeat 重要做两步,心跳检测资源接管
    • 以上我的例子中的 资源 包含 vip分配apache服务,当A挂掉后(A的apache自动关闭,vip丢失),B立即可接管vip分配apache服务的启动;
    • 当然我们也可以让heartbeat只负责管理 vip分配 ,不负责管理 apache服务,那么我们的 haresources配置文件的内容就变成了:
      centos.a IPaddr::192.168.9.19/24/eth0:0
      
    • apache 虚拟主机配置的域名和linux系统 uname -n的主机名可以不等;
    • /etc/hosts 配置的域名指向完全是为了做资源接管所用;

    参考文章:
    http://www.cnblogs.com/liwei0526vip/p/6391833.html
    http://blog.51cto.com/jerry12356/1855421
    http://m.blog.csdn.net/robinson_0612/article/details/49794263

    相关文章

      网友评论

          本文标题:HeartBeat高可用配置

          本文链接:https://www.haomeiwen.com/subject/iediwxtx.html