LVS+keepalived搭建高可用架构

发布于:2025-04-18 ⋅ 阅读:(31) ⋅ 点赞:(0)

背景:最近在搭建LVS+keepalived的高可用架构,中间遇到了一些坑比较让人头疼,此处重要就安装部署的步骤进行记录,特别是遇到坑进行说明,希望能对有需要的同学提供给帮助!

坑点1:

       在部署LVS+keepalived并且使用DR模式时要确认lvs部署的节点需要跟后端的real server在同一二级网络中,lvs节点跟后端real server通过交换机完成通信;一般在同一网段中的虚拟机会在同一二级网络中。

  • MAC 地址修改:在 DR 模式中,LVS 仅修改请求包的目标 MAC 地址为选定的 Real Server 的 MAC 地址,而不修改目标 IP 地址(仍为 VIP)。因此,LVS 必须与 RS 处于同一二层网络,才能通过 ARP 协议直接获取 RS 的 MAC 地址,并通过二层交换将请求转发给 RS。

  • 避免跨网段路由:若 LVS 和 RS 不在同一二层网络,请求包需经过路由器或三层设备,此时目标 MAC 地址会被修改为网关 MAC,导致 RS 无法直接接收该数据包。

       lvs节点跟real server不在同一二级网络中会导致部署完成后请求一直不通,主要表现形式就是:

(1)在开通对应的网络策略后,不启用lvs+keepalived是,客户端telnet VIP port或者curl http://VIP:port都是提示connection refused,表明网络是通的,只是服务端没有监听对应的端口;

(2)在启用lvs+keepalived后,客户端再telnet VIP port或者curl http://VIP:port都是提示connection time out。

以上问题在排查是花费了很多时间,一度以为是服务端的问题,最后通过 tcpdump 工具抓包才发现,服务端根本就没有收到请求。

坑点2:

        我在确认我所部署的lvs节点跟后端的real server不在同一二级网络,且中间还要经过一道防火墙后,想到了另外一个办法,在中间增加一层nginx,分别在两台lvs安装部署nginx,通过将请求转发到nginx,再由nginx转发请求,这样就能在不增加机器的情况下完成请求转发,实现后端服务的高可用。但是在此处我先配置了一个http的请求转发,在实际的测试中发现nginx的错误日志信息中一直返回400,没法正常处理,最后发现请求转发到nginx不是http请求,而是tcp请求,所有http请求一直无法处理tcp请求导致报400。解决方式是在nginx 增加stream 模块,大家可以参考很多网上资料进行配置。

部署的关键步骤:

1.准备两台虚拟机(需要跟后端服务在同一二级网络中) 2.提前完成网络策略打通。3.VIP地址 4.开始部署

        首先安装keepalived+lvs管理工具ipvsadm;执行命令: sudo yum -y keepalived ipvsadm;命令执行完成后修改配置文件:keepalived.conf,文件目录:/etc/keepalived/keepalived.conf

! 全局配置段
global_defs {
   notification_email {                # 故障通知邮箱(需邮件服务器支持)
     admin@example.com
   }
   notification_email_from keepalived@example.com
   smtp_server smtp.example.com        # SMTP服务器地址
   smtp_connect_timeout 30             # SMTP超时时间
   router_id LVS_DEVEL                 # 唯一标识,建议用主机名
}

! 自定义健康检查脚本(监控Nginx状态)
vrrp_script chk_nginx {
   script "/usr/bin/killall -0 nginx"  # 检查Nginx进程是否存在
   interval 2                          # 检查间隔(秒)
   weight 2                            # 优先级增减值(失败时降低权重)
}

! VRRP实例配置(主备节点需同步此段)
vrrp_instance VI_1 {
    state MASTER                       # 初始状态:MASTER/BACKUP
    interface eth0                     # 绑定网卡名称(需实际网卡名)
    virtual_router_id 51               # 虚拟路由ID(0-255,主备必须一致)
    priority 100                       # 节点优先级(MASTER > BACKUP)
    advert_int 1                       # 主备心跳间隔(秒)

    ! 认证配置(主备节点需一致)
    authentication {
        auth_type PASS                 # 认证类型:PASS/AH(推荐PASS)
        auth_pass 123456               # 认证密码(建议加密)
    }

    ! 虚拟IP配置(可配置多个)
    virtual_ipaddress {
        192.168.1.100/24 dev eth0      # 虚拟IP地址及绑定网卡
    }

    ! 绑定健康检查脚本
    track_script {
        chk_nginx                      # 引用上方定义的脚本
    }

! 新增虚拟服务器配置(转发HTTP流量到后端真实服务器)
virtual_server 192.168.1.100 80 {    # 虚拟IP及端口
    delay_loop 6                     # 健康检查间隔(秒)
    lb_algo wrr                      # 负载均衡算法(加权轮询)
    lb_kind DR                       # 直接路由模式(需后端服务器配置ARP抑制)
    protocol TCP                     # 协议类型

    ! 后端真实服务器列表(主备节点配置需一致)
    real_server 192.168.1.101 80 {
        weight 1                     # 权重值
        ! TCP健康检查(检测80端口连通性)
        TCP_CHECK {
            connect_timeout 3        # 连接超时时间(秒)
            retry 3                  # 重试次数
            delay_before_retry 2     # 重试间隔(秒)
        }
    }
    real_server 192.168.1.102 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3        # 连接超时时间(秒)
            retry 3                  # 重试次数
            delay_before_retry 2     # 重试间隔(秒)
        }
    }
}

}

 

可参考如上文件进行配置,需要注意的点是,keepalived部署一般为 一MASTER 一BACKUP,在MASTER正常运行的请求下,所有请求VIP的请求都有MASTER完成转发,若MASTER 发生了故障,BACKUP主动接管并承担MASTER的工作。在配置时需要注意几个点:

(1)MASTER角色的keepalived配置中state值需要配置为MASTER,BACKUP的state需要配置为

BACKUP;

(2)virtual_router_id MASTER和BACKUP需要一致。

(3)priority值MASTER配置值 要大于BACKUP。

         完成以上后就可以启动keepalived,启动命令:sudo service keepalived start; 停止命令是:sudo service keepalived stop。

        启动成功后我们通过 ip addr 命令查看是否我们的VIP地址有绑定在网卡上(网卡可以通过ifconfig来查看),若成功绑定则再执行命令:sudo ipvsadm -ln,查看lvs负载策略是否建立起来,在实际请求还可以通过命令:sudo ipvsadm -lnc查看连接情况。

        接下来需要完成real server的虚拟机上VIP和lo网卡绑定,可执行脚本如下:

#!/bin/bash
    SNS_VIP=10.0.0.192   #虚拟ip地址
    /etc/rc.d/init.d/functions
    case "$1" in
    start)
        ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
        /sbin/route add -host $SNS_VIP dev lo:0
        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
        sysctl -p >/dev/null 2>&1
        echo "RealServer Start OK"
        ;;
    stop)
        ifconfig lo:0 down
        route del $SNS_VIP >/dev/null 2>&1
        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
        echo "RealServer Stoped"
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
    esac
    exit 0

        脚本执行成功后一样通过ip addr查看是否绑定成功,绑定成功则可以在客户端访问VIP了,看是否正常响应,到此MASTER就部署完成可,接下来可以按照以上的步骤完成另外一个lvs节点部署。然后可以测试MASTER挂掉后BACKUP是否有接管后续的请求。

参考:

LVS+Keepalived(主备)+Nginx实现高可用负载均衡_lvs+keepalived+nginx-CSDN博客

LVS+Keepalived(Linux运维必备技能)-CSDN博客 


网站公告

今日签到

点亮在社区的每一天
去签到