LVS负载均衡原理
一、LVS基本原理概述
LB集群的实现,LB即负载均衡集群
硬件:F5 BIG-IP,Citrix NetScaler,A10,Array,Redware
软件:Lvs,nginx,haproxy,ats,perlbal,httpd,varnish
基于工作的协议层次划分:
传输层:
lvs没有上线,haproxy3万并发极限(mode-tcp)
应用层
haproxy,nginx,ats,perlbal
1、背景
可以参考中文官方文档http://www.linuxvirtualserver.org/zh/lvs1.html
英文官方文档http://www.linuxvirtualserver.org/Documents.html
参考骏马金龙博客http://www.cnblogs.com/f-ck-need-u/p/7576137.html
2、简介
lvs(linux virtual server),linux虚拟服务器,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统,那么负载均衡实现了很好可伸缩性,节点数目可以增长到几千,甚至几万。后期也由很多用户参与开发LVS辅助工具和辅助组件,最出名的就是alexandre为LVS编写的keepalived,它最初专门用于监控LVS,之后又加入VRRP实现高可用功能。
负载调度器,真实服务器群节点一起被称为LVS,LVS负载调度器(有时也称为负载均衡器),接收服务的所有接入服务集群的请求,并决定集群中的哪个节点应该回复其请求。
1)、负载调度器(director):作为整个集群的前端,主要将用户请求分发至真实服务器中进行处理。
2)、真实服务器池:由多个功能相同的真是服务器组成,为用户提供真正的网络服务,如web服务,邮件服务等。且虚拟服务器集群作为一个可伸缩的集群,可自由添加深处真是服务器而并步影响整个集群的正常工作。
3)、共享存储:作用就是让每个用户访问的资源都是一样的,服务器支持写操作,才建议使用
LVS集群的高可用,虽然LVS负载均衡性能很好,但是如果其中节点故障,LVS是无法感知的,因此产生了LVS周边的一个辅助工具KeepAlived,用于监控检查兼容性非常好,如果RS一个节点挂掉,keepalived会将此节点从管理列表中剔出,当节点恢复再拉回管理列表,但是此时的调度器存在单点故障的可能性,所以还必须使用其他软件来实现调度器的高可用,比如hearbeat。
3、常用名词备注
VS:virtual server,虚拟服务器,也叫Director
RS:real server,真正的服务器,集群中的节点
CIP:客户端IP
VIP:virtual IP,director向外部提供服务的IP
RIP:realserver集群节点的服务器网卡IP
DIP:director与RS通信的IP
4、LVS框架
在1998年5月,章文嵩成立了Linux Virtual Server的自由软件项目,进行Linux服务器集群的开发工作。同时,Linux Virtual Server项目是国内最早出现的自由软件项目之一。
Linux Virtual Server项目的目标 :使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。
目前,LVS项目已提供了一个实现可伸缩网络服务的Linux Virtual Server框架,下图所示。在LVS框架中,提供了含有三种IP负载均衡技术的IP虚拟服务器软件IPVS、基于内容请求分发的内核Layer-7交 换机KTCPVS和集群管理软件。可以利用LVS框架实现高可伸缩的、高可用的Web、Cache、Mail和Media等网络服务;在此基础上,可以开 发支持庞大用户数的、高可伸缩的、高可用的电子商务应用。
LVS是四层(传输层tcp/vdp),七层(应用层)的负载均衡工具,用的最多的是就是四层负载均衡功能的ipvs,七层的内容分发负载ktcpvs(kenrnel tcp virtual server),基于内容的调度,因为应用层交换处理复杂,但伸缩性有限,目前还不成熟
ipvs是集成在内核中的框架,ipvs是真正生效实现调度的代码,可以通过用户空间的程序ipvadm工具来管理,该工具可以定义一些规则来管理内核中的ipvs,就像iptables和netfilter的关系一样。
ipvadmin,工作在用户空间,负责ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
5、LVS集群的类型,支持的几种模式
在LVS集群中,集群是一个整体,通过负载均衡调度器(director)作为外部通信的中介,因此如何将外部请求转发到内部真是服务器的方式对LVS集群分类,LVS四种方式:网络地址转换(LVS-NAT),直接路由(LVS-DR),IP隧道(LVS-TUN)、LVS-FULLNAT,一个负载均衡器上可以实现多种转发方式,一般用一种方式即可。
二、LVS集群架构图示
1、用户访问从CIP到达VIP
2、负载均衡器DIP到达交换/路由器
3、最后到达后端的RIP真实的服务器
三、LVS在内核中的过程
1、当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往内核空间。
2、PREROUTING链收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链。
3、IPVS工作在INPUT链上,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行对比,如果用户请求的就是定义的集群服务,那么IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链。
4、POSTROUTING链接收数据包后发现目标IP地址刚好时自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器。
四、内核空间和用户空间的交互
ipvsadmin定义lvs服务监听的ip和port,并发送给ipvs,而ipvs是工作在netfilter的input钩子上的程序,当input链中有目标ip属于lvs服务的请求报文时,ipvs就会修改该报文的链路,使其不进入用户空间而直接转到postrouting链上,并转发给其中一台real server。
五、LVS 4种工作模式介绍
1、lvs-nat 网络地址转换模式
大多数商品化的IP负载均衡硬件都是使用此方法,如Cisco的LocalDirector、F5的Big/ip。详细介绍4个步骤如下:
1)客户端发送请求到达director
2)director根据负载均衡算法改写目标地址为后端的RIP并转发给该后端主机,和NAT一样
3)当后端主机(RS)处理完请求后,将响应数据交给director
4)Director改写源地址为VIP后传给客户端
关于这种模式
1、RIP和DIP一般处于同一私有网段中。但并非必须,RS的网关要指向DIP,这样能保证将响应数据交给Director
2、支持端口映射,可修改请求报文的目标端口;
3、VS/NAT模式的最大缺点使Director负责所有进出数据:不仅处理客户端发起的请求,还负责将响应传输给客户端。而响应数据一般比请求数据大得多,调度器Director容易出现瓶颈。(也就是像7层负载的处理方式一样,但却没有7层负载那么多功能)
4、vs必须使linux系统,RS可以是任何系统
缺点:在整个过程中,所有输入输出的流量都要经过LVS调度器,调度器网络I/O压力就会非常大,因此很容易称为瓶颈,特别使对请求流量很小,而响应流量很大的web类应用来说更为如此;
优点:NAT模式配置管理简单,由于使用了NAT技术,LVS调度器及应用服务器可以在不同网段中,网络架构灵活,应用服务器只需要进行简单的网络设定即可加入集群。
2、lvs-dr 直接路由模式
1)、客户端发送请求到达director,也就是CIP:VIP ;
2)、director将请求报文重新封装一个mac地址首部dip-mac:rip-mac,所以DIP和RIP需要相同的物理网络实现arp通信,源IP地址和目标IP地址不变,只是修改源mac地址为DIP的mac地址,目标mac地址改为RIP的mac地址;然后发送给RS;
3)、RS发现目标地址是自己的MAC地址处理报文,并且RS本地会还接口Lo配置为VIP,响应报文从Lo的VIP发送给eth0网卡,所以响应报文首部cip-mac:Lo-mac,最后响应报文直接发送给客户端,此时源ip地址为VIP,目标地址为CIP;
注意:RS,director都有VIP,所以要确保请求报文只发送到director,常见的方法修改RS的内核参数arp_ignore、arp_announce设置为1,使RS不影响其他主机的ARP通信。
补充:两个内核参数设定说明
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
arp_ignore 定义是否相应
0,默认,收到请求我只要有这个地址就响应
1、请求报文从哪个地址进来的,就只能这个接口地址响应
arp_announce 是否介绍通告,是否通知别人
0,默认的,全部通告
1,尽量避免,不通告不同网段的
2,不通告不同网段的
关于这种模式:
1)确保前端路由器将目标ip为vip的请求报文发往director
a、在前端网关做静态绑定;
b、在RS上使用arptables;
c、在RS上修改内核参数以限制arp通告即应答级别;
arp_announce
arp_ignore
2)、RS的RIP可以使用私网或公网地址;
3)、RS跟director在同一物理网络;
4)、请求报文经由director,响应报文直接发往client;
5)、此模式不支持端口映射;
6)、RS支持大多数的OS;
7)、RIP的网关不能指向DIP,以确保响应报文不经由director;
缺点:LVS调度器及应用服务器在同一个网段中,因此不能实现集群的跨网段应用。
优点:直接路由转发,通过修改请求报文的目标mac地址进行转发,效率提升明显
3、lvs-tun IP隧道模式
1)、客户端将请求发送前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
2)、负载均衡器收到报文后,发现请求的在规则里面存在的地址,它将请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS;
3)、RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己Lo接口上的VIP,所以会再次处理请求报文(这种2次分装解封装的过程,就称为隧道模式)并将响应报文通过Lo接口送给eht0网卡然后直接发给客户端,这种模式也是需要设置Lo接口为VIP,并且不能在公网上
关于这种模式:
1)、DIP、VIP、RIP、都应该是公网地址;
2)、RS的网关不能指向DIP;
3)、请求报文要经由Director,响应报文不经由director;
4)、不知道端口映射
5)、RS的操作系统需要支持隧道功能
缺点:需要租用大量IP,特别是后端服务器使用较多的情况下
优点:LVS调度器将TCP/IP请求重新封装发给后端服务器,后端应用服务器之间通过IP隧道来进行转发,可以存在于不同的网段中
4、lvs-fullnat
1)、客户端对VIP发起请求;
2)、director接收请求,发现是请求后端集群,对请求报文做full nat,源IP改为DIP,目标IP转换为任意后端RS的RIP,然后发往后端;
3)、RS收到请求后,进行响应,源IP为RIP,目标IP为DIP,内部路由到director;
4)、director收到响应报文后,进行full nat,源地址改为VIP,目标地址改为CIP;
关于这种模式:
1)、VIP是公网地址,RIP和DIP是死亡地址,且通常不在同一网络,因此RIP的网关一般不会指向DIP;
2)、RS收到的请求报文地址是DIP,因此只需响应给DIP,但director还要将其发往client;
3)、请求和响应报文都经由director;
4)、支持端口映射;
这种模式就像DNAT,它通过同时修改请求报文的源IP地址和目标IP地址进行转发,另外此模式还不是正式版本,需要在官方网站下周源码,编译系统内核才能使用。
六、三种类型比较
七、LVS的调度方法scheduler
负载均衡器可用于做出该决定的调度方法分成两个基本的类别,静态调度和动态调度
1、静态调度,根据算法本身进行调度
1)RR:round robin,轮询
通过轮询的调度算法,就会分配的比较多,无论后端端真实服务器负载状态如何都会平均轮询调度。
2)WRR:weightd round robin,带权重的轮询
带权重的轮询
3)SH:source hashing源地址hash
将来自同一个ip的请求始终调度至同一RS
4)DH:destination hashing目标地址hash
将同一个目标的请求始终发往同一个RS
2、动态调度,根据算法及各RS的当前负载状态进行调度
1)、LC:least connection,最少连接
通过监控后端RS的连接数,根据TCP协议种的某些计算器来判断,将请求调度已建立的连接数最少后端的真实服务器上。
计算方法:overhead=active*256+lnactive,overhead越小,表示负载越低
2)、WLC:weight lc,加权的lc
计算方法:overhead=(active*256+lnactive)/weight
3)、SED:shortest expertion delay,最短期望延迟
计算方法:overhead=(active+1)*256/加权,数目最小,介绍下次请求。
4)、NQ:never queue,永不排队
无需排队,如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算,保证不会有一个主机很空闲。
5)、LBLC:locality-based least connection,基于本地的最小连接,为动态的DH算法
该算法根据请求的目标IP地址找出该目标IP 地址最近使用的real server,若该服务器是可用的且没有超载,就会使用“最少连接来挑选一台可用的服务器,将请求发送到该服务器。
6)、LBLCR:replicated lblc,带复制功能的lblc,是dh算法的一种改进
该算法根据请求的目标IP地址对应的服务器组,按“最小连接”原则从服务器组种选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群种选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器,同时,当该服务器组有一段时间没被修改,将最忙的服务器从服务器组中删除,以降低复制的成都。
转载请注明出处:https://www.cnblogs.com/zhangxingeng/p/10497279.html
LVS负载均衡原理的更多相关文章
- 网络:LVS负载均衡原理
LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上.为 ...
- LVS 负载均衡原理详解
LVS简介 LVS是一个开源软件,由章文嵩博士于1998年5月创立,可以实现Linux平台下的简单负载均衡.LVS是Linux Virtual Server的简写,是一个虚拟的服务器集群系统. LVS ...
- (转)详解LVS负载均衡之三种工作模型原理和10种调度算法
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://linuxnx.blog.51cto.com/6676498/1195379 LV ...
- LVS实现负载均衡原理
负载均衡集群是load balance 集群的简写.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备有F5.NetsNetscale.这里主要是学习lvs. === ...
- LVS负载均衡机制之LVS-DR模式工作原理以及简单配置
本博文主要简单介绍一下LVS负载均衡集群的一个基本负载均衡机制:LVS-DR:如有汇总不当之处,请各位在评论中多多指出. LVS-DR原理: LVS的英文全称是Linux Virtual Server ...
- (转)使用LVS实现负载均衡原理及安装配置详解
使用LVS实现负载均衡原理及安装配置详解 原文:https://www.cnblogs.com/liwei0526vip/p/6370103.html
- LVS实现负载均衡原理及安装配置
LVS实现负载均衡原理及安装配置 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F ...
- LVS实现负载均衡原理及安装配置 负载均衡
LVS实现负载均衡原理及安装配置 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F ...
- LVS负载均衡IP隧道模式原理介绍以及配置实战
LVS 基本工作原理 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数 ...
随机推荐
- Java Servlet 2.5 设置 cookie httponly
Servlet 3.0 有 cookie.setHttpOnly(true); 多么人性化, Servlet 2.5 是没有这个方法的要这个曲线救国:cookie.setPath("; Ht ...
- 干货,一文带你超详细了解 Filter 的原理及应用
提出问题 1.我们在访问后台很多页面时都需要登录,只有登录的用户才能查看这些页面,我们需要 在每次请求的时候都检查用户是否登陆,这样做很麻烦,有没有一种方法可以在我们请求之 前就帮我们做这些事 ...
- TypeScript 实现任务队列
业务中经常会有一些批量操作的任务,比如使用 JavaScript 预加载一组图片,批量上传一些资源.如果这些任务一次性启动,势必会消耗很多资源和带宽.理想的做法应该对这些任务进行限制,比如一次只跑几个 ...
- CentOS7搭建本地YUM仓库,并定期同步阿里云源
CentOS7同步阿里云镜像rpm包并自建本地yum仓库 系统环境 # cat /etc/centos-release CentOS Linux release 7.6.1810 (Core) # u ...
- 性能测试入门 — LoadRunner 使用初探
前言: 性能测试是利用产品.人员和流程来降低应用程序.升级程序或补丁程序部署风险的一种手段.性能测试的主要思想是通过模拟产生真实业务的压力对被测系统进行加压,验证被测系统在不同压力情况下的表现,找出其 ...
- Linux文件属性及权限
一.Linux文件属性: 例如: drwxr-xr-x 2 hdy hdy 4096 11月 28 00:18 桌面 drwxr-xr-x 2 hdy hdy 4096 11月 28 00:18 桌面 ...
- [Leetcode]643. Maximum Average Subarray I
Given an array consisting of n integers, find the contiguous subarray of given length k that has the ...
- 初探奥尔良(Orleans)
由于工作上关系目前经常被各种并发数据问题搞得焦头烂额,要么要性能舍弃数据上得一致性,要么要一致性但是却得到了特别糟糕的响应.难道鱼和熊掌真的无法兼得吗? 然后找到了类似奥尔良这种基于Actor模型的k ...
- sun.misc jar包
一直以来Base64算法的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder来进行的.但是这个类是sun公司的内部方法,并没有在Java API中公开过,不属 ...
- mysql 多实例部署
Centos7.6 部署3个Mariadb 实例 [root@localhost ~]# yum install mariadb-server -y # 创建对应的目录文件 [root@localho ...