LVS原理解析

  1. LVS简介

LVS是Linux Virtual Server的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统。该项目由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

负载均衡技术有很多实现方案,如基于DNS域名轮流解析的方法、基于客户端调度访问的方法、基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的就是IP负载均衡技术。

LVS的IP负载均衡技术是通过ipvs内核模块来实现的,ipvs是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问集群服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是ipvs实现的重点技术,ipvs实现负载均衡机制有四种,分别是NAT、TUN和DR以及后来经淘宝开发的FullNat。

  1. LVS的工作机制

lvs分为两个部件:ipvs和ipvsadm

ipvs:工作于内核空间,主要用于使用户定义的策略生效

ipvsadm:工作于用户空间,管理集群服务的命令行

如上图所示,ipvs工作于内核空间的INPUT链上,当收到用户的请求为某集群服务时,通过PREROUTING链,经检查本机路由表,送往INPUT链;在进入netfilter的INPUT链时,ipvs强行将请求报文通过ipvsadm定义的集群服务策略的路径改为FORWORD链,将报文转发至后端真实提供服务的主机。

  1. LVS的三种工作类型

LVS有三种工作类型:

NAT:地址转换

DR:直接路由

TUN:隧道

各类术语介绍:CIP为客户端IP,VIP为虚拟ip,DIP为Director的ip,RIP为后端服务器的ip

  1. LVS的NAT模型

此模型中,DR需要配置两个网卡分别为vip(公网地址:114.100.80.10)和Dip(私网地址:101.0.0.10),VIP只需要配置到DR上,而DIP需设置为后端服务器的网关地址。

它的工作机制:

①用户发出访问请求,此时源地址:CIP(200.10.10.1),目标地址为VIP(114.100.80.10);

②当DR收到用户的请求,并发现该请求为集群服务请求,则运用LVS调度算法选择后端一台服务器进行响应,并将请求报文目标地址(vip:114.100.80.10)转换成经调度算法计算得出的后端主机IP(RIP:10.0.0.1)地址。此时源地址为CIP(200.10.10.1),目标地址转换为RIP(10.0.0.1);

③后端主机(RIP:10.0.0.1)收到请求后,对该请求进行响应,并发送报文至DR,此时源地址为RIP(10.0.0.1),目标地址为CIP(200.10.10.1);

④由于响应的目标地址为CIP(200.10.10.1),后端服务器无法直接响应client,需要DR将源地址(RIP:10.0.0.1)转换成VIP(114.100.80.10)的地址进行发送响应报文,转换后源地址为VIP(114.100.80.10),目标地址为CIP(200.10.10.1);

NAT的特性:

1> RS应该使用私有地址;

2> RS的网关的必须指向DIP;

3> RIP和DIP必须在同一网段内;

4> 请求和响应的报文都得经过Director;在高负载场景中,Director很可能成为系统性能瓶颈;

5> 支持端口映射;

6> RS可以使用任意支持集群服务的OS;

  1. LVS的DR模型

该类型中,DR上依旧配置有DIP和VIP,VIP配置在网卡别名上。每个RS都有自己的RIP以及在回环别名网卡中配置VIP,但是RS的vip隐藏起来,并不接收任何请求,只有在响应客户端请求时作为源地址使用。

1)client(200.10.10.1)向目标VIP(114.100.80.10)发出请求,通过ARP协议进行广播,找到DR,Director接收。此时源地址为CIP(200.10.10.1),目标地址为VIP(114.100.80.10);

2)DR接受请求后,发现该请求为集群服务,LVS根据负载均衡算法选择一台active的RS,并通过ARP协议进行广播获取RS的MAC(00:0c:29:d2),而后将原来的MAC首部拆除重新封装,将选中的RS的网卡的mac地址作为目标mac地址。此时源地址为CIP,目标地址VIP,但VIP的MAC地址已经更改为RS的MAC地址。

3)RS在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文.随后重新封装报文,发送给客户端.此时源地址为RS中的VIP,目标地址为CIP。

当我们分析上面两个网络模型的数据报时会发现一些问题:

1)由于vip需要在每台主机中配置,如何保证ARP请求报文不会被交换机或其它网络设备知道?

2)如何保证ARP通告报文不被交换机或其它网络设备知道?

3)由于RS只有一个网络接口,而linux内核默认情况下包封装时是从哪个网口出去那个网口就是源地址,如何确保RS转发出来的报文源IP是VIP,而不是RIP?

4)因为DR与RS都配置有相同的VIP,如何避免各主机VIP广播,造成无法通信?

解决办法:

1)Linux内核有两个关于ARP对待请回报文与通告报文的参数(arp_announce/arp_ignore),可以设定相应的级别来规避上述问题中的1、2两点;

2)对于问题3,我们可以在数据报封装后指定路由经lo别名上的接口发送出去然后再通过eth0网卡转发出去;

3)对于问题4,我们只需要设定vip的广播地址为它自己即可;

DR的特性:

1> 集群节点跟Director必须在同一个物理网络中;

2> RIP可以为公网地址,实现远程管理;

3> DR只负责入站请求,响应报文由RS直接发送给客户端;

4> RS不能将网关指向DIP;

5> 不支持端口映射;

6> RS可以使用任意支持集群服务的OS;

  1. LVS-TUN

在数据包必须传递到另一个网络或因特网上时,可以使用ip隧道,ip隧道能够将数据包从一个子网或虚拟局域网(VLAN)转发到另一个子网或虚拟局域网(VLAN),建立ip隧道是Linux内核功能的一部分,LVS-TUN转发方法允许你将集群节点放在与Director不同的网络上。

请留意DR将数据包转发给RS时的IP数据报文;由于DR,RS都不在同一局域网内,而DR要将client请求报文转发给RS时,DR是直接在数据包中直接添加IP首部(源IP:DR和目标IP:RS),这样就是隧道技术了。

同样,该模型下RS都将配置VIP地址,且不能被外界所获知VIP存在于RS上;

参考:http://junwang.blog.51cto.com/5050337/1439428

时间: 2024-08-13 16:13:01

LVS原理解析的相关文章

LVS 工作原理解析

LVS即Linux Virtual Server,淘宝大牛章文嵩读博士时发起的开源软件项目,是性能非常好的四层负载均衡集群服务,Linux内核2.4以后已经被直接收录至内核. LVS的工作模式: 在了解工作模式之前首先要晓得为什么会有不同的工作模式,用户的请求进来会先发送到director(virtual server),然后director通过一定的调度算法把请求比较公平的分发到后端的real server,那么自然由real server响应回去给用户. 本文中提到的缩写解释: VIP: D

Lvs原理及简单实现

Lvs原理及简单实现 大纲: 一.集群概述 二.什么是Lvs?(what) 三.为什么要用Lvs?(why) 四.什么时候需要用Lvs?(when) 五.什么地方需要用Lvs?(where) 六.什么人来部署Lvs?(who) 七.Lvs支持的三种模式与十种算法(Scheduler) 八.如何部署Lvs之NAT模式?(How) 九.如何部署Lvs之DR模式? 一.集群简介: 计算机集群(Cluster)技术可以通过网络连接把一组互相独立工作的计算机高度紧密的连接起来,从而高效可靠的共同完成协同任

MyBatis框架中Mapper映射配置的使用及原理解析(七) MapperProxy,MapperProxyFactory

从上文<MyBatis框架中Mapper映射配置的使用及原理解析(六) MapperRegistry> 中我们知道DefaultSqlSession的getMapper方法,最后是通过MapperRegistry对象获得Mapper实例: public <T> T getMapper(Class<T> type, SqlSession sqlSession) { final MapperProxyFactory<T> mapperProxyFactory =

Android中微信抢红包插件原理解析和开发实现

一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导致了.或许是网络的原因,而且这个也是最大的原因.但是其他的不可忽略的因素也是要考虑到进去的,比如在手机充电锁屏的时候,我们并不知道有人已经开始发红包了,那么这时候也是让我们丧失了一大批红包的原因.那么关于网络的问题,我们开发者可能用相关技术无法解决(当然在Google和Facebook看来的话,他们

MyBatis框架中Mapper映射配置的使用及原理解析(三) 配置篇 Configuration

从上文<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 我们知道XMLConfigBuilder调用parse()方法解析Mybatis配置文件,生成Configuration对象. Configuration类主要是用来存储对Mybatis的配置文件及mapper文件解析后的数据,Configuration对象会贯穿整个Mybatis的执行流程,为Mybatis的执行过程提供必要的配

MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder

在 <MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用> 的demo中看到了SessionFactory的创建过程: SqlSessionFactory sessionFactory = null; String resource = "mybatisConfig.xml"; try { sessionFactory = new SqlSessionFactoryBuilder().build(Resources .getResourceAsRea

Spring Boot启动原理解析

Spring Boot启动原理解析http://www.cnblogs.com/moonandstar08/p/6550758.html 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面纱,让它不在神秘. 正文 我们开发任何一个Spring Boot项目,都会用到如下的启动类 从上面代码可以看出,Annotation定义(@Sp

游戏外挂原理解析与制作 - [内存数值修改类 篇一]

本章旨在讲解外挂实现原理,未深入涉及至代码层面.希望能与对这方面感兴趣的朋友多多交流,毕竟理论是死的,套路是固定的,只有破解经验是花大量时间和心血积累的. 对于单机游戏而言,游戏中绝大部分的参数(比如血.蓝.能量亦或是金币)都存储在计算机的堆栈中,一些类似剧情进度的则加密后写入本地的自定义配置文件中: 对于页游.网游和手游,虽然服务器保存了大量的重要的参数,但由于客户端不可避免的需要进行大量的计算和资源的加载,本地内存种必定存有部分的临时变量,通过判断这些变量的变化规律和函数的破密寻到利于自身的

JSONP跨域的原理解析

JSONP跨域的原理解析 一种脚本注入行为 在 2011年10月27日 那天写的     已经有 99238 次阅读了 感谢 参考或原文 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进