• Keepalived + HAProxy 搭建【第二篇】Keepalived 的安装与配置


    第一步:准备

    1. 简介

      本文搭建的是利用 Keepalived 实现 HAProxy 的热备方案,即两台主机上的 HAProxy 实例同时运行,其中全总较高的实例为 MASTER,MASTER出现异常时,另一台主机上的实例自动接管所有的流量。

      在运行着 HAProxy 实例的两台主机上分别运行着 Keepalived 实例,这两个 Keepalived 争抢同一个 虚 IP 地址,两个 HAProxy 也尝试着去绑定同一个虚 IP 地址上的端口。只能有一个 Keepalived 能抢到这个虚 IP,抢到这个虚 IP 的 Keepalived 的主机上的 HAProxy 即为当前的 MASTER。

      Keepalived 内部维护一个权重值,权重值最高的 Keepalived 实例能够抢到虚 IP。Keepalived 会定期检查所在主机上的 HAProxy 的状态,状态健康时,则权重值增加。

    2. 操作系统

    CentOS-7-x86_64-Everything-1511

    3. 安装包

    keepalived-1.3.4.tar.gz

    4. HAProxy 安装

    参照 Keepalived + HAProxy 搭建【第一篇】HAProxy 的安装和配置 在另一台主机(本文为192.168.6.129)上安装 HAProxy 实例。

    5. 安装 psmisc

    使用 killall -0 检查 HAProxy 服务是否存在。如果没有 killall 命令,则需要安装 psmisc 包。

    # yum intall psmisc

    6. 安装 openssl

    # yum install openssl-devel

    不安装 openssl,keepalived 编译的时候会报错:

    7. 安装 libnl/libnl-3 库

    # yum install libnl*

    不安装 libnl/libnl-3,keepalived 编译的时候会报警告:

    8. 安装

    # yum install libnfnetlink-devel

    不安装 libnfnetlink-devel,keepalived 编译的时候会报错:

    第二步:安装与配置

    1. 安装

    # tar zxzf keepalived-1.3.4.tar.gz
    # # cd keepalived-1.3.4 # .
    /configure --prefix=/usr/local/keepalived # make # make install

    2. 配置

    1)注册为系统服务

    # cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
    # cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    # touch /etc/init.d/keepalived
    # chmod +x /etc/init.d/keepalived
    # vi /etc/init.d/keepalived

    /etc/init.d/keepalived 的文件内容:

    #!/bin/sh
    #
    # Startup script for the Keepalived daemon
    #
    # processname: keepalived
    # pidfile: /var/run/keepalived.pid
    # config: /etc/keepalived/keepalived.conf
    # chkconfig: - 21 79
    # description: Start and stop Keepalived
    
    # Source function library
    . /etc/rc.d/init.d/functions
    
    # Source configuration file (we set KEEPALIVED_OPTIONS there)
    . /etc/sysconfig/keepalived
    
    RETVAL=0
    
    prog="keepalived"
    
    start() {
        echo -n $"Starting $prog: "
        daemon keepalived ${KEEPALIVED_OPTIONS}
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
    }
    
    stop() {
        echo -n $"Stopping $prog: "
        killproc keepalived
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
    }
    
    reload() {
        echo -n $"Reloading $prog: "
        killproc keepalived -1
        RETVAL=$?
        echo
    }
    
    # See how we were called.
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        reload)
            reload
            ;;
        restart)
            stop
            start
            ;;
        condrestart)
            if [ -f /var/lock/subsys/$prog ]; then
                stop
                start
            fi
            ;;
        status)
            status keepalived
            RETVAL=$?
            ;;
        *)
            echo "Usage: $0 {start|stop|reload|restart|condrestart|status}"
            RETVAL=1
    esac
    
    exit $RETVAL

    2)编辑配置文件

    # mkdir /etc/keepalived/
    # cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    # vi /etc/keepalived/keepalived.conf

    配置文件内容:

    global_defs {
        router_id LVS_DEVEL  #虚拟路由名称
    }
    
    #HAProxy健康检查配置
    vrrp_script chk_haproxy {
        script "killall -0 haproxy"  #使用killall -0检查haproxy实例是否存在,性能高于ps命令
        interval 2   #脚本运行周期
        weight 2   #每次检查的加权权重值
    }
    
    #虚拟路由配置
    vrrp_instance VI_1 {
        state MASTER           #本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
        interface eno16777736      #本机网卡名称,使用ifconfig命令查看
        virtual_router_id 51   #虚拟路由编号,主备机保持一致
        priority 101           #本机初始权重,备机请填写小于主机的值(例如100)
        advert_int 1           #争抢虚地址的周期,秒
        virtual_ipaddress {
            192.168.6.131      #虚地址IP,主备机保持一致
        }
        track_script {
            chk_haproxy        #对应的健康检查配置
        }
    }

    3. 启动

    # service keepalived start

    返回信息:

    其他相关命令:

    重启

    # service keepalived restart

    返回信息:

    停止

    # service keepalived stop

    返回信息:

    4. 测试

    1)查看进程

    # ps -ef|grep keepalived |grep -v grep

    返回信息:

    2)查看虚拟 IP 持有者

    # ip addr sh eno16777736

    其中,eno16777736 为网卡名称

    持有虚 IP 的主机返回以下信息:

    另一台主机返回信息:

    如果先启动备机的 Keepalived,那么很有可能虚 IP 会被备机抢到,因为备机的权重配置只比主机低1,只要执行一次健康检查就能把权重提高到102,高于主机的101。

    第三步:测试

    进行高可用性能测试

    1. 架构信息

    提供服务的 server 为 Nginx,每个 nginx 上放入带有本机 IP 的 HTML 页面,相关信息如下:

    IP Nginx 端口 HAProxy 端口
    192.168.6.128 8080 9090
    192.168.6.129 8080 9090
    192.168.6.130 8080 未安装

    2. 转发测试

    访问地址:http://192.168.6.131:9090/hello.html

    返回的页面信息:

    HAProxy 日志信息(/var/log/haproxy.log):

    Nginx 日志信息:

     

    3. 高可用测试

    1)停掉 Keepalived 中为 MASTER 的主机上的 HAProxy 服务

    # service haproxy stop

    2)查看 Keepalived 日志(/var/log/messages)

    MASER(192.168.6.128)健康检查失败,权重值从103降低到101,得知更高的权重值为备机的102,则进入备机状态:

    192.168.6.128 将虚 IP 释放:

    BACKUP(192.168.6.129)被选举为 MASTER:

    192.168.6.129 获得虚 IP:

    2)访问页面

    地址:http://192.168.6.131:9090/hello.html

    页面返回信息:

    HAProxy 日志信息(/var/log/haproxy.log):

     

    Nginx 日志信息:

    附:搭建过程中遇到的问题

    一、Haproxy 的问题

    1. 现象

    通过虚 IP 无法访问到 HAProxy,通过主机 IP 可以访问大 HAProxy。

    2. 解决办法

    配置 HAProxy 时,bind 的配置,写成了固定 IP:PORT 的格式,此时 HAProxy 无法绑定虚拟 IP 。将改行配置改成 bind *:port,问题解决。

    二、Keepalived 的问题

    1. 现象:

    停止 MASTER 主机上的 HAProxy 服务,虚 IP 不漂移到 BACKUP 主机上。

    2. 问题处理过程

    1)健康检查脚本

    首先怀疑健康检查脚本的问题。

    进行手动执行:

    HAProxy 未启动时:

    HAProxy 启动时:

    说明脚本没有问题,排除该脚本问题。

    2)Keepalived 主备切换

    怀疑 Keepalived 本身就不能切换。

    停止 MASTER 的 Keepalived 服务,发现虚 IP 漂移到了 BACKUP 主机上。

    说明 Keepalived 可以进行主备切换

    3)版本

    怀疑 Keepalived 版本的问题。

    安装其他的版本,问题依然未解决。

    排除版本问题

    4)其他

    主备配置字段、执行检测脚本的配置字段等,均已排除。

    3. 解决办法

    1)查看 Keepalived 的日志,发现一直打印 pid 退出的的日志,怀疑与此有关。

    2)观察 Keepalived 启动过程的日志,日志中提示健康检查脚本中的 killall 使用完整的路径,即 /usr/bin/killall,修改完成后,重启,主备切换正常。

  • 相关阅读:
    jmeter如何引用自己编写的java文件编译的jar包
    Vue+Django REST framework 打造生鲜电商项目(学习笔记二)
    mysql笔试题
    面试遇到的问题
    Idea中maven项目pom文件中已引入testng但项目文件中无法引入@Test
    记录一次TestNg+MyBatis中的SqlSession出现的问题,问题虽然解决了但尚未明白问题原因
    PyMySQL的基本操作
    MySQL循环语句
    Vue父子组件和非父子组件间的通信
    Python的静态方法和类成员方法
  • 原文地址:https://www.cnblogs.com/RUReady/p/6480128.html
Copyright © 2020-2023  润新知