美文网首页
lvs+keepalived

lvs+keepalived

作者: jamas | 来源:发表于2020-05-02 00:09 被阅读0次

    lvs四种集群特点及使用场景

    • lvs-nat(net adress translation)
      类似于DNAT,但支持多目标转发。通过修改请求报文的目标地址为根据调度算法所挑选出的某RS的RIP来进行转发;
      架构特性:
      1)RS应该使用私有地址,即RIP应该为私有地址:各RS的网关必须指向DIP;
      2)请求和响应报文都经由director转发:高负载场景中,dircetor可能成为瓶颈;
      3)支持端口映射;
      4)RS可以使用任意OS;
      5)RS的RIP必须与director的DIP在同一网络;

    • lvs-dr(direct route)
      director在实现转发时不修改请求的ip首部,而是通过直接封装MAC首部完成转发:目标MAC是Dircetor根据调度算法挑选出某RS的MAC地址,此类型中,RS也有同Director一样的VIP。
      架构特点:
      1)通过静态绑定或内核参数修改或arptables规则实现只有Director上的VIP响应服务请求,RS上的VIP拒绝响应服务请求;
      2)RS上的RIP可以是私有地址,也可以是公网地址;
      3)请求报文必须经过Director调度,响应报文直接由RS通过VIP返回给用户;
      4)各RIP必须与DIP在同一网络中;
      5)不支持端口映射;
      6)RS可以使用大多数的OS;
      7)RS的网关一定不能指向Director;

    • lvs-tun(Tunnel transmission)
      隧道传输ipip:不修改请求报文ip首部,而是通过ip隧道机制在原有的ip报文之外在封装ip首部,经由互联网把请求报文交给选定的rs;
      架构特性:
      1)RIP,DIP,VIP都是公网地址;
      2)RS的网关不能,也不可能指向DIP;
      3)请求报文由Director分发,但响应报文直接由RS响应给Client;
      4)不支持端口映射;
      5)RS的OS必须得支持IP隧道,现在只有linux系统支持,windows,bsfdb等不支持;

    • lvs-fullnat(双向转换)
      通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发:
      架构特点:这是一种对nat模型的改进,是一个扩展,使得RS与Director可以处于不同网络。
      1)RIP,DIP可以使用私有地址;
      2)RIP和DIP可以不再同一个网络中,且RIP的网关未必需要指向DIP;
      3)支持端口映射;
      4)RS的OS可以使用任意类型;
      5)请求报文经由Director,响应报文也经由Director;

    LVS-DR工作原理,并配置实现。

    • DR架构


      lvs-dr.PNG

    其原理是数据包在director上被二层重写成被调度的RS的mac。
    因所有RS上都配有相同VIP,故所有RS上都需要关闭ARP相应及通告。

    • 实验拓扑:


      lvs.jpg
    • VS配置:
      编写脚本lvs_dr_vs.sh
    #!/bin/bash
    #
    vip='172.16.2.200'  #设置VIP
    iface='lo:1'         #VIP绑定网卡label
    mask='255.255.255.255'  #掩码
    port='80'          #端口
    rs1='172.16.2.135'  #设置rip
    rs2='172.16.2.136'
    scheduler='rr'   #调度算法
    type='-g'       #集群类型
    rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null   #安装ipvsadm工具
    
    case $1 in
    start)
        #添加VIP
        ifconfig $iface $vip netmask $mask #broadcast $vip up
        #清空防火墙
        iptables -F
        #添加ipvs规则
        ipvsadm -A -t ${vip}:${port} -s $scheduler
        ipvsadm -a -t ${vip}:${port} -r ${rs1} $type
        ipvsadm -a -t ${vip}:${port} -r ${rs2} $type
        echo "The VS Server is Ready!"
        ;;
    stop)
        # 清空ipvs规则
        ipvsadm -C
        ifconfig $iface down
        echo "The VS Server is Canceled!"
        ;;
    *)
        echo "Usage: $(basename $0) start|stop"
        exit 1
        ;;
    esac
    

    启动脚本

    [root@node1 ~]# bash lvs_dr_vs.sh start
    
    • RS配置:
      编写脚本lvs_dr_rs.sh
    #!/bin/bash
    vip=172.16.2.200  #设置VIP
    mask='255.255.255.255'  #掩码
    dev=lo:1   #VIP绑定网卡label
    #安装httpd服务并启动
    rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
    service httpd start &> /dev/null && echo "The httpd Server is Ready!"    
    #生成index文件
    echo "<h1>172.16.2.136</h1>" > /var/www/html/index.html
    
    case $1 in
    start)
        #关闭ARP相应
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        #添加VIP
        ifconfig $dev $vip netmask $mask #broadcast $vip up
        #route add -host $vip dev $dev
        echo "The RS Server is Ready!"
        ;;
    stop)
        #还原配置
        ifconfig $dev down
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo "The RS Server is Canceled!"
        ;;
    *)
        echo "Usage: $(basename $0) start|stop"
        exit 1
        ;;
    esac
    

    启动脚本

    [root@centos8-node1 ~]# bash lvs_dr_rs.sh start
    
    • 测试:
    [root@centos6 ~]# ip a
    
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
        link/ether 00:0c:29:21:75:ba brd ff:ff:ff:ff:ff:ff
        inet 172.16.98.200/24 brd 172.16.98.255 scope global eth0
        inet6 fe80::20c:29ff:fe21:75ba/64 scope link
           valid_lft forever preferred_lft forever
    
    [root@centos6 ~]# while true;do curl 172.16.2.200;sleep 0.5;done
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    

    LVS+Keepalived高可用

    • 实验拓扑:


      keepalived.jpg
    • RS端:
      使用RS脚本:

    #!/bin/bash
    vip=172.16.2.200
    mask='255.255.255.255'
    dev=lo:1
    rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
    service httpd start &> /dev/null && echo "The httpd Server is Ready!"
    echo "<h1>172.16.2.135</h1>" > /var/www/html/index.html
    
    case $1 in
    start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ifconfig $dev $vip netmask $mask #broadcast $vip up
        #route add -host $vip dev $dev
        echo "The RS Server is Ready!"
        ;;
    stop)
        ifconfig $dev down
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo "The RS Server is Canceled!"
        ;;
    *)
        echo "Usage: $(basename $0) start|stop"
        exit 1
        ;;
    esac
    
    • keepalived服务配置:(以MASTER端为例)
      安装keepalived服务
    [root@node1 ~]# yum install -y keepalived
    

    配置sorry server

    [root@node1 ~]# yum install -y httpd
    [root@node1 ~]# echo sorry server > /var/www/html/index.html
    [root@node1 ~]# systemctl start httpd
    

    编辑keepalived配置文件

    [root@node1 ~]# vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {   #全局通用配置
       notification_email {
         root@localhost
       }
       notification_email_from keepalived@localhost
       smtp_server 127.0.0.1  #邮件服务器IP
       smtp_connect_timeout 30   #邮件发送超时时间
       router_id node1     #本机id标识 BACKUP应为其id
       #vrrp_strict     #此设置应注销,否则会添加iptables规则使主机无法通行
       vrrp_skip_check_adv_addr
       rrrp_garp_interval 0
       vrrp_gna_interval 0
       vrrp_mcast_group4 239.1.1.1 # vrrp组播侦听地址,默认为224.0.0.18
    }
    
    vrrp_instance VI_1 {   #配置vrrp实例
        state MASTER   #设置主从 从服务器应为BACKUP
        interface ens160  #使用的网卡名称
        virtual_router_id 66  #识别同一个虚拟路由,一个实例内服务器应相同
        priority 100   #优先级,MASTER比BACKUP
        advert_int 1
        authentication {  #配置认证
            auth_type PASS
            auth_pass 6666
        }
        virtual_ipaddress {  #虚拟IP
            172.16.2.200/24
        }
    }
    
    
    virtual_server 172.16.2.200 80 {   #VS配置
        delay_loop 3  
        lb_algo rr  #定义调度算法
        lb_kind DR  #集群类型
        #persistence_timeout 50  #持久连接,为实验效果已注释
        protocol TCP  #服务协议
        real_server 172.16.2.135 80 { #配置RS
            weight 1
            HTTP_GET {   #健康检测
                url {
                  path /
                  status_code 200
                }
                connect_timeout 1  
                nb_get_retry 3
                delay_before_retry 3
    
            }
        }
        real_server 172.16.2.136 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
                  status_code 200
                }
                connect_timeout 1
                nb_get_retry 3
                delay_before_retry 1
    
            }
        }
    }
    

    启动服务

    [root@node1 ~]# systemctl start keepalived
    
    • 验证:
      查看MASTER节点IP
    [root@node1 ~]# ip a  
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:0c:29:db:0a:d3 brd ff:ff:ff:ff:ff:ff
        inet 172.16.2.131/24 brd 172.16.2.255 scope global noprefixroute ens160
           valid_lft forever preferred_lft forever
        inet 172.16.2.200/24 scope global secondary ens160  #VIP上线
           valid_lft forever preferred_lft forever
        inet6 fe80::52b4:adde:49fc:1544/64 scope link tentative noprefixroute dadfailed
           valid_lft forever preferred_lft forever
        inet6 fe80::8e34:700b:215e:e13c/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    

    查看ipvs规则

    [root@node1 ~]# ipvsadm -Ln  #ipvs规则已生成
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  172.16.2.200:80 rr
      -> 172.16.2.135:80              Route   1      0          0
      -> 172.16.2.136:80              Route   1      0          0
    

    尝试关闭MASTER节点keepalived服务,验证VIP是否漂移至BACKUP节点

    [root@node1 ~]# systemctl stop keepalived
    [root@node2 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:0c:29:c9:0a:a2 brd ff:ff:ff:ff:ff:ff
        inet 172.16.2.132/24 brd 172.16.2.255 scope global noprefixroute ens160
           valid_lft forever preferred_lft forever
        inet 172.16.2.200/32 scope global ens160
           valid_lft forever preferred_lft forever
        inet6 fe80::52b4:adde:49fc:1544/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    
    [root@node2 ~]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  172.16.2.200:80 rr
      -> 172.16.2.135:80              Route   1      0          0
      -> 172.16.2.136:80              Route   1      0          0
    
    • client端测试:
      keepalived主从节点切换,业务流量未端
    [root@centos6 ~]# while true;do curl 172.16.2.200 ;sleep 0.5;done
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    <h1>172.16.2.136</h1>
    <h1>172.16.2.135</h1>
    

    相关文章

      网友评论

          本文标题:lvs+keepalived

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