初识LVS和LVS_NAT
如果一台服务器承受过多的压力,那么服务可能会崩溃,所以,我们应该让一台服务器承受的压力在合理范围内,但是如果服务端必须要承受较大的压力,那么一台服务器可能无法满足我们的要求,所以我们可以使用多台服务器分摊这些压力,当一定数量的服务器作为一个整体对外提供服务,并且分摊压力时,那么我们可以称这些服务为“负载均衡集群”。
使用LVS即可实现“负载均衡集群”。
LVS是Linux Virtual Server 的缩写,从字面意思上翻译,LVS应该译为“Linux虚拟服务器”,但是这样的翻译对于初学者来说可能不容易理解,我们暂且不用纠结,等了解完了概念,我们自然会明白它的含义。
通过LVS实现负载均衡集群的方案属于“软件方案”,当然,既然有“软件方案”那么肯定有对应的“硬件方案”,但是,硬件方案所需的成本比较高,我们需要购买特定的负载均衡硬件设备,以达到负载均衡的目的,比较知名的负载均衡硬件设备厂商有F5,Citrix等,但是硬件方案并不是此处讨论的重点,我们了解即可。而能够实现负载均衡之目的软件也不只有LVS一种,我们也可以通过nginx,haproxy等软件实现负载均衡的目的。当然,这篇文章就是介绍LVS的,所以其他方法我们不用理会,先来看看LVS是怎样实现负载均衡的。
LVS有多种模式(或者称为模型),在不同的模型下,LVS实现负载均衡的方式也不同,也就是说,我们可以不同的“姿势”来配置LVS,但是为了尽量降低我们认识的LVS的门槛,我们可以先从较为简单的,容易理解的模式开始。
我们先了解一下LVS的NAT模型(此模型较为容易理解),LVS-NAT模型结构示意图如下。

上面所示意的场景中,有三种角色。负载
角色—:客户端
角色二:LVS服务器,我们说过,LVS是实现负载均衡的软件方案,所以,上图中的LVS主机即安装了LVS的服务器。
角色三:真正用来分摊压力,处理请求的服务器,我们称之为RealServer
上图中的LVS服务器与各个RealServer组成了一个“负载均衡”。
聪明如你一定看懂了,上图中,LVS服务器只负责接收来自客户端的请求,然后将客户端请求分派至后端得Realserver上,用户请求被分摊后,真正处理客户端请求得是上图中的RealServer,当RealServer将客户端请求报文处理完毕后,会将响应报文统一返回到LVS所在的服务器,最后再用由LVS服务器将响应报文返回到客户端,上述整个过程中,LVS服务器并没有处理客户端请求,LVS服务器只负责将来自前端的压力尽量均衡的分配至后端主机,真正处理客户端请求的上图中的后端主机(即RealServer),上图为了示意简洁,所以只使用了两台服务器作为RealServer,而在实际使用的过程中,RealServer的数量可以更多。
举个例子,假设上图中的负载均衡集群提供的是web服务,那么上图中的RealServer1服务器RealServer2服务器中都会提前安装好httpd,假设在某一时刻,有1000个请求报文“web”,那么这1000个请求会发往LVS服务器,LVS服务器中并没有安装httpd,所以它也不会去处理这些请求,但是LVS服务器会尽量均衡的将1000个请求报文发送到后端的RealServer中,当RealServer中的httpd处理完这些请求后,由RealServer将对应的响应报文返回LVS,最后再由LVS将响应报文返回给客户端。
所以,我们往往称LVS服务器为“调度器”(Scheduler),或者称LVS服务器为“导演”(director),因为真正干活的(处理请求的)服务器是后端的RealSsrver,LVS服务器只负责调度。
从上图可以看出,LVS服务器是直接面向客户端,所以,LVS服务器必须有一个公网IP,才能服务在互联网上,我们称配置在LVS服务器上的公网IP为VIP,即Virtual IP,在LVS-NAT模型中,负载均衡集群内部的主机都是通过内网IP通讯的,也就是说,LVS-NAT集群内部的主机需要在相同网段的内网中,而集群中的每个主机配置有一个内网IP,LVS服务器当然也属于负载均衡集群内部的主机。所以它也需要配置一个内网IP,我们称配置在LVS服务器上的内网IP为DIP,可以理解为Director IP ,也就是负责调度的导演IP,而每个RealServer上都有一个与DIP在同一网段的内网IP,我们称配置在RealServer上的内网IP为RIP,我们将客户端的IP简称Client IP,即CIP,所有机器的IP配置如下图所示

其实,从名字上也能看出,LVS-NAT模型是利用了NAT的特性,NAT为“Network Address Ttanslation”的缩写,译为“网络地址转换”,什么是“网络地址转换”,在哪场景中需要用到“网络地址转换”,
既然LVS-NAT模型是利用了“网络地址转换”那么,在整个过程中,报文的IP到底发生了怎样的转换呢?通过如下示意图,即可明白报文IP的转换过程,为了使示意图更加简洁明了,图中只画出了一个RealServer,同时,我们可以配合图下方的描述,来理解报文中IP被转换的整个过程。

正如上图所示,客户端的请求会发生LVS主机,此时,客户端请求报文的源IP为CIP,目标IP的LVS的VIP,当LVS收到客户端的请求报文时,会将请求报文中的目标IP修改为后端某个RealServer的RIP,就以上图为例,当LVS收到客户端请求报文时,会将报文中VIP修改为RIP1或者RIP2,具体将VIP修改为哪个RealServer的RIP,取决于LVS使用的具体算法,最好理解的负载均衡算法就是轮询算法了,用大白话说,轮询算法就是如果这次将报文的目标IP修改为RIP1,那么下次就将目标IP被修改为RIP2,在下次就再将目标IP修改为RIP1,以此类推,当然,除了轮询算法,还有很多别的算法可供我们选择,但是此处我们暂时先不考虑这么多,当客户端请求报文的目标IP被修改对应的RIP后,请求报文的源IP为CIP,目标IP已经改为RIP,那么报文自然会被LVS转发到对应的RealServer中,当RealServer收到对应的请求报文时,会发现报文的目标IP就是自己的RIP,于是就会收到报文,处理后进行响应,因为RealServer收到请求报文时,源IP为CIP,目标IP为RIP,所以RealServer在进行响应时,响应报文的源IP则为RIP,目标IP则为CIP,但是CIP对于RealServer来说肯定不在一个网络内,因为CIP是一个公网IP,所以,我们要将所有RealServer的网关指向DIP,当RealServer产生响应报文时,会将响应报文发往网关DIP,而DIP就是LVS的内网IP,当LVS收到对应的响应报文时,响应报文的源IP为RIP,目标IP为CIP,此时,LVS会将响应报文的源IP修改为VIP,修改后的响应报文的源IP为VIP,目标IP为CIP,于是响应报文被发往客户端,客户端会收到响应报文,其实上述整个过程是一个DANT的过程,所以,此种LVS模型被称之为LVS-NAT模型。
上图中,LVS服务器主要负责调度,所以,我们也称上图中的LVS主机为调度器,聪明如你一定想到了,我们需要在角色为调度的主机一定的配置,比如,我们需要定义,当客户端访问调度器的VIP+80端口时,就表示客户端想要访问http服务,当然,对于客户端来说,LVS集群是透明的,客户端并不知道有一个“集群”的存在,客户端只知道访问VIP:80时,可以访问到自己的需要的网页,但是我们则必须清楚整个集群结构的来龙去脉,所以,我们需要在调度器上配置,当客户端访问VIP+80端口时,就代表客户端访问了一个“http集群”,同时,我们需要定义这个集群中那些主机扮演“RealServer”,还需要定义调度通过什么算法,将请求负载到后端的RealServer中。
如果我们想要实现这些定义,需要借助一个管理工具,它就是ipvsadm
我们可以将ipvsadm理解成一个用户工具,我们需要借助这个工具定义LVS集群规则。
但是,我们通过ipvsadm定义的规则最终还要依靠ipvs才能生效,我们可以这样理解,ipvs才是核心,但是作为管理员,我们需要通过ipvsadm才能定义规则,ipvs会根据我们定义的规则进行工作,ipvsadm工作用户空间,ipvs工作于内核空间,ipvsadm与ipvs的关系,就好比iptables与netfilter的关系。
综上所述,LVS由两部分组成,ipvs与ipvsadm
ipvsadm:管理工具,管理员通过ipvsadm定义或管理集群规则。
ipvs:LVS核心实现,根据定义好的集群规则进行工作。
其实,ipvs是netfilter结合在一起的使用的,2.4.X版本以后的内核中,ipvs作为netfilter的模块存在。
还记得iptables中的5条链吗?如果你忘了,请回顾本博客的iptables系列文章,而ipvs其实就是附属在INPUT链上进行工作的,示意图如下

当客户端访问服务时,会访问VIP+端口,所以,客户端的请求报文会发往调度器,请求报文会先经过PREROUTING链,然后进行路由判断,由于此刻报文的目标IP为VIP,而VIP对于调度器来说,就是本身的IP,所以报文会经过INPUT链,此刻,如果IPVS发现报文访问的VIP+端口与我们定义的LVS集群规则相符,ipvs则会根据定义好的规则与算法,将报文直接发往POSTROUTING链,然后报文则会发出,最后到达后端的RealServer中。
好了,LVS-NAT模型以及ipvs工作的大致原理我们已经了解完了。只要动手定义好对应的规则,即可配置出一个LVS集群,但是,我们还没有介绍过怎样使用ipvsadm,那么现在,我们就来聊聊,怎样使用ipvsadm命令定义规则。
如果你很熟悉iptables命令,那么了解ipvsadm命令就会非常轻松,因为他们有异曲同工之妙。
初识LVS和LVS_NAT的更多相关文章
- 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡
一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...
- 借助LVS+Keepalived实现负载均衡(转)
原文:http://www.cnblogs.com/edisonchou/p/4281978.html 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务 ...
- LVS+Keepalived实现mysql的负载均衡
1 初识LVS:Linux Virtual Server 1.1 LVS是什么 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起 ...
- LVS (Linux Virtual Server) 负载均衡
[大型网站技术实践]初级篇:借助LVS+Keepalived实现负载均衡 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服 ...
- 借助LVS+Keepalived实现负载均衡
原文地址:http://www.cnblogs.com/edisonchou/p/4281978.html 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了 ...
- 借助LVS+Keepalived实现负载均衡(转)
出处:http://www.cnblogs.com/edisonchou/p/4281978.html 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务 ...
- 【转】借助LVS+Keepalived实现负载均衡
一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...
- 1. 企业级调度器LVS初识、工作模式详解
想学习更多相关知识请看博主的个人博客 1. LVS官网 LVS 时全球最流程的四层负载均衡开源软件. LVS 官网:http://www.linuxvirtualserver.org/ 2.Linux ...
- LVS集群之NAT模式实现
LVS集群之NAT模式实现 一.集群的种类 集群系统主要分为 1.HA:高可用集群,又叫双机热备. (a)原理 2台机器A,B,正常是A提供服务,B待命闲置,当A宕机或服务宕掉,会切换至 ...
随机推荐
- element UI实现动态生成多级表头
一.效果图 二.封装两个组件,分别为DynamicTable.vue和TableColumn.vue,TableColumn.vue主要是使用递归来对表头进行循环生成 DynamicTable.vue ...
- 结构体structure
结构体是值类型 import Foundation struct TV{ var keyName="a" var keyNumber=9 func getKey()->Int ...
- Python全栈开发之4、迭代器、生成器、装饰器
一.迭代器 1.为何要有迭代器? 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集合.文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依 ...
- 2019牛客暑期多校训练营(第八场)-C CDMA(递归构造)
题目链接:https://ac.nowcoder.com/acm/contest/888/C 题意:输入m(为2的n次幂,n<=10),构造一个m*m的矩阵满足任意不同的两行的元素乘积和为0. ...
- P1417 烹调方案(思维+01背包)
(点击此处查看原题) 题意 有n种食材,每种食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间.问在T时间内,什么样的烹调方案 ...
- Smarty内置函数之capture
capture的作用是: 捕获模板输出的数据并将其存储到一个变量,而不是把它们输出到页面,任何在 {capture name="foo"}和{/capture}之间的数据将被存储到 ...
- 使用Iview时候 报:no-parsing-error Parsing error: x-invalid-end-tag 解决办法
解决办法有两种解决办法: 1.MenuItem修改为:menu-item 2.在根目录下 .eslintrc.js 文件 rules 下添加: "vue/no-parsing-error&q ...
- 怎样在 Vue 里面使用自定义事件将子组件的数据传回给父组件?
首先, Vue 里面的组件之间的数据流动是 单向 的, 数据可以从父组件传递给子组件, 但不能从子组件传递给父组件, 因为组件和组件之间是 隔离 的. 就像两个嵌套的 黑盒子 . 能通过 props ...
- 怎样使用 Vue 的监听属性 watch ?
需求: 我需要在某个数据变化时能够执行特定的动作, 比如我在输入框中输入数字 88, 系统检测到以后就会弹窗 拜拜 , 而输入其他字符则不会触发, 这种需求简直多入牛毛, 实际上这就是 自定义事件 , ...
- docker-compose.yml 部署Nginx、Java项目、MySQL、Redis
version: "3.7" services: nginx: image: nginx restart: always container_name: nginx environ ...