LVS负载均衡

LVS负载均衡

LVS储备知识

LVS:linux virtual server
开源 F5:负载均衡器 阿里做LVS第四种工作模式,张文松——创始人。
百度最被认可,搜索量大PB级,阿里最光环。
三种IP负载均衡技术VS/NAT(可以在负载均衡服务器上做流量控制,对方的流量必须要经过调度器处理才能控制,如抗攻击能力)、VS/TUN(只做隧道的数据包处理,不做转发,性能更好,还支持广域网)、VS/DR(调度器必须在一个后台,二层做转发)所能支持最大服务器数目的估计是假设调度器使用的100M网卡,调度器的硬件配置与后端服务器的硬件配置所相同,而且是对一般web服务。

  • 此实验比较符合DR模式,三个虚拟机都在一个网段内。

  • 数据包从内部网络过来,经过调度器,从后端选一个健康的服务器,但其实LVS对对后端无健康检查,策略为自定义。数据包不是原路返回,而是server端直接响应。

  • VS/DR的工作流程:它的连接调度和管理与VS/NAT和VS/TUN中的一样,它的报文转发方法又有不同,将报文直接路由给目标服务器。在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装I报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该巾报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。

DNS服务 www.taobao.com 有多个apache后端
出现问题:
1.apache2 down,remove生效时间不可控
2.只支持WRR的调度策略
3.apache间负载不均匀
4.攻击防御能力弱 后引入Virtual Server虚拟服务器与Virtual ip 可以支持更多的虚拟调度算法

4层Load Balance负载调度
1.基于传输层信息进行调度
2.调度算法:WRR、WLC等
3.工作模式:NAT/DR/TUNNEL
4.传输协议:TCP/UDP

实验环境准备

server1:调度器 后台:server2、server3
通过server1来负载均衡后端的两台节点(可以很多节点,本次实验只以两个节点作为演示)

server2、server3:
yum install -y httpd 
##安装apache做测试
systemctl start httpd
cd /var/www/html/
ls
echo server2 > index.html
curl localhost
##在默认发布目录内创建一个首页,内容自定义

yum install -y httpd 
##安装apache做测试
systemctl start httpd
cd /var/www/html
ls
echo server3 > index.html
curl localhost

在这里插入图片描述
在这里插入图片描述

server1:
yum list ipvsadm
##列出软件包
yum install -y ipvsadm
##安装ipvsadm工具
ipvsadm -l
##ipvsadm工具是用于用户端,专门用来写LVS策略的
lsmod |grep ip_vs
##过滤发现,很多模块已经安装
##linux中模块大多是动态模块,在使用时会自动加载
lsmod |grep ip
ipvsadm -A -t 172.25.111.100:80 -s rr
##手工加载模块
##添加虚拟服务器,实现负载均衡
##-t tcp
##111.100就是所分配的虚拟IP,该IP必须是没有被占用的
##-s 调度 rr最均衡的
ipvsadm -a -t 172.25.111.100:80 -r 172.25.111.2:80 -g
ipvsadm -a -t 172.25.111.100:80 -r 172.25.111.3:80 -g
##-g 直连模式
ipvsadm -ln
##列出虚拟服务,可创建多个,调度不同主机
ip addr add 172.25.111.100/24 dev  eth0
##手工添加Ip地址,外部可访问

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

真机:
curl 172.25.111.100
##访问6次
##卡住不动
##当数据包到达调度器,调度器在第二层将数据包转发给server2时,但server2无法响应请求
##tcp协议,三次握手协议需要满足条件
##src:172.25.111.250 dst:172.25.111.100,经过调度器后目标地址直接变为了172.25.111.2,但源地址和目标地址没有变化,数据包认为发送路线出现问题,数据包就面临着被机器内核丢弃的风险

server1:
ipvsadm -ln
##访问均衡调度到了server2、server3上各三次

在这里插入图片描述

server2:
ip addr add 172.25.111.100/32 dev eth0
##若想要数据包能成功到达,就必须要添加相应的IP与子网掩码

真机:
curl 172.25.111.100
##再次调度
##调度成功

在这里插入图片描述
在这里插入图片描述

新问题出现

真机:
arp -an |grep 100
##本地缓存地址
arp -d 172.25.111.100
##清除arp协议缓存地址
arp -an |grep 100
##arp协议在本地会以广播的形式来进行学习
ping 172.25.111.100
##再次学习地址
##arp协议,谁先响应我,我就缓存谁
##访问都是server3
##访问此时不经过调度,调度器不反应
evince 

在这里插入图片描述

解决方法

1.直接修改内核参数,禁用arp协议
2.屏蔽arp协议

LVS DR模式:
server3:
ip addr add 172.25.111.100/32 dev eth0
ip addr
server2、server3:
yum install -y arptables_jf
##安装针对于arp协议有效的防火墙
arptables -L 
##有三条链,INPUT、OUTPUT、FORWARD
arptables -A INPUT -d 172.25.111.100 -j DROP
##-A附加 -d如果当从INPUT这条链进来,访问111.100这个动作就jump丢弃
arptables -A OUTPUT -s 172.25.111.100 -j mangle --mangle-ip-s 172.25.111.2
##如果从OUTPUT这条链出去,即172.25.111.100源地址,不允许并且指定源地址为172.25.111.2
arptables-save > /etc/sysconfig/arptables
cat /etc/sysconfig/arptables
##保存策略
##systemctl status arptables.service
arptables -F
##刷掉策略,但重启服务时会自动读取配置文件使之生效
systemctl restart arptables.service
arptables -nL
scp /etc/sysconfig/arptables server3:/etc/sysconfig/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

server3:
vim /etc/sysconfig/arptables
##修改配置文件
--mangle-ip-s 172.25.111.3
##修改Ip
ip addr
##保证数据请求不落到server2、server3上,而不落到调度器上
systemctl restart arptables.service
arptables -nL
##重启使之生效
##arp协议已经被屏蔽掉
##此时在私有网段内,只有server1能对外做正常的响应

在这里插入图片描述
在这里插入图片描述

负载均衡架构

NAT模式:不同模式的转换
TUN模式:隧道访问
DR数据流走向:
client->DR->RS->client
调度器:调度转发,性能良好
同一个vlan:sip源地址IP地址 +vip目的地址IP地址
dm->rm
通过二层链路中,核心:经过DR时,改变的是目标地址的mac地址 sip->vip,RS拿到了源地址和目的地址,因此认为此数据包就是访问本客户端的,然后RS通过源地址,可以直接把数据包响应给客户端
smac->RMAC
后续数据包还会经过调度器,RS不对外响应vip

ipvsadm与iptables的优先级哪个优先级高?
iptables优先级高,iptables为包过滤防火墙,直接作用于网卡,只要有数据包进来都逃脱不了它

server1:
yum install -y httpd
systemctl start httpd
echo server1 > /var/www/html/index.html
curl localhost
ipvsadm -ln
systemctl stop httpd

在这里插入图片描述
在这里插入图片描述

真机:
curl 172.25.111.100
curl 172.25.111.1
##策略为111.100:80与访问111.1:80不冲突
##访问到server1的内部,而不被ipvsadm策略所截获
curl 172.25.111.100

在这里插入图片描述

如何使LVS具备健康检查机制?

问题出现:
LVS无健康检查机制,正常调度是数据包被调度器调度到server2找80端口的应用层http协议,却发现80端口被停掉,因此无法处理这种请求被拒绝,就会导致客户端收到错误连接。

server1:
yum install -y keepalived
##安装软件,keepalived巧妙地利用了VRP协议——虚拟路由冗余协议,一般是用于企业路由器的冗余,两个本身进不来的路由器就可以做同类路由,实现高可用——两台机器之间的衔接/冗余
cd /etc/keepalived/
ls
vim keepalived.conf
##编写LVS调度策略
netstat -antlp
##本机具有邮件服务器25端口

在这里插入图片描述

global_defs {
     notification_email{
            root@localhost
            ##实现邮件时通知管理员
     }
     notification_email_from keepalived@localhost
     ##表示该邮件从哪儿发过来
     smtp_server 127.0.0.1
     ##smtp邮件是通过邮箱——服务器来发送
     smtp_connect_timeout 30
     ##超时
     router_id LVS_DEVEL
     ##路由ID
     vrrp_skip_check_adv_addr
     #vrrp_strict
     ##该参数,在一旦出问题时,在切换时会在iptables中添加一个jumpall,使所有的访问无法访问

     18行,定义主备之间的状态
     vrrp_instance_VI_1 {
           state MASTER
           interface eth0
           ##主机心跳包的发送接口,也可以是eth1,eth2
           virtual_router_id 51
           ##虚拟路由id,确认哪些主机是属于一组的,可以定义多种集群在一个vlan中,互不影响就是通过vrid来确认谁是一个group
           ##master会接管vip
           ##可以是多个主机,一个master有多个backup
           ##当一个master挂了,backup会进行简单接管
           ##VRP协议工作机制:master会在这些主机中做不断发例如“hello”的心跳包,backup只负责收,master只负责发
           ##当backup收不到心跳包时,认为master挂了
           priority 100
           ##接着backup之间开始进行选择,谁的优先级高,谁就是下一个master
           ##当master恢复了,会再次接管管理状态
           ##底下的集群虚拟资源会跟随master的状态切/漂移过来
           ##VRP协议是通过优先级看谁是master
           ##所以在定义时要确定master是最高的,数字越大,优先级越高
           advert_int 1
           ##心跳频率每隔一秒发一次

               virtual_ipaddress {
                     172.25.111.100
                     ##修改为自己的vip,与虚拟服务保持一致
                }
         32行
          virtual_server 172.25.111.100 80 {
          ##LVS虚拟服务 
          delay_loop 3
          ##每隔3秒对后端做一次健康检查
          lb_algo rr
          ##后端调度算法
          lb_king DR
          ##工作模式修改为DR模式
          persistence_timeout 50
          ##在50s内调度算法始终会把请求调度给一个后端,50s后调度给另外一个后端
          ##若时间过短,会导致不断在做磋商,而不是数据传输
          ##而其被希望应该是持续地奔着某一个节点去做处理,而不是来回跳转
          #persistence_timeout 50
          ##如果不注释掉,会在访问vip时不会改变,始终只发往同一个后台
          protocol TCP
          ##TCP协议
  
          real_server 172.25.111.2 80 {
                weight 1
                TCP_CHECK {
                ##直接检测tcp
                 }
           }
          47行后全部删掉,可定义多个虚拟服务对应多个后端
          real_server 172.25.111.3 80 {
          ##复制2的虚拟服务,其余不用修改 
          
                 }        
            }
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ip addr del 172.25.111.100/24 dev eth0
##去除手工添加的vip,以防造成冲突
ip addr
ipvsadm -ln
ipvsadm -C
##使用参数将策略全部刷掉
systemctl start keepalived
##启动keepalived软件
cat /var/log/messages
##keepalived为master开启状态
##本机172.25.111.100即为master,vip在其机器上,并且通知让vlan中其他主机知道keepalived会对后端每隔3秒有一个健康检查了
ip addr
ipvsadm -ln
##只包含server3,因为server2被关闭

server2:
systemctl stop httpd
systemctl start httpd

ipvsadm -ln

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

server3:
systemctl stop httpd

ipvsadm -ln
##观察策略有无变化
yum install -y mailx
##安装查看邮件的工具
mail
& 回车
& q
ipvsadm -ln
##down掉之后会把其从vlan中去掉,从而实现对后台的健康检查
##健康检查的目的就是为了使策略实时更新
##调度策略只会留下健康的后台服务器,失败的就会从调度列表中去除
##这样才能保证前端访问始终是正常的,不会出现问题

server3:
systemctl start httpd 

ipvsadm -ln

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

LVS的高可用性

新问题出现

server1:
lsmod
##内有很多LVS的模块

在这里插入图片描述

RealServer down了,怎么办?

问题解决

VRP协议——NETLINK:实现了LVS的高可用性
MASTER的接管
CHECKERS——健康检查
主进程监控子进程的健康状态,一旦发现挂了的状态,去启动进程接管

server4:
hostnamectl set_hostname server4
vim /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static
DEVICE=eth0
ONBOOT=yes
IPADDR=172.25.111.4
PREFIX=24
GATEWAY=172.25.111.250
DNS1=114.114.114.114
systemctl restart network
yum install -y ipvsadm keepalived
cd /etc/keepalived/
ls
vim keepalived.conf

server1:
scp keepalived.conf server4:/etc/keepalived/
vim keepalived.conf
20行 id--->150 
##保证主机在同一个路由器内就行
##否则id一样都在一个交换机中,会报错
systemctl start keepalived
systemctl stop keepalived.service

18行
state BACKUP
ID--->50
21行
priority 50
systemctl start keepalived
cat /var/log/messages
##BACKUP接管

server1:
systemctl stop keepalived.service

主机:
curl 172.25.111.100

server4:
cat /var/log/messages
##由BACKUP切换为MASTER
ip addr
##vip接管172.25.111.100
ipvsadm -ln

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

server1:
systemctl start keepalived.service
##server1再次接管MASTER
##客户端无法感知

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

内核中的十种连接调度算法

轮叫调度
加权轮叫调度
最小连接调度
加权最小连接调度
基于局部性的最少链接
带复制的基于局部性最小链接
目标地址散列调度
源地址散列调度
最短预期延时调度
不排队调度

LVS的三种工作模式

NAT工作模式

NAT数据包经过DR调度器之后,由DR调度器去连接后端的virtual server,virtual处理完之后原路返回,就必须要把调度器设置来确保数据包能返回。
DNAT—>SNAT
从RS过来的源地址就是RS的源地址,就不是vip了。所以数据包在出去时依然要做一个SNAT,把源地址转换成vip,以此来形成从客户端到DR,还依然是从客户端的IP到VIP。

TUNNEL工作模式

隧道工作模式使用隧道协议,所以可以通过广域网去连接,利用隧道,每个节点上依然需要VIP。数据包通过隧道到达virtual server,virtual server要解开并拿到MAC目标地址,那么他访问的目标地址依然是VIP,因此RS上依然需要设置VIP。
限制:每一个节点机器上都需要支持TCP/IP。
工作原理:在数据包进来时,增加一个IP包头,即做封装。通过隧道到达RS进去解封装,而不需要出。
数据包与DR工作方式一样,直接回应,而不是NAT模式一样原路返回。

DR工作模式

DR模式:要求调度器与RS必须在同一个vlan中,通过更改进入的数据包更改目的MAC。

LVS

  • 内核模块:ip_vs
  • 实现了负载均衡
    LVS本身down了,怎么办?——LVS冗余

Keepalived_LVS管理软件
健康监测:支持4/7检测;
主备冗余:采用VRRP协议的HeartBeat;
如何配置?——配置文件 Keepalived -f
/etc/keepalived/keepalived.conf

server2、server3:
yum install -y vsftpd
systemctl start vsftpd
lftp localhost
ls
cd pub/
ls
exit
##默认是匿名访问,表示可以成功访问

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

server1:
ipvsadm -A -t 172.25.111.100:21 -s rr
##-s 调度 ,添加一个tcp服务
ipvsadm -ln
##成功修改为21
ipvsadm -a -t 172.25.111.100:21 -r 172.25.111.2:21 -g
ipvsadm -a -t 172.25.111.100:21 -r 172.25.111.3:21 -g
ipvsadm -ln
cat /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
##复制添加虚拟服务virtual_server 172.25.111.100 80一段的配置文件到真机
##端口改为21
##解除注释持续连接#persistence_timeout 50
##rs的端口也都更改为21
systemctl reload keepalived.service
systemctl restart keepalived.service
ipvsadm -ln

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

真机:
lftp 172.25.111.100
ls
##出现连接被拒绝
##修改server1参数后生效
lftp 172.25.111.100
ls
cd pub/
ls
server2:
cd /var/ftp/pub/
ls
cd ..
ls
touch server2

server3:
cd /var/ftp
ls
touch server3

真机:
lftp 172.25.111.100
ls
##查看到了创建的server3,说明始终调度到了server3
##其实server2也经过了调度策略,但数据包始终发往同一个server3
exit

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

server3:
systemctl stop vsftpd
##停掉ftp,因为LVS每隔3s对后台进行健康检查,就会去掉down掉的server3
真机:
lftp 172.25.111.100
ls
ls
exit
lftp 172.25.111.100
ls
exit

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果解决缺少监控系统?

LVS具有开源的SNMP Patch

LVS在大规模网络中应用存在不足

  • LVS在大规模网络中应用存在不足
    • 各转发模式,网络拓扑复杂,运维成本高
  • 和商用LB设备相比
    • 缺少TCP标志位DDOS攻击防御
  • 主备部署方式不足
    • 性能无法线性扩展
    • 外部请求量过大,会造成瓶颈

DR模式不足

1.LVS-RS间必须在同一个VLAN
2.RS上绑定VIP,风险大

NAT模式不足

RS/ROUTER配置策略路由

TUNNEL模式不足

1.RS配置复杂(IPIP模块等)
2.RS上绑定VIP,风险大;

解决方法

  • 1.LVS各转发模式运维成本高
  • 新转发模式FULLNAT:实现LVS-RealServer间跨VLAN通讯,并且in/out流都经过LVS;
  • 2.缺少攻击防御模块
  • SYNPROXY:synflood攻击防御模块
  • 其它TCP FLAG DDOS攻击防御策略
  • 3.性能无法线性(水平)扩展
  • Cluster部署模式

FULLNAT模式

  • FULLNAT是一种新的转发模式
  • 主要思想:引入local address(内网IP地址),cip-vip转换为lip->rip,而lip和rip均为IDC内网ip,可以跨vlan通讯,达到调度不同vlan中RS的目的;
  • 调度器通过local ip访问real server ip
  • sip->lip ——> vip->rip SNAT+DNAT(进入时:经过DR,源地址和目标地址都发生了变更;出去时:源地址为rip访问lip,数据包到达了调度器,出去时转变为vip访问sip,vip->sip。地址转换又经历了SNAT+DNAT)
  • keepalived配置方式:
  • virtual_server 125.76.224.240{
  • lb_kind FNAT/DR/NAT/TUNNEL
  • local_address {
  •              192.168.1.1
    
  • }
  • ##需要编译linux内核和keepalived,否则不支持FULLNAT工作模式
  • FULLNAT转发模式
  • 做了两次NAT,用client address作为hash key
  • 双向hash,用五元组作为hash key。源地址,源端口,协议,目标地址,目标端口
  • 获取client address(TOA)
  • 后台应用服务器需要统计来源,知道客户端的地址,是需要重新编译内核。
  • RS:HOOK内核,不需要知道客户端信息
  • 1.将toa信息存入
  • 2.TCP getname函数从socket中获得toa信息
  • SYNPROXY用于防御synflood攻击
  • 主要思想;参照linux tcp协议栈中syncookies的思想,LVS-构造特殊seq的synack包,验证ack包中ack-seq是否合法——实现了TCP三次握手代理;
  • 配置方式
  •      virtual_server 125.76.224.240 {
    
  •             syn_proxy
    
  • SYNPROXY实现原理
  • LVS如何挡掉不合法链接,如TCP半握手?
  • LVS构造SYNACK包seq,Check ACK包ack_seq正确性
  • 洪水攻击:很多肉鸡进行虚假握手
  • 客户端首先与LVS建立三次握手,会伪造一个TCP的响应包,它不会立即调给后台的RS,而要确保客户端是合法且有效的,才会继续与RS建立连接,可以屏蔽一部分攻击。
    DDOS攻击会用“黑洞”防火墙,电信用户商会使用分流,将数据包导到别的地方;企业会购买抗攻击的流量,硬件收费。

SYNPROXY-设计考虑

  • TCP-Sequence
    • Lvs->client和apache->lvs的syn_ack包中seq不相同
  • TCP OPT
    • Lvs->client syn_ack包中tcp opt支持mss/wsale/sack
  • Session reused
    • 多个用户通过NAT网关用同一个ip/port访问LVS
  • Ack Storm
    • Tcp seq转换导致ack storm

LVS如何线性扩展

不是单机,而是水平线性扩展

三个调度器可以调度三个后端,那么它们如何接收来自后端的流量?
在调度器之上,再放置一个路由器
互联网中,路由跳转。
追踪路由,在访问域名时可以看到路由跳转了多少次
VRRP实现硬件高可用性

真机:
curl -I baidu.com
##解析百度
dig -t A baidu.com
##获取A记录,有两个口
dig -t A taobao.com
##更多个开口做跳转
##公网IP做集群,还有更多套集群
##外层通过外部DNS再做均衡,负载多个IP地址,访问taobao解析到不同地址
##把VIP整体上移,定义到路由器
##通过等价路由连接之下的调度器
##等价路由的数量取决于路由器性能
##所有调度器的session都需要彼此同步,如果某一个调度器挂了,可以随时把原来用户的请求调度到RS之上,由新的调度器接管
##支持一致性hash,所有路由都存在路由器中,解决了线性扩展的问题
##一个节点不够,就可以水平扩展很多个,利用LVS与keepalived来实现安全检查

IPVS优化

  • 多队列网卡,1个队列绑定到1个cpu核上
  • 增大session hash table——需要改变LVS的size为2^22
  • 增大session hash bucket lock个数
  • 避免路由cache条目过多
  • LOCKLESS
  • 硬件:Westmere(第二代nehalem)/bios配置

KEEPALIVED优化

  • Select->epool
  • 减少reload时间和开销

性能指标

  • Synflood:350w pps
  • Ack/rst/fin-flood:800w pps
  • HTTP:150w pps
  • New tcp connection:30w
  • MAX session:4000w(24G memory)
  • 机器:DELL R610(E5645 @ 2.40GHz),Intel 82599NIC

完善功能

  • 攻击防御:ip黑白名单
  • 支持GRO(不支持LRO)
  • 未来:4/7层合一
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值