zoukankan      html  css  js  c++  java
  • Heartbeat实现web服务器高可用

    一、Heartbeat概述:

      Heartbeat的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。

    Heartbeat-3.X版本以后被分为了4个模块,这些安装包都可以从官网:
      http://www.linux-ha.org/wiki/Downloads下载得到:
    目前的这些版本是:
      ClusterLabs-resource-agents-v3.9.2-0-ge261943.tar.gz #集群实验资源代理
      Heartbeat-3-0-7e3a82377fa8.tar.bz2 # 心跳主程序包
      pacemaker-1.1.9-1512.el6.src.rpm # 起搏器
      Reusable-Cluster-Components-glue--glue-1.0.9.tar.bz2 #可重复使用的群集组件

    扩展: 谁管理着TCP/UDP公共服务的端口定义
      IANA 就是指(Internet Assigned Numbers Authority) ,Internet号分配的机构。负责对IP地址分配规划以及对TCP/UDP公共服务的端口定义。
      IANA的所有任务可以大致分为三个类型:
        一、域名。IANA管理DNS域名根和.int,.arpa域名以及IDN(国际化域名)资源。
        二、数字资源。IANA协调全球IP和AS(自治系统)号并将它们提供给各区域Internet注册机构。
          注: AS自治系统号,是BGP路由协议中的号。
        三、协议分配。IANA与各标准化组织一同管理协议编号系统。
      官网:http://www.iana.org/

    二、实战:使用Heartbeat实现web服务器高可用

    主机名 ip地址  系统  角色
    docker-01 192.168.1.220 CentOS Linux release 7.4.1708 (Core)  主
    docker-02 192.168.1.221 CentOS Linux release 7.4.1708 (Core)  备
    docker-03 192.168.1.222 CentOS Linux release 7.4.1708 (Core) NFS

    2.准备工作:docker-01、docker-02

    [root@docker-01 ha.d]# hostname
    docker-01
    [root@docker-02 ha.d]# hostname
    docker-02
    [root@docker-02 ha.d]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.1.220   docker-01
    192.168.1.221   docker-02
    关防火墙,关掉selinux
    [root@docker-02 ha.d]# setenforce 0
    [root@docker-02 ha.d]# systemctl stop firewalld && systemctl disable firewalld

    3、配置docker-03为NFS服务器,提供存储资源  

    [root@docker-03 ~]# yum install nfs-utils rpcbind
    [root@docker-03 ~]# mkdir /wwwdir
    [root@docker-03 ~]# echo 'Heartbeat web test'> /wwwdir/index.html
    [root@docker-03 ~]# cat /wwwdir/index.html
    Heartbeat web test
    [root@docker-03 ~]# vi /etc/exports
    /wwwdir 192.168.1.0/24(rw)
    [root@docker-03 ~]# chmod 777 -R /wwwdir/
    [root@docker-03 ~]# ll -d /wwwdir/
    drwxrwxrwx 2 root root 24 2月  25 20:11 /wwwdir/
    [root@docker-03 ~]# systemctl start nfs
    [root@docker-03 ~]# systemctl enable nfs
    Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
    [root@docker-03 ~]# showmount -e
    Export list for docker-03:
    /wwwdir 192.168.1.0/24

    4、docker-01、docker-02测试nfs 存储挂载并安装httpd web服务器(基本操作是一致)

    [root@docker-01 ~]# yum install nfs-utils httpd -y
    [root@docker-01 ~]# systemctl start nfs
    [root@docker-01 ~]# showmount -e 192.168.1.222
    Export list for 192.168.1.222:
    /wwwdir 192.168.1.0/24
    [root@docker-01 ~]# mount -t nfs 192.168.1.222:/wwwdir /var/www/html/
    [root@docker-01 ~]# df -h
    文件系统                 容量  已用  可用 已用% 挂载点
    /dev/mapper/centos-root   19G  2.1G   17G   11% /
    devtmpfs                 226M     0  226M    0% /dev
    tmpfs                    237M     0  237M    0% /dev/shm
    tmpfs                    237M  8.7M  228M    4% /run
    tmpfs                    237M     0  237M    0% /sys/fs/cgroup
    /dev/sda1                247M  105M  142M   43% /boot
    tmpfs                     48M     0   48M    0% /run/user/0
    192.168.1.222:/wwwdir     19G  1.9G   17G   10% /var/www/html
    [root@docker-01 ~]# systemctl restart httpd
    [root@docker-01 ~]# systemctl enable httpd
    Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
    #卸载资源:后期这些资源通过heartbeat直接加载
    [root@docker-01 ~]# umount /var/www/html/
    [root@docker-01 ~]# systemctl stop httpd
    [root@docker-01 ~]# systemctl disable httpd

    docker-01安装heartbeat

    同步时间

    [root@docker-01 ~]# crontab -l
    */5 * * * *     /usr/sbin/ntpdate ntp1.aliyun.com
    [root@docker-02 ~]# crontab -l
    */5 * * * *     /usr/sbin/ntpdate ntp1.aliyun.com

    配置主机间ssh互信,免密钥认证

    5、开始安装

    • 安装基础环境包:
    yum install gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-devel bzip2 bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel asciidoc
    • 创建用户和组
    groupadd haclient
    useradd -g haclient hacluster
    • 下载软件包:Reusable-Components-glue、resource-agents、heartbeat
    http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/958e11be8686.tar.bz2
    http://hg.linux-ha.org/glue/archive/0a7add1d9996.tar.bz2
    https://github.com/ClusterLabs/resource-agents/archive/v3.9.6.tar.gz
    • 安装glue
    tar xf 0a7add1d9996.tar.bz2
    cd Reusable-Cluster-Components-glue--0a7add1d9996/
    ./autogen.sh
    ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
    make && make install
    echo $?
    cd ..
    • 安装Resource Agents
    tar xf v3.9.6.tar.gz
    cd resource-agents-3.9.6/
    ./autogen.sh 
    ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
    make && make install
    echo $?
    cd ..
    • 安装HeartBeat
    tar xf 958e11be8686.tar.bz2
    cd Heartbeat-3-0-958e11be8686/
    ./bootstrap
    export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib"
    ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
    make && make install
    echo $?
    • 配置网卡支持插件文件
    mkdir -pv /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/
    cp /usr/lib/ocf/lib/heartbeat/ocf-* /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/

    #注意:一般启动时会报错因为 ping和ucast这些配置都需要插件支持 需要将lib64下面的插件软连接到lib目录 才不会抛出异常

    ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec/* /usr/local/heartbeat/lib/heartbeat/plugins/RAExec/
    ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins/

    #以上在docker-01上安装完成,在docker-02上执行以上同样的步骤

    配置heartbeat

    #拷贝三个模版配置文件到 /usr/local/heartbeat/etc/ha.d 目录下 

    cp doc/{ha.cf,haresources,authkeys} /usr/local/heartbeat/etc/ha.d/

    配置ha.cf配置文件

    #该配置文件用于配置 心跳的核心配置

    [root@docker-01 ~]# cat /usr/local/heartbeat/etc/ha.d/ha.cf
    debugfile /var/log/ha-debug  #表示调试的日志文件 一般测试建议开启
    logfile /var/log/ha-log  #表示系统的的日志文件路径
    logfacility     local0  #表示使用系统日志与上面只能开启一个
    keepalive 2  #主备之间的心跳间隔时间单位:s
    deadtime 30  #表示如果连接对方30s还无法连接,表示节点死亡需要考虑vip转移
    warntime 10  #表示10s时间未收到心跳时发出警告日志
    initdead 120  #有时机器启动后需要一段时间网卡才能正常工作 需要预留一定的时间后,再开始判断心跳检测
    udpport 694  #多播的udp端口
    #baud   19200  #串行端口的波特率
    #serial /dev/ttyS0      # Linux  #串口的接口名
    #serial /dev/cuaa0      # FreeBSD
    #serial /dev/cuad0      # FreeBSD 6.x
    #serial /dev/cua/a      # Solaris
    #bcast  eth0            # Linux #传播心跳的广播网卡信息
    #bcast  eth1 eth2       # Linux
    #bcast  le0             # Solaris
    #bcast  le1 le2         # Solaris
    #mcast eth0 225.0.0.1 694 1 0  #多播传送心跳的网卡 多播组 端口 跃点数 是否回环内传送
    ucast ens33 192.168.1.220 #设置单播心跳,设置对方的ip地址,此处使用单播
    auto_failback on  #表示如果主机停止后,从机接管设置为on当主机从新启动后,主机立即接管vip off从机不会释放vip给主机
    node    docker-01  #配置主从的节点信息,要与uname -n保持一致
    node    docker-02
    #############################################
    #使用ping模式 有时当主机挂掉或者heartbeat挂掉后vip才会转移  有时出现某个进程挂掉 切换需要使用脚本 
    #ping模式用于测试 如果网卡ping不同 某个主机 就认为当前断网 需要转移vip 
    #respawn root     /usr/local/heartbeat/libexec/heartbeat/ipfail 表示当ping不通时 自动调用 ipfail这个脚本
    #apiauth ipfail gid=haclient uid=hacluster 表示有权限操作ipfail脚本的组和用户
    ############################################
    ping 192.168.1.1  #通过ping网关检测心跳是否正常,仅用来测试网络
    #ping组的所有主机
    #ping_group group1 10.10.10.254 10.10.10.253
    #respawn userid /path/name/to/run
    #指定与heartbeat一同启动和关闭的进程,该进程被自动监视,遇到故障则重新启动。最常用的进程是ipfail,该进程用于检测和处理网络故障,需要配合ping语句指定的ping node来检测网络连接。如果你的系统是64bit,请注意该文件的路径。
    #respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfail
    #apiauth ipfail gid=haclient uid=hacluster ##设置启动IPfail的用户和组

    配置authkeys配置文件

    #该文件表示发送心跳时 机器用于验证的key的hash算法,节点之间必须配置成一致的密码

    [root@docker-01 ~]# cat /usr/local/heartbeat/etc/ha.d/authkeys
    auth 2  #表示使用id为2的验证 下边需要定义一个2的验证算法 
    2 sha1 1a2b3c  #ID 2的验证加密为shal,并添加密码
    或者
    auth 3
    3 md5 Hello!
    注:auth后填序号,可任意填写,但第二行开头必须为序号名,然后为验证方式,支持三种( crc md5 sha1 )方式验证,最后面是自定义密钥。我应该选哪种验证?
    如果Heartbeat运行于安全网络之上,如本例中的交叉线,可以使用crc,从资源的角度来看,这是代价最低的方法。如果网络并不安全,但也希望降低CPU使用,则使用md5。最后,如果想得到最好的认证,而不考虑CPU使用情况,则使用sha1,它在三者之中最难破解。

    更改权限为600

    chmod 600 /usr/local/heartbeat/etc/ha.d/authkeys

    配置haresources配置文件

    #该文件表示资源的管理,如果是主机,当主机启动后自动加载该文件中配置的所有启动资源,资源脚本默认在haresources同级目录下的resource.d目录下

    [root@docker-01 ~]# cat /usr/local/heartbeat/etc/ha.d/haresources
    #指定节点主机名,和VIP地址,以双冒号分隔资源,此处以apache为例进行配置
    docker-01 192.168.1.230 apache::/etc/httpd/conf/httpd.conf

    docker-02上准备配置文件

    #拷贝三个配置好的文件到docker-02上,只需修改ha.cf配置文件中的单播地址为对方地址即可(ucast ens33 192.168.1.220)。

    安装httpd资源服务

    #在两个节点上安装httpd服务并测试

    yum install httpd
    echo "<h1>Heartbeat web test</h1>" >>/var/www/html/index.html
    systemctl start httpd

    测试httpd服务正常后关闭httpd服务并关闭自启动

    systemctl stop httpd
    systemctl disable httpd

    .启动服务

    #启动每个节点上heartbeat服务

    systemctl enable heartbeat
    systemctl start heartbeat
    ssh docker-02 'systemctl start heartbeat'

    测试结果

    [root@docker-01 ~]# curl 192.168.1.230
    Heartbeat web test
    #使用heartbeat自带脚本切换主备节点
    [root@docker-01 ~]# /usr/local/heartbeat/share/heartbeat/hb_standby
    Going standby [all].
    [root@docker-01 ~]# curl 192.168.1.230
    Heartbeat web test
  • 相关阅读:
    Android Training精要(二)開啟ActionBar的Overlay模式
    Android Training精要(一)ActionBar上级菜单导航图标
    SimpleDateFormat的线程安全问题
    svn删除目录后提交显示Item 'XXXX' is out of date解决方法
    使用 python 开发 Web Service
    Bootstrap 中文文档教程
    起步 简介整个项目、组件、和如何使用一个简单的模版入门
    mysql笔记——索引
    20个数据库设计的最佳实践
    ASP.NET MVC Bootstrap极速开发框架
  • 原文地址:https://www.cnblogs.com/liujunjun/p/12363743.html
Copyright © 2011-2022 走看看