1998年,章文嵩博士成立了Linux Virtual Server的自由软件项目,进行Linux服务器集群的开发工作。

他的目标是:使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

LVS到现在已经使用的非常广泛了,绝大部分国内的互联网企业用它来做四层的负载均衡组件。

我们分2-3篇博客来介绍LVS,包括从原理到实际的部署等方面。




LVS 做了什么工作?

当客户端向服务端发送请求,请求首先到LVS的服务器上。

  1. LVS选择一个服务器作为响应本次请求的真实服务器(Real Server)
  2. 将请求转发到 Real Server
  3. 将 Real Server 的回应转回客户端(某些模式下没有这一步)

归结起来,LVS做了两件很重要的事情:

  1. 挑选服务器
  2. 转发请求

下面就对这两个过程进行描述。在那之前,为了能更清楚的叙述,需要先认识一些名词:

  • Director 运行LVS的服务器,也叫 Virtual Server

LVS并不能直接提供服务,需要后端服务器提供真正的服务

  • RIP 实际提供服务的IP
  • RS 实际提供服务的服务器(Real Server)

一台Director至少提供两个IP,一个用来对外提供服务(一般为公网),一个用来向后端服务器转发请求:

  • VIP Virtual Server 对外提供服务的虚拟IP(Virtual IP)
  • DIP Virtual Server 用于转发的IP(Director IP)

向服务器发出请求的称为Client

  • CIP 客户端IP(Client IP)

转发请求

LVS在转发请求的方式一共有三种,各有优劣

1 Network Address Translation(VS/NAT)

全称 Virtual Network via Network Address Translation。

这种方法是通过NAT的方式来实现负载均衡。



如上图

  1. 当一个请求到达Director,其 源IP|目的IP 为 CIP|VIP;
  2. Director将包的目的IP改为RIP,包地址为:CIP|RIP;
  3. RS处理请求后,将结果返回,包地址为:RIP|CIP;
  4. 返回的包经过Director时,将其包地址改为:VIP|CIP

当包从RS返回时,其地址为RIP|CIP。如何保证包一定会经过Director呢?需要将所有的RS的Gateway设置为DIP。这需要DIP和RIP在同一个网段或Vlan中。

Full-NAT

这是VS/NAT方式的一个变种。原理是在转发到RS上时,将目标地址和原地址全部改写,回给客户端时再改回去。这样的话DIP和RIP可以不在一个网段上,可以实现跨机房,或者异地容灾。

缺点
这种方式的缺点是:request和response全部要经过Director,当RS的数量很多,或者请求量很大时,Director会变成性能瓶颈。

2 Direct Routing(VS/DR)

全称:Virtual Server via Direct Routing。

这是目前较为常用的一种模式,可以避免VS/NAT出现的Director性能问题。



  1. 请求到达Director,将目标MAC改为RS的MAC;
  2. RS处理请求后,将包直接会给Client;

过程很简单,但中间的问题很多:

  1. 更改MAC地址来达到转发的时候,Director 和 RS们必须在同一物理交换机下啊?

    是的,这也是这个模式的缺点,Director必须和RS在同一交换机下。

  2. RS在收到包之后,发现目的IP不是自己的IP,不会去处理,怎么办?

    为了解决这个问题,需要给RS上绑定VIP。

  3. Linux主机的IP和MAC映射关系会通告给整个交换机网络下,这样的话就会出现混乱了,RS和Director都有同样的IP,该发给谁?

    可以通过设置内核参数来决定将哪些网卡通报,哪些不通报。一般来说绑定在lo上是最省事的。

  4. Linux包从某个网卡出去,此网卡必须有某个IP才能以此IP为源地址出去,VIP现在绑定到lo上,如何能回包?

    为了解决这个问题,需要加主机路由,所有source为VIP的包全部从连通公网的网卡走。

3 IP Tunneling(VS/TUN)



Director收到Client的请求包后,在外层再加上一个IP头为DIP|RIP后封装成IP隧道协议报文,然后发送给real server.

RS一定要可以识别IP隧道协议才可以,拆包后看到还有一个头是CIP|VIP,所以RS就打上VIP|CIP的IP头直接回给Client.


选择服务器

选择服务器本质上就是如何调度请求。LVS提供了下面的几个算法:

1 轮询(Round Robin)

算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

2 加权轮询(Weighted Round Robin)

根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

3 最少链接(Least Connections)

算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。

4 加权最少链接(Weighted Least Connections)

在集群系统中的服务器性能差异较大的情况下,调度器采用加权最少链接调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

5 基于局部性的最少链接(Locality-Based Least Connections)

针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。

6 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)

针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。

7 目标地址散列(Destination Hashing)

根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

8 源地址散列(Source Hashing)

根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。


关于为什么要分篇来写

为什么要分开几篇写不是一篇写完呢?是因为我觉得,博客不是论文,不需要长篇大论一次把事情讲完。利用碎片时间就能读完才是好的。

不占用读者太长时间又能有收获才是我的追求。哈哈哈


作者和出处(reposkeeper) 授权分享 By CC BY-SA 4.0

关注微信公众号,获取新文章的推送!

LVS那些事的更多相关文章

  1. lvs的dr模式分析(二)

      #vim /etc/init.d/lvsdrrip #!/bin/bash #DR server VIP=192.168.46.200 case "$1" in start) ...

  2. Linux LVS Nginx HAProxy 优缺点

    说明:以下内容参考了抚琴煮酒的<构建高可用Linux服务器>第六章内容. 搭建负载均衡高可用环境相对简单,主要是要理解其中原理.此文描述了三种负载均衡器的优缺点,以便在实际的生产应用中,按 ...

  3. ysql+heartbeat+DRBD+LVS实现mysql高可用

    在企业应用中,mysql+heartbeat+DRBD+LVS是一套成熟的集群解决方案,通过heart+DRBD实现mysql的主 节点写操作的高可用性,而通过mysql+LVS实现数据库的主从复制和 ...

  4. LVS Nginx HAProxy 优缺点

    搭建负载均衡高可用环境相对简单,主要是要理解其中原理.此文描述了三种负载均衡器的优缺点,以便在实际的生产应用中,按需求取舍. 目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,软件有LV ...

  5. 使用LVS+keepalived实现mysql负载均衡的实践和总结

    前言 经过一段时间的积累,数据库的架构就需要根据项目不断的进行变化. 从单台数据库,到了两台数据库的主从,再到读写分离,再到双主,现在进一步需要更多的数据库服务器去支撑更加可怕的访问量. 那么经过那么 ...

  6. lvs与nginx区别

    lvs和nginx都可以用作多机负载方案,他们各有优缺点,在生产环境中需要好好分析实际情况并加以利用. 一.lvs的优势: 1.抗负载能力强,因为lvs工作方式的逻辑是非常简单的,而且工作再网络层第4 ...

  7. LVS(五)LVS的持久连接

    什么是持久链接 把某个客户端的请求始终定向到同一应用服务器上.对于LVS来说持久连接和算法没有关系.也就是使用任何算法LVS都可以实现同一客户端的请求转发到之前选定的应用服务器,以保持会话.而且还能实 ...

  8. keepalived + lvs

    Keepalived原理 Keepalived原理 keepalived也是模块化设计,不同模块复杂不同的功能,下面是keepalived的组件 core check vrrp libipfwc li ...

  9. LVS专题-(3) 虚拟ip理解

    1.虚拟IP是什么? 要是单讲解虚拟 IP,理解起来很困难,所以干脆把 动态 IP .固定 IP .实体 IP 与虚拟 IP都讲解一下,加深理解和知识扩展 实体 IP:在网络的世界里,为了要辨识每一部 ...

随机推荐

  1. Mac终端下 连接 ubuntu 16.04 ssh root@*.*.*.* permission denied 问题解决方案

    默认 Ubuntu 不开启 ssh 服务 (1)检查是否开启SSH服务  命令:ps -e|grep ssh  查看SSH服务是否开启,或者通过命令:service sshd status 可以查看某 ...

  2. C# 之 Request

    Request.QueryString(取得地址栏参数值)获取地址栏中的参数,意思就是取得”?"号后面的参数值.如果是多个是用这”&”符号连接起来的.Request.form取得表单 ...

  3. 理解Underscore中的uniq函数

    uniq函数,是Underscore中的一个数组去重函数,给它传递一个数组,它将会返回该数组的去重副本. 1 ES6版本去重 在ES6版本中,引入了一个新的数据结构——set,这是一种类似数组的数据结 ...

  4. MATLAB入门学习(四)

    今天我们开始学编程啦~ 点击左上角的这个进入编程界面 这是新建新的.m文件,也就是matlab命令文件, 一般命令文件不带输入和输出的参数,只是一些命令的组合,带有输入输出参数的文件是函数文件~ 下面 ...

  5. 理解基本包装类型Number,String,Boolean

    在前面我们知道了引用类型是什么了,也就能理解包装类型了.包装对象其实也是一种引用类型,之所以要单独提出来只不过是因为它们可以把原始类型的值变成(包装成)对象,这样它们也就获得了各自类型相应的特殊行为了 ...

  6. PAT——1018. 锤子剪刀布

    大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第1行给出正整数N( ...

  7. Gradle Goodness: Set Java Compiler Encoding

    If we want to set an explicit encoding for the Java compiler in Gradle we can use the options.encodi ...

  8. Unity 游戏框架搭建 (二十三) 重构小工具 Platform

    在日常开发中,我们经常遇到或者写出这样的代码 var sTrAngeNamingVariable = "a variable"; #if UNITY_IOS || UNITY_AN ...

  9. Oracle的分析函数

    Oracle的分析函数row_number(),rank(),dense_rank()的用法与区别 比如查询工资排名第7的员工信息,可以用分析函数来做. --查询工资排名第7的员工信息select * ...

  10. 微信小程序新版用户授权方式处理

    最新更新(2018-12-27): 最近做了改版,做成默认进来就是首页,然后去判断有没有用户信息,没有的话再去判断用没授权过,如果授权过直接自动去获取,没有的话再跳转到授权页面.因为用户授权主要就是针 ...