LVS负载均衡

风格不统一 提交于 2020-02-08 05:21:09

Nginx反向代理型负载

负载均衡(load balance)集群,提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载、带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

  • 单台计算机无法承受大规模的并发访问,或者数据流量。此时需要搭建负载均衡集群把流量分摊到多台节点设备上分别处理,即减少用户的等待响应的时间,又提升了用户体验;
  • 7*24小时的服务保证,任意一个或者多个有限后端节点宕机,不能影响整个业务的运行。

为什么还要学习LVS

  1. 工作在网络模型的7层,可以针对http应用做一些分流的策略,比如针对域名、目录结构,Nginx单凭这点可利用的场合就远多于LVS了。
  2. 最新版本的Nginx也支持4层TCP负载,曾经这是LVS比Nginx好的地方。
  3. Nginx对网路稳定性的依赖非常小,理论上能ping通就能进行负载均衡,这个也是它的优势之一,相反LVS对网络稳定性依赖比较大。
  4. Nginx的安装配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。

懵逼了,Nginx这么好用,为什么还要用LVS。

简单一句话,当并发量超过Nginx上线,就可以使用LVS了。

日1000-2000W  PV 或者并发请求10000一下都可以考虑用Nginx。

大型门户网站,点上网站需要用到LVS。

并发访问量达到几十万用LVS

LVS介绍

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一。

官网:http://www.linuxvirtualserver.org/index.html

# 中文资料 ,网址里面加zh 就是中文的了
LVS项目介绍           http://www.linuxvirtualserver.org/zh/lvs1.html
LVS集群的体系结构      http://www.linuxvirtualserver.org/zh/lvs2.html
LVS集群中的IP负载均衡技术  http://www.linuxvirtualserver.org/zh/lvs3.html
LVS集群的负载调度         http://www.linuxvirtualserver.org/zh/lvs4.html 

LVS内核模块ip_vs介绍

LVS相关名词解释

CIP:客户端主机IP地址

VIP:负载均衡主设备

DIP:负载服务器的IPDIZHI

RIP:真实web服务器地址

LVS集群的工作模式-四种

  1. DR模式,用的最多的,direct  routing 直接路由模式
  2. NAT模式 , Network Address  Translation
  3. TUN,隧道模式, Tunneling
  4. FULL NAT模式,章教授到淘宝之后开发的 ,Full  Network Address  Translation

DR直接路由模式

DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。
DR技术可极大地提高集群系统的伸缩性。但要求调度器LB与真实服务器RS都有一块物理网卡连在同一物理网段上,即必须在同一局域网环境。

DR模式主要实现过程:

  1. LB修改Mac地址为RS的Mac地址
  2. RS的L0(本地网卡)绑定VIP地址
  3. RS抑制ARP解析
  4. RS将结果交给客户

  1.  通过在调度器LB上修改数据包的目的MAC地址实现转发。注意,源IP地址仍然是CIP,目的IP地址仍然是VIP。
  2. 请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高,比Nginx代理模式强于此处。
  3. 因DR模式是通过MAC地址的改写机制实现转发的,因此,所有RS节点和调度器LB只能在同一个局域网中
  4. 需要注意RS节点的VIP的绑定(lo:vip/32)和ARP抑制问题
  5. 强调下:RS节点的默认网关不需要是调度器LB的DIP,而应该直接是IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的情况),理论上讲,只要RS可以出网即可,不需要必须配置外网IP,但走自己的网关,那网关就成为瓶颈了。
  6. 由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求报文的目的端口。LVS DR模式的办公室在二层数据链路层(MAC),NAT模式则工作在三层网络层(IP)和四层传输层(端口)。
  7. 当前,调度器LB支持几乎所有UNIX、Linux系统,但不支持windows系统。真实服务器RS节点可以是windows系统。
  8. 总之,DR模式效率很高,但是配置也较麻烦。因此,访问量不是特别大的公司可以用haproxy/Nginx取代之。这符合运维的原则:简单、易用、高效。日1000-2000W PV或并发请求1万以下都可以考虑用haproxy/Nginx(LVS的NAT模式)
  9. 直接对外的访问业务,例如web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如:MySQL,存储系统RS节点,最好只用内部IP地址。

3个问题-关于RealServer

1. RealServer为什么要在lo接口上配置VIP?
答:既然要让RS能够处理目标地址为vip的IP包,首先必须要让RS能接收到这个包。在lo上配置vip能够完成接收包并将结果返回client。

2.在eth0网卡上配置VIP可以吗?
答:不可以,将VIP设置在eth0网卡上,会影响RS的arp请求,造成整体LVS集群arp缓存表紊乱,以至于整个负载均衡集群都不能正常工作。

3.为什么要抑制ARP响应?
先回顾ARP知识及了解arp_announce和arp_ignore作用。

不抑制RS端arp前的广播情况图示

只有抑制了,才能只有LB去响应

NAT模式

收费站模式  ---  来去都要经过LB负载均衡器。

通过网络地址转换,调度器LB重写请求报文的目标地址,
根据预设的调度算法,将请求分派给后端的真实服务器,
真实服务器的响应报文处理之后,返回时必须要通过调度器,
经过调度器时报文的源地址被重写,再返回给客户,完成整个负载调度过程。


TUN-隧道模式

采用NAT技术时,由于请求和响应的报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈,为了解决这个问题,调度器把请求的报文通过IP隧道(相当于ipip或ipsec )转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户,这样调度器就只处理请求的入站报文。由于一般网络服务应答数据比请求报文大很多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。
VS/TUN工作流程,它的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,连接数多少,动态地选择一台服务器,将原请求的报文封装在另一个 IP报文中,再将封装后的IP报文转发给选出的真实服务器;真实服务器收到报文后,先将收到的报文解封获得原来目标地址为VIP地址的报文, 服务器发现VIP地址被配置在本地的IP隧道设备上(此处要人为配置),所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。

 

FULLNAT模式

类比地铁站多个闸机。
LVS的DR和NAT模式要求RS和LVS在同一个vlan中,导致部署成本过高;
TUNNEL模式虽然可以跨vlan,但RealServer上需要部署ipip隧道模块等,网络拓扑上需要连通外网,较复杂,不易运维。
为了解决上述问题,开发出FULLNAT,该模式和NAT模式的区别是:数据包进入时,除了做DNAT,还做SNAT(用户ip->内网ip),从而实现LVS-RealServer间可以跨vlan通讯,RealServer只需要连接到内网。

 

 

 

ARP网络知识

ARP协议,全程“Address  Resolution  Protocol”,中文名是地址解析协议,使用ARP协议可实现通过IP地址获得对应主机的物理地址(MAC地址)。

10.0.0.1 ------>ARP ------> 00:50:55:AV:c4:09

ARP是第三层协议,工作在第二层

一个比喻:

  快递员给学生送快递,最多就知道学校地址(IP),但是不知道学生在那个教室,坐在哪个位置,班主任就是ARP歇息,告诉快递员具体的教室。

  ARP协议要求通信的主机双方必须在同一个物理网段(即局域网环境)!

通过抓包软件WireShark看一下,抓包VM8网卡搜arp,回车

在Linux里面ping 10.0.0.5

查看抓包过程

删除缓存后,重新广播

为了提高IP转换MAC的效率,系统会将解析结果保存下来,这个结果叫做ARP缓存。

Windows查看ARP缓存命令   arp -a
Linux查看ARP缓存命令     arp -n
Linux解析IP对应的MAC地址 arping -c 1 -I eth0 10.0.0.6

 

ARP缓存表是把双刃剑

  1. 主机有了arp缓存表,可以加快ARP的解析速度,减少局域网内广播风暴。因为arp是发广播解析的,频繁的解析也是消耗带宽的,尤其是机器多的时候。
  2. 正是有了arp缓存表,给恶意黑客带来了攻击服务器主机的风险,这个就是arp欺骗攻击。有同学恶作剧,伪装班主任告诉快递员错误的教室编号。
  3. 切换路由器,负载均衡器等设备时,可能会导致短时网络中断。因为所有的客户端ARP缓存表没有更新。

服务器切换ARP的问题

当集群中一台提供服务的lb01机器宕机后,然后VIP会转移到备机lb02上,但是客户端的ARP缓存表的地址解析还是宕机的lb01的MAC地址。从而导致,即使在lb02上添加VIP,也会发生客户端无法访问的情况。

解决办法是:当lb01宕机,VIP地址迁移到lb02时,需要通过arping命令通知所有网络内机器更新本地的ARP缓存表,从而使得客户机访问时重新广播获取MAC地址。
 这个是自己开发服务器高可用脚本及所有高可用软件必须考虑到的问题。

ARP广播进行新的地址解析
arping -I eth0 -c 1 -U VIP
arping -I eth0 -c 1 -U 10.0.0.3测试命令ip addr del 10.0.0.13/24 dev eth0ip addr add 10.0.0.13/24 dev eth0ip addr show eth0arping -I eth0 -c 1 -U 10.0.0.13windows查看arp -a

arp_announce和arp_ignore详解

LVS在DR模式下需要关闭arp功能

arp_announce

对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 
确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 - 尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.  此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.  首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址.   如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.

arp_ignore

定义对目标地址为本地IP的ARP询问不同的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 - 不回应所有(本地地址)的arp查询

LVS集群搭建-DR模式

环境准备

1.准备4台安装好CentOS7.4系统的虚拟机,内存512M。
2.所有虚拟机的防火墙和Selinux关闭
3.主机名及IP地址关系如下:
lb03    10.0.0.15   (将之前部署的keeplived和nginx关掉)
lb04    10.0.0.16   (将之前部署的keeplived和nginx关掉)
web03   10.0.0.17  
web04   10.0.0.18
4.web03和web04安装Tomcat软件,并满足下面条件:
curl http://10.0.0.17/页面底部得到结果为web03 10.0.0.17
curl http://10.0.0.18/页面底部得到结果为web04 10.0.0.18
5.安装好wireshark 2.2.2版本  2.2.x版本以上即可

安装ipvsadm(只在lb03)

# 查看系统的LVS模块。
lsmod|grep ip_vs

# 默认没有加载模块,需要安装管理工具才会激活。
yum -y install ipvsadm  keeplivaed -y

# 查看当前LVS状态,顺便激活LVS内核模块。
ipvsadm

[root@lb01 ~]# lsmod|grep ip_vs
ip_vs                 141092  0 
nf_conntrack          111302  1 ip_vs
libcrc32c              12644  2 xfs,ip_vs

配置LVS负载均衡服务+ipvsadm(只做lb03)

步骤1:在eth0网卡绑定VIP地址(ip)
步骤2:清除当前所有LVS规则(-C)
步骤3:设置tcp、tcpfin、udp链接超时时间(--set)
步骤4:添加虚拟服务(-A),调度算法见man ipvsadm
步骤5:将虚拟服务关联到真实服务RS上(-a)
步骤6:查看配置结果(-ln)
ip addr add 10.0.0.13/24 dev eth0 label eth0:1
ipvsadm -C                    
ipvsadm --set 30 5 60         
ipvsadm -A -t 10.0.0.13:80 -s wrr -p 20     wrr是加权轮询,-p是会话保持时间,相当于创建了一个池塘
ipvsadm -a -t 10.0.0.13:80 -r 10.0.0.17:80 -g -w 1 
ipvsadm -a -t 10.0.0.13:80 -r 10.0.0.18:80 -g -w 1 
ipvsadm -ln    -g 表示DR模式,默认的

已配置好,可以转发了,可以作MAC地址的转换了

Web服务器配置(web03、web04同时操作)

步骤1:在lo网卡绑定VIP地址(ip)
步骤2:修改内核参数抑制ARP响应
ip addr add 10.0.0.13/32 dev lo

cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p

可以使用了!

使用浏览器访问http://10.0.0.13/,同时使用wireshark抓取数据包http
不要在lb03本地访问测试!可以在lb04测试(未加入LVS“团伙”)

LVS不像nginx那样1:1很强烈的规律,只有访问频率很高的时候,近似的1:1

 

将配置永久保存

添加的内核参数,是永久的

但是添加的规则是临时的,即ipvsadm -ln 的规则(稍后用keepalived好一些)

我们添加的VIP,lo网卡上绑定的IP是临时的

解决:

1、复制lo网卡的配置文件为ifcfg-lo:1
2、修改配置,名字、IP、子网掩码,如下,然后保存
3、重启网卡
[root@web03 ~]# cd /etc/sysconfig/network-scripts/
[root@web03 network-scripts]# cp ifcfg-lo ifcfg-lo:1
[root@web03 network-scripts]# vim ifcfg-lo:1
DEVICE=lo:1
IPADDR=10.0.0.13
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
NETMASK=255.255.255.255
ONBOOT=yes
NAME=lo:1

[root@web03 network-scripts]# systemctl restart network.service 

三个问题

问题1:浏览器访问没有发现轮询效果
答:LVS的轮询不像Nginx明显,可以使用多个客户端访问(Windows和Linux)
问题2:使用抓包工具,发现进行通信的是windows的IP和lb03的80端口,但是lb03明明没有80端口?
答:Windows抓包查看,可以发现数据包的源MAC地址是web01或web02
Linux:tcpdump -nn port 80; tcpdump -nn -e port 80
问题3:客户端的操作有什么含义?

配置LVS负载均衡+keepalied(高可用)

接下来的实验又是一个新的开始,配置负载均衡不需要ipvsadm这个工具,因为keepalived本来就是另外一个自动管理工具。

安装keepalive

步骤1:在lb03和lb04安装Keepalive
  yum -y install keepalived

步骤2:配置Keepalive, lb03和lb04的配置文件分成三部分配置(man keepalived.conf)
  1.global_defs   ------>全局定义 
  2.vrrp 实例配置  ------>VIP
  3.virtual_server配置  --->lvs的配置

第一部分-全局定义

###########lb03###########  相当于
global_defs {
   router_id LVS_03
}

###########lb04###########
global_defs {
   router_id LVS_04
}
router_id 每一个keeplive的配置都有的独一无二的,相当于身份证号
 

第二部分-VIP配置

###########lb03###########
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51    # 主备的唯一标志,一样就是一对
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {     # VIP
     10.0.0.13/24
    }
}


###########lb04###########
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     10.0.0.13/24
    }
}

第三部分-lvs配置,管理和配置lvs

这部分两台负载一样。根据配置文件对比前面学过的ipvsadm命令

virtual_server  10.0.0.13  80 {   # 相当于 ipvsadm -A -t 10.0.0.13:80 
    delay_loop  6             # 循环次数
    lb_algo  wrr              # 轮询的模式
    lb_bind  DR               # 模式
    nat_mask  255.255.255.0
    persistence_timeout  50   # 会话保持的时间  也是-A中的
    protocol  TCP

    real_server  10.0.0.17  80 {    # 相当于ipvs  -a
        weight 1
        TCP_CHECK {             # 端口的检测,如端口挂掉怎么做,还有其他如HTTP_CHECK等
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port  80
        }
    }

    real_server  10.0.0.18  80 {
        weight 1
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port  80
        }
    } 

那么主备有什么区别呢?推荐使用beyongdCompare软件对比

  1. router_id   路由名称不一样
  2. state         主备标志不一样
  3. priority      表示主备的权重值不一样

vim /etc/keepalived/keepalived.conf  修改配置文件

重启两台主机的keepalived 服务

先检查lb03的vip,ipvsadm -ln是否还在,清除掉。ipvsadm -lnipvsadm -C
/etc/init.d/keepalived restart ipvsadm -ln  检查 配置规则,又重新有了# Centos7的操作
systemctl start keepalived.service
systemctl status keepalived.service
ip addr show eth0
ipvsadm -ln

可以测试keepalive高可用,故障转移(包含VIP及LVS配置)。

测试keepalive的高可用功能

关闭lb01的keepalived服务,然后查看lb02的ip,检查VIP

 

测试Keepalive的健康检查功能

关闭web03

常见的LVS负载均衡高可用解决方案

  1. 开发类似keepalived的脚本,早期的办法,现在不推荐使用。
  2. heartbeat+lvs+ldirectord脚本配置方案,复杂不易控制,不推荐使用
  3. RedHat工具piranha,一个web界面配置LVS。
  4. LVS-DR+keepalived方案,老师推荐最优方案,简单、易用、高效。

LVS故障排除

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!