负载均衡-LVS

2020-12-07  本文已影响0人  麦大大吃不胖

by shihang.mai

1. LVS负载均衡拓扑

负载均衡拓扑

2. NAT模式

负载均衡拓扑-DNAT
  1. Client发出(CIP->VIP)的包到负载均衡服务器,但是如果继续将(CIP-VIP)包向后面的RIP发送,显然RIP服务器会丢掉这个包。
  2. 只需在负载均衡服务器中将(CIP->VIP)改为(CIP->RIP),就能解决。
  3. 当server处理完返回时同样道理,server发出(RIP->CIP),在负载均衡服务器中将(RIP->CIP)改为(VIP->CIP),发送回Client

缺点:

  1. 一般地,发送都是少量的数据,返回的数据都会比发送的大,发送和返回都需要经过负载均衡服务器,带宽就是瓶颈。
  2. 因为每次的发送和返回都要经过地址转换,会消耗负载均衡服务器的计算能力。

3. DR模式

负载均衡-DR
  1. 为解决NAT模式带宽瓶颈,那么我们只需要发送和返回分开就可以
  2. 那么server端必须能产生(VIP->CIP),即server端必须有VIP,而且这个VIP应该是隐藏的,在server内部可见,但是对外不可见
  3. 当Client发出(CIP->VIP),在负载均服务器中,直接利用链路层ARP协议,发出的时候拼上RIP的mac地址,直接发送到server
  4. server收到后,拆掉RIP@MAC,处理完,用隐藏的VIP就可以生成(VIP->CIP),这样就把发送和返回分开了

优点:利用arp速度快,也不太消耗算力,成本低

缺点:因为利用了arp,而arp是节点与节点间的,所以负载均衡服务器要与server同一个局域网,有限制。

4. TUN模式

负载均衡拓扑-TUN
  1. 解决统一局域网限制,我们直接用数据包(DIP->RIP)包裹吗(CIP->VIP)即可.
  2. Client发送(CIP->VIP),在负载均衡服务器中用(DIP->RIP)发送,但是这个包里面含有(CIP->VIP),那么在server端接收到包后,拆掉外层(DIP->RIP),处理完后用隐藏的vip就可以生成(VIP->CIP)

优点:没统一局域网限制,速度也可以。

隐藏vip方法(在本地网卡LO上配置)

路径: /proc/sys/net/ipv4/conf/\*IF\*/arp_ignore
arp_ignore: 定义接收到ARP请求时的响应级别;
  0:只要本地配置的有相应地址,就给予响应;
  1:仅在请求的目标(MAC)地址配置请求,到达的接口上的时候,才给予响应;
====================================================
路径: /proc/sys/net/ipv4/conf/\*IF\*/arp_announce
arp_announce:定义将自己地址向外通告时的通告级别;
  0:将本地任何接口上的任何地址向外通告;
  1:试图仅向目标网络通告与其网络匹配的地址;
  2:仅向与本地接口上地址匹配的网络进行通告;

5. DR模式例子

实验手册
LVS:

node01:
    ifconfig  eth0:8 192.168.150.100/24
node02~node03:
    1)修改内核:
        echo 1  >  /proc/sys/net/ipv4/conf/eth0/arp_ignore 
        echo 1  >  /proc/sys/net/ipv4/conf/all/arp_ignore 
        echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
    2)设置隐藏的vip:
        ifconfig  lo:3  192.168.150.100  netmask 255.255.255.255
        
RS中的服务:
node02~node03:
    yum install httpd -y
    service httpd start
    vi   /var/www/html/index.html
        from 192.168.150.1x

LVS服务配置
node01:
        yum install ipvsadm 
    ipvsadm -A  -t  192.168.150.100:80  -s rr
    ipvsadm -a  -t 192.168.150.100:80  -r  192.168.150.12 -g -w 1
    ipvsadm -a  -t 192.168.150.100:80  -r  192.168.150.13 -g -w 1
    ipvsadm -ln

验证:
    浏览器访问  192.168.150.100   看到负载  疯狂F5
    node01:
        netstat -natp   结论看不到socket连接
    node02~node03:
        netstat -natp   结论看到很多的socket连接
    node01:
        ipvsadm -lnc    查看偷窥记录本
        TCP 00:57  FIN_WAIT    192.168.150.1:51587 192.168.150.100:80 192.168.150.12:80
        FIN_WAIT: 连接过,偷窥了所有的包
        SYN_RECV: 基本上lvs都记录了,证明lvs没事,一定是后边网络层出问题

以上模型存在的问题:

1. LVS单点故障,整个业务异常
2. RS会挂,LVS还存在这个RS的负载记录,导致一部分业务异常

解决方法:

1. 主备解决LVS单点

   方向:主向备发送心跳

   效率:主挂了,每个备拿出自己的权重,最大的当选。推让制。

2. 验证RS挂。http请求,判断是否返回200

6. Keepalived

这是一个第三方的软件,作用如下:

1. 监控自己服务
2. Matser通告自己还活着,backup监听Master状态,Master挂了,一堆backup推举出一个Master
3. 配置vip,添加itvs
4. 对RS做健康检查
实验手册-keepalive
keepalived实验:
主机: node01~node04

node01:
    ipvsadm -C
    ifconfig eth0:8 down

----------------------------
node01,node04:
    yum install keepalived ipvsadm -y
    配置:
        cd  /etc/keepalived/
        cp keepalived.conf keepalived.conf.bak
        vi keepalived.conf
            node01:
            vrrp:虚拟路由冗余协议!
                vrrp_instance VI_1 {
                    state MASTER         //  node04  BACKUP
                    interface eth0
                    virtual_router_id 51
                    priority 100         //  node04  50
                    advert_int 1
                    authentication {
                        auth_type PASS
                        auth_pass 1111
                    }
                    virtual_ipaddress {
                        192.168.150.100/24 dev eth0 label  eth0:3
                    }
                }
            virtual_server 192.168.150.100 80 {
                delay_loop 6
                lb_algo rr
                lb_kind DR
                nat_mask 255.255.255.0
                persistence_timeout 0
                protocol TCP

                real_server 192.168.150.12 80 {
                    weight 1
                    HTTP_GET {
                        url {
                          path /
                          status_code 200
                        }
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                    }   
                }       
                real_server 192.168.150.13 80 {
                    weight 1
                    HTTP_GET {
                        url {
                          path /
                          status_code 200
                        }
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                    }
                }
            scp  ./keepalived.conf  root@node04:`pwd`

虽然有keepalive,但是keepalive是单点。而且当主机的keepalive异常挂了(主机还运行着),那么备机也会创建vip,那就会有两个相同的vip(即:192.168.150.100)。

上一篇下一篇

猜你喜欢

热点阅读