美文网首页
Keepalived(高可用)和LVS(负载均衡)

Keepalived(高可用)和LVS(负载均衡)

作者: 越狱的灵感 | 来源:发表于2024-03-23 16:24 被阅读0次

    前言

    内部FTP/REST服务数据上报服务均为单节点,会存在单节点故障和性能瓶颈。先急迫需提供清晰简单明了的高可用+负载均衡(keepalived+lvs+DR)方案,业内的slb解决方案,核心实现思想也是keepalived+lvs。现这里简单演示记录下手动做高可用和负载均衡的说明和步骤。

    技术思路

    当前高可用+负载均衡方案主要使用使用keepalived+lvs+DR实现,lvs组件实现负载均衡,keepalived组件实现高可用。

    Keepalived是啥?

    Keepalived就是VRRP的实现,该协议是虚拟冗余路由协议,顾名思义为服务保活,通过故障转移对外保证服务的高可用。详情可以查看官方文档。

    软件架构图

    image.png
    image.png
    一些说明

    0,VRRP(虚拟冗余路由协议)提供VIP和VMAC地址,设定那个路由器是活动节点,客户端使用VIP和VMAC寻址。
    1,Master会不停的向Backup节点基于VRRP协议上报心跳,一旦心跳超时,Backup节点立马变化为Master。整个故障转移流程是全自动。
    2,VRRP Stack为一个子进程负责VRRP(也就是VRRP协议的实现)。
    3,Checkers为一个子进程负责IPVS的后端的应用服务器的定时健康检查。比如下游的nginx挂了,则可以通过Checkers做相应的操作,比如告警和重启服务。
    4,Control Plane为主进程,控制VRRP Stack和Checkers两个子进程。且复杂一些配置文件的处理。
    5,WatchDog为linux内核监控进程,监控两个子进程的状态。

    LVS是啥?

    LVS是Linux Virtual Server的简写,也就是Linux 虚拟服务器,基于IP地址的虚拟化应用,主要为负载均衡提出了高效的解决方法,解决DNS中的TTL缓存导致动态不均衡和F5等硬件设备昂贵的痛点。详情可以查看官方文档。LVS有三种负载均衡工作方式,地址转换(NAT)、IP 隧道(TUN)和直接路由(DR)由于DR模式响应数据不经过LVS节点,是性能最好的,下文所有的说明均基于DR模式,其他模式可以参考官方说明。

    软件架构

    image.png
    image.png
    一些说明

    1,LVS主要由两个部分组成,ipvs和ipvsadm。ipvs工作在内核空间,基于内核态的netfilter框架实现,真正实现数据链路调度的部分。ipvsadm工作在用户空间,主要为内核的ipvs编写规则,实现 VIP 和 RS 的增删改查功能。
    2,LVS为使用IP+端口形式做四层负载均衡。不同于nginx等使用应用层信息比如HTTP头,URL,cookie等做七层负载均衡。如果不使用应用层信息做定制化的负载均衡则推荐使用LVS。
    3,LVS的一些专业术语,DS(Director Server负载均衡节点服务器),RS(Real Server后端真实服务器),VIP(对外提供访问的虚拟IP),RIP(真实后端服务器的IP),CIP(访问客户端的IP),DIP(负载均衡节点服务器IP),VMAC(VIP对应的MAC地址)。
    4,LVS工作原理,LVS基于内核的netfilter,IPVS工作在INPUT链上。客户端请求通过交换机进 LVS服务器网卡进入内核空间层,在PREROUTING查找路由,判断VIP是否为本机IP,如果是则将数据包传入INPUT。IPVS在INPUT链中判断访问的VIP和端口判断请求是否为IPVS服务,如果是则进行IPVS相关流程,并修改数据包中的相关信息(主要是RIP-MAC,这里会通过响应的负载均衡算法,比如轮询配置中的RS节点)发送到POSTROUTING链。POSTROUTING链收到数据包后,将根据目标IP地址服务器,将数据包最终发送至后端真实RS服务器中。RS处理并返回响应数据包返回到交换机。
    5,LVS+DR模式的一些限制,DR模式虽然响应数据不用过LVS节点,性能高和数据完整性强,但是LVS与RS必须在同一个物理网络,且RS上配置了lo网卡和arp内核参数。
    6,LVS+keepalived至少需要4台机器,DR和RS不能再同一个接地上,否则会出现死循环。
    7,LVS+DR无法像nginx会作为一个代理服务去重试错误请求,如果在DR模式下,如果RS节点没有配置VIP则这部分请求就会丢失。

    交付架构

    演示资源

    image.png

    交付图

    image.png

    简单操作

    Real Server节点操作

    1,交付上报服务
    在两个RS节点192.168.100.34和192.168.100.35成功完成数据上报服务的实例交付。

    2,启动上报服务
    在两个RS节点192.168.100.34和192.168.100.35上启动FTP/REST内核服务。

    systemctl status ftp
    systemctl restart ftp
     
    systemctl status rest
    systemctl restart rest
    

    3,创建LVS节点
    在RS节点上创建lo:0虚拟网卡并修改内核参数,需要在两个RS节点192.168.100.34和192.168.100.35执行如下操作,切记只能在两个RS节点上执行!!!否则会导致其他节点服务访问

    创建install_vip.sh脚本文件,内容如下:

    CT_VIP=192.168.100.111
    source /etc/rc.d/init.d/functions
    case "$1" in
    start)
           ifconfig lo:0 $CT_VIP netmask 255.255.255.255 broadcast $CT_VIP
           /sbin/route add -host $CT_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 $CT_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
    

    执行命令创建和销毁lo:0虚拟网卡和设置内核参数以及重置内核参数。

    # 1,上传脚本
    rz -bye
     
    # 2,创建
    sh install_vip.sh start
     
    # 3,需要注意机器重启后lo:0网卡就会丢失,需要配置开机启动
    chmod +x /etc/rc.d/rc.local
    echo '# for lvs lo:0' >> /etc/rc.local
    echo '/root/install_vip.sh start' >> /etc/rc.local
    

    创建成功后可以看到下图则表示成功。


    image.png

    Director Server节点操作

    1,创建keepalived配置文件
    创建keepalived.conf配置文件。参考模板如下。

    ! Configuration File for keepalived
     
    global_defs {
        router_id T_LVS
    }
     
    vrrp_instance VI_1 {                                # 定义VRRP实例名(VT_1),建议默认配置
        state MASTER                                   # 当前节点的主备初始状态,可以为MASTER和BACKUP
        interface enp1s0                                # 机器的具体网卡
        virtual_router_id 100                          # 虚拟路由id,唯一标识,主备节点该值相同
        mcast_src_ip 192.168.100.244                    # 发送多播包的地址,一般问本机ip
        priority 100                                   # 节点初始优先级
        advert_int 1                                   # vrrp通告优先级时间间隔
         
        authentication {                              # 认证机制
            auth_type PASS
            auth_pass xxxx                             # 密钥,和其他keepalived节点必须一致
        }
     
        virtual_ipaddress {
           192.168.100.111                    # 虚拟IP
        }
    }
     
    virtual_server fwmark 300 {                 # virtual server(虚拟服务器),FTP使用ipvs的防火墙打标方式
        delay_loop 6                        # 健康检查的时间间隔
        lb_algo wrr                                     # 负载调度算法
        lb_kind DR                                      # lvs的模式
        protocol TCP                                    # ip包转发协议,有TCP和UDP两种
        persistence_timeout 900
         
        real_server 192.168.100.34 9814 {              # ftp real server 的ip+port
            weight 1                                   # 权重
            TCP_CHECK {                                # 健康检查
                connect_timeout 3                      # 无响应超时时间,单位是秒
                nb_get_retry 3                         # 重连次数
                delay_before_retry 3                   # 重试间隔
                connect_port 9814                      # real_server指定的端口
            }
        }
         
        real_server 192.168.100.35 9814 {
            weight 1
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 9814
            }
        }
    }
     
    virtual_server 192.168.100.111 9826 {              # rest的 virtual_server
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        protocol TCP
     
        real_server 192.168.100.34 9826 {
            weight 1
            TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            }
        }
         
        real_server 192.168.100.35 9826 {
            weight 1
            TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            }
        }
    }
    

    在另一个节点按上同理操作,修改keepalived.conf配置文件中为state BACKUP,priority 50;

    2,安装keepalived+lvs
    建议下载使用keepalived-2.0.13.tar.gz离线安装,使用yum install -y keepalived安装的版本可能会出现调度问题。

    安装流程如下:

    # 1,上传keepalived-2.0.13.tar.gz安装文件
    rz -bye
     
    # 2,解压
    tar -zxvf keepalived-2.0.13.tar.gz
     
    # 3,编译并安装
    yum install -y gcc
    yum install libnl3-devel
    cd keepalived-2.0.13/
    ./configure --prefix=/usr/local/keepalived
    make && make install
     
    # 4,配置开机启动
    mkdir /etc/keepalived
    cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/
    ln -s /usr/local/keepalived/sbin/keepalived  /usr/sbin/
    systemctl enable   keepalived
     
    # 5,上传配置文件keepalived.conf
    cd /etc/keepalived
    rz -bye 
     
    # 6,启动keepalived
    systemctl restart  keepalived
    systemctl status   keepalived
     
    # 7,安装ipvsadm
    yum -y install ipvsadm
    

    3,操作iptables
    在两个DR节点192.168.100.145和192.168.100.244上执行如下操作。由于FTP在passive mode可能无法使用ip+端口的形式定义virtual_server,只能使用ipvs的防火墙打标方式。

    # 1,给FTP的服务端口(9814)和数据传输端口(8000:10000)
    iptables -t mangle -A PREROUTING -p tcp -d 192.168.100.111 --dport 9814 -j MARK --set-mark 300
    iptables -t mangle -A PREROUTING -p tcp -d 192.168.100.111 --dport 8000:10000 -j MARK --set-mark 300
     
    # 2,查看是否生效
    iptables -t mangle -L
     
    # 3,保存 iptables 避免重启机器后标签丢失
    yum install -y iptables-services
    systemctl enable iptables.service
    service iptables save
    
    image.png

    4,测试负载均衡+高可用是否生效
    FTP服务

    # 测试ftp走vip是否ok
    ftp -nvi 192.168.100.111 9814
    user admin ***
    
    image.png

    REST服务

    # 创建一个测试文件
    touch test_rest_compoent_available.txt
     
    # 执行rest 脚本
    chmod +x rest-test.sh
    sh rest-test.sh 192.168.100.111 'xxxx'
    
    image.png

    6,高可用测试
    在一个RS节点执行脚本

    while true; do sh rest-test.sh 192.168.100.111 'xxxxx'; sleep 1;done
    ftp -nvi 192.168.100.111 9814
    

    模拟LVS节点下线
    在LVS MASTER节点执行systemctl stop keepalived;ip a可以看到vip漂移走了。


    image.png

    在LVS BACKUP节点执行ip a可以看到VIP转移到了BACKUP上;


    image.png

    服务检查正常,VIP回到MASTER节点;


    image.png image.png

    模拟RS节点下线

    # 在其中一个RS(192.168.100.34)节点执行
    systemctl stop ftp && systemctl stop rest
     
    # 然后再LVS节点上执行
    watch ipvsadm -Ln --stats
    

    可以看到192.168.100.34节点已经不在路由中了。


    image.png

    然后访问服务,可以看到服务正常;


    image.png

    总结

    1,为何负载均衡用LVS而不是nginx?
    答:LVS+DR模式下,LVS节点只有请求包的流量,响应包的流量不过LVS节点,性能更高。且LVS为4层负载,nginx为7层负载,在一般的场景下用不上7层负载。

    2,FTP为何要用ipvs的防火墙打标方式?
    答:如果FTP不用fwmark的方式,那么FTP只能访问9814服务端口,在passive mode的情况下可能无法访问数据传输端口。

    3,LVS和keepalived分别起什么样的角色?
    答:keepalived是LVS的一部分。keepalived顾名思义“保活”,LVS为负载均衡。

    4,两节点下其中一个keepalived只是备用,一直空闲?
    答:生产环境一般用2个VIP做双主相互热备,2个VIP绑定2个外网IP并绑定DNS域名对外服务。

    相关文章

      网友评论

          本文标题:Keepalived(高可用)和LVS(负载均衡)

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