lvs + keepalived 基本配置


介绍:LVS(Linux Virtual Server),即Linux虚拟服务器。通过keepalived + nginx,实现服务的高可用。

一、安装

  1. 准备keepalived安装包

    官网下载地址

  2. 安装keepalived

    安装必要工具

    yum install -y gcc openssl-devel popt-devel

    安装keepalived

    tar xzf keepalived-1.4.3.tar.gz
    cd keepalived-1.4.3
    ./configure --prefix=/usr/local/keepalived/
    make && make install

二、配置

修改 keepalived.conf 文件

  1. 全局定义块

    global_defs
    {
    #邮件通知
    #指定keepalived在发生切换时需要发送email到的对象,一行一个
    notification_email
    {
    acassen@firewall.loc;
    failover@firewall.loc;
    sysadmin@firewall.loc;
    }
    #指定发件人
    notification_email_from Alexandre.Cassen@firewall.loc
    #指定smtp服务器地址
    smtp_server 192.168.200.1
    #指定smtp连接超时时间
    smtp_connect_timeout 30

    在局域网内应该是唯一的(与backup节点区分开)。

    router_id KEEPALIVED.192.168.80.110
    }

  2. 监控服务(监控脚本)

    vrrp_script chk_nginx
    {
    #执行脚本的路径
    script "/etc/nginx/check_nginx.sh"
    #调用脚本两次之间的间隔,默认为1秒
    interval 1
    #第二次调用脚本后多长时间没有回应的超时时间
    timeout 10
    weight 10
    }

    check_nginx.sh 文件内容

    !/bin/bash

    if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
    then
    /usr/local/nginx/sbin/nginx
    sleep 5
    if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
    then
    killall keepalived
    fi
    fi

    注意:/usr/local/nginx/sbin/nginx 确保 nginx 启动的正确性。可修改为/usr/local/nginx/sbin/nginx -c /home/nginx/nginx-1.13.7/conf/nginx.conf

  3. vrrp实例

    vrrp_instance VI_1
    {
    #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态。
    state BACKUP
    #设置实例绑定网卡
    interface eht0
    #虚拟路由标识,同一个vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。
    # 取值 1 ~ 255
    virtual_router_id 110
    #优先级,同一个vrrp_instance的MASTER优先级必须比BACKUP高。
    priority 101
    #MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒。
    advert_int 1
    #设置为不抢占(这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高)
    #nopreempt

    设置认证

    authentication
    {
    auth_type PASS
    auth_pass 1111
    }

    虚拟ip(vip)地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的 vip 相一致!

    virtual_ipaddress
    {
    192.168.80.200
    }

    调用监控脚本

    track_script
    {
    chk_nginx
    }
    }

    查看网卡使用情况命令

    watch cat /proc/net/dev

  4. 虚拟服务器定义

    VIP地址,要和vrrp_instance模块中的virtual_ipaddress地址一致

    virtual_server 192.168.80.200 443
    {
    #设置运行情况检查时间,单位是秒
    delay_loop 6
    #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
    #rr,即轮询算法
    lb_algo rr
    #负载均衡转发规则NAT|DR|TUN
    lb_kind NAT
    #会话保持时间
    persistence_timeout 50
    #使用的协议TCP|UDP
    protocol TCP

    real_server 192.168.32.103 443 {
    weight 3
    #realserver的状态检测设置部分
    #TCP_CHECK {
    # connect_timeout 10
    # nb_get_retry 3
    # delay_before_retry 3
    # connect_port 80
    #}

    SSL_GET {
    url {
    # #检查url
    path /
    # #检查后的摘要信息
    digest de189aa6fbe0f5890e75fc8d8bcf4f90
    }
    connect_timeout 5
    nb_get_retry 3
    delay_before_retry 3
    }
    }

    real_server 192.168.32.104 443 {
    weight 3
    #realserver的状态检测设置部分
    #TCP_CHECK {
    # connect_timeout 10
    # nb_get_retry 3
    # delay_before_retry 3
    # connect_port 80
    #}

    SSL_GET {
    connect_timeout 5
    nb_get_retry 3
    delay_before_retry 3
    }
    }
    }

三、启动

  1. 启动keepalived

    执行命令

    ./keepalived -f /usr/local/keepalived/etc/keepalived.conf

  2. 查看虚拟ip

    在主节点执行命令

    ip a

    如果在列表中查看到vip地址,则启动成功。(主机MASTER启动,备机BACKUP上虚拟ip则不生效)

  3. 日志默认位置

    /var/log/messages

  4. 启动进程3个

    • 父进程,负责监控其子进程
    • vrrp子进程
    • checkers子进程
  5. 查询vip绑定情况

    • 查看日志

      执行命令

      tail -f /var/log/messages

      结果

      Registering new address record for 192.168.80.200 on eth0.IPv4.

      需等待地址注册成功后(配置地址较多,会比较慢),虚拟地址才可正常访问。

    • 查看vip绑定情况

      执行命令

      ipvsadm -L

      ipvsadm -L -n --stats

      ipvsadm安装

四、测试

  • 测试环境 CentOS 6.5
  • 启动主/备机上keepalived,主机vip生效,备机vip未生效。
  • 停掉主机keepalived,备机vip生效,主机vip失效。
  • 启动主机keepalived,主机vip生效,备机vip失效。
  • 测试过程中,vip地址均可正常访问,则测试通过。

五、问题解决

  1. 因文件格式导致脚本报错(syntax error near unexpected token `fi')

    执行命令:

    vim check_nginx.sh

    查看脚本格式

    :set ff

    将dos格式修改为unix

    :set ff=unix

    保存退出

    :wq

  2. 脚本无可执行权限

    切换管理员帐号:

    su root

    添加可执行权限:

    chmod +x check_nginx.sh

  3. 直接删除/var/log/messages日志文件,导致keepalived无法启动

    解决方法:恢复日志

  4. 报错 MD5 digest error to server

    digest的值用genhash生成,genhash由keepalived自带,一般位于安装目录中的bin目录,生成方法:

    ./genhash -s [realserverIP] -p [port] -u [url]

    例,

    ./genhash -s 192.168.1.100 -p 80 -u /index.html

    参数查看

    ./genhash -h

    生成适用httpsdigest

    ./genhash -s 192.168.1.100 -p 443 -u /index.html --use-ssl

  5. 主备同时出现相同vip

    • 问题解释:备节点收不到主节点的通告,认为主节点故障,切换状态,发布VIP。

    • 导致原因:两节点的上联交换机禁用了组播;防火墙没有允许vrrp或者组播流量;

    • 设置vrrp单播通告

      修改主备机 keepalived.conf 文件,在 vrrp_instance 中添加如下配置:

      source ip

      unicast_src_ip 192.168.32.104
      ## dest ip
      unicast_peer {
      192.168.32.103
      }

    • 配置iptables

      执行命令

      vim /etc/sysconfig/iptables

      添加

      -A INPUT -p vrrp -j ACCEPT

      或者

      -A INPUT -m pkttype --pkt-type multicast -j ACCEPT

      重启iptables

      service iptables restart

  6. 安装报错 configure: error: libnfnetlink headers missing

    yum install -y libnfnetlink-devel

  7. vip 可以 ping 通,但偶尔 telnet 不通端口(50%概率)

    • 导致原因:keepalived与nginx配置在同一台服务器

    • 解决方法:virtual_server中只保留本机 nginx 的real_server配置。

六、补充

参考

  1. lvs调度算法

    • rr:轮循(Round Robin)

    • wrr:加权轮循(Weighted Round Robin)

    • lc:最少连接数(Least Connection)

    • wlc:加权最少连接(Weighted Least Connection)

    • lblc:基于局部性的最少链接(Locality-Based Least Connections)

    • sh:源地址散列(Source Hashing)

    • dh:目标地址散列(Destination Hashing)

  2. 负载均衡转发规则

    • NAT:网络地址转换(Network Address Translation)

    • DR:直接路由(Direct Routing)

    • TUN:IP隧道(IP tunneling)

比较:

NAT TUN DR
服务器节点要求 任何操作系统 必须支持IP隧道模式 服务结点支持虚拟网卡设备,能够禁用设备的ARP响应
网络要求 可以是拥有私有IP地址的局域网络 拥有合法IP地址的局域网或广域网 拥有合法IP地址的局域网,服务结点与均衡器必须在同一个网段
支持节点数 10~20个,视负载均衡器处理能力而定 可支持到100个服务结点 可支持到100个服务结点
网关 负载均衡器即为服务器节点网关 服务结点同自己的网关或路由器连接,不经过负载均衡器 服务结点同自己的网关或路由器连接,不经过负载均衡器
服务结点安全性 采用内部IP,服务节点隐蔽 采用公网IP地址,结点完全暴露 采用公网IP地址,结点完全暴露
IP要求 仅需一个合法IP地址作为VIP 除VIP外,每个服务结点需拥有合法的IP地址,可以直接路由至客户端 除VIP外,每个服务结点需拥有合法的IP地址,可以直接路由至客户端
 posted on 2018-04-17 17:07  AI.℡  阅读(584)  评论(0)    收藏  举报