草庐IT

LVS 负载均衡

AskaJohnny 2023-04-17 原文

LVS 负载均衡

本篇主要介绍一下 lvs 是什么 以及它的 nat 模式的搭建 配合nginx来演示

1.概述

LVS 是 Linux Virtual Server 的简写 (Linux 虚拟服务器 ), 是由章文嵩博士主导, 它虚拟出一个服务器集群,然后进行负载均衡的项目, 目前LVS 已经被集成到Linux内核模块中了, 外部请求到达LVS后它会根据不同的调度算法把请求分发到具体的后端真实服务器, 又根据LVS不同的工作模式 后端服务器会选择不同的方式将 响应数据返回, LVS工作模式分为 NAT模式, TUN模式, DR模式

2.思考

为什么有LVS , 当我们有了 nginx的时候 直接把nginx暴露出去不就行了吗, nginx 也是负载均衡器啊 ??

因为Nginx工作在 7 层 而 LVS工作在四层 效率高 , 如果你单个把nginx暴露出去 单台nginx 承受不了压力,需要集群, LVS则充当了Nginx的集群调度者,所有的请求都通过LVS ,仅作请求分发用,没有流量, 正常不会出现故障

为什么四册比七层效率高?

四层是TCP层,使用IP+端口四元组的方式。只是修改下IP地址,然后转发给后端服务器,TCP三次握手是直接和后端连接的。只不过在后端机器上看到的都是与代理机的IP的established而已,LVS中没有握手。

7层代理则必须要先和代理机三次握手后,才能得到7层(HTT层)的具体内容,然后再转发。意思就是代理机必须要与client和后端的机器都要建立连接。显然性能不行,但胜在于七层,人工可操作性高,能写更多的转发规则。

nginx 支撑 1w - 10w并发;

lvs 支撑 10w - 50w;

F5 支撑 200w - 1000w;

3.LVS NAT 模式

NAT 模式(即:网络地址映射)其工作原理是:客户端访问LVS时,LVS通过重写请求报文的目标地址,且根据预设的调度算法,将请求分派给后端真实服务器,真实服务器接收到请求处理后,发出响应报文也需要通过LVS返回,返回时需要修改报文的源地址,然后返回给客户,完成整个负载调度过程

  1. DNAT:目标地址转换,改变的是目标地址
  2. SNAT:源地址转换,改变的是源地址

NAT 模式就是使用 SNAT 和 DNAT 技术完成报的转发,NAT 方式可支持任何的操作系统,以及私有网络,并且只需一个 Internet IP 地址,非常节省成本,但是整个系统的性能受到限制。因为NAT模式 响应报文也要经过LVS 会影响LVS 的性能, 不过有DR模式 (Direct Route) 后面有机会在讨论

环境准备

角色 IP地址 主机名 服务或工具
Director (LVS) VIP(ens256):172.30.2.151, DIP(ens160):172.16.225.222 lvs ipvsadm
RS1 RIP1(ens160):172.16.225.111 nginxRs1 nginx
RS2 RIP2(ens160):172.16.225.110 nginxRs2 nginx

  • CIP 客户端的 IP
  • VIP 是域名解析的 IP,是集群对外的公网 IP
  • DIP 用来和后端真实服务器进行数据交互的 IP,请求报文转发给后端服务器从此口出去 ( DIP RIP 需要在同一个网段中)
  • RIP 真实服务器的 IP

4.LVS NAT 模式搭建环境

下面开始搭建 LVS 的 NAT模式环境

4.1 LVS服务器网卡配置

LVS 需要2个网卡 一个是对外的 用于作为VIP , 一个是内部网络 和 后端真实IP 一个网段的,我这里用虚拟机模拟 VIP用桥接网卡 , DIP用仅主机网卡即可

网络配置在 /etc/sysconfig/network-scripts 就不详细说了

cat ifcfg-ens160

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
NAME=ens160
UUID=7d9bac74-252c-49fd-b174-8c4aa6ee65b6
DEVICE=ens160
ONBOOT=yes
IPADDR=172.16.225.222
NETMASK=255.255.255.0
DSN1=114.114.114.114
# 这里作为DIP 不配置GATEWAY 不让外网直接访问这个ip

cat ifcfg-ens256

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
NAME=ens256
DEVICE=ens256
ONBOOT=yes
IPADDR=172.30.2.151
GATEWAY=172.30.2.2  
NETMASK=255.255.255.0
DSN1=114.114.114.114

4.2 真实nginxRs1 配置

注意点 就是把要把网关配置为 DIP

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
DEVICE=ens160
ONBOOT=yes
IPADDR=172.16.225.110
GATEWAY=172.16.225.222 # 注意要把网关改成 DIP 的 因为DNAT后需要去处理分发过来的请求
#GATEWAY=172.16.225.2 
NETMASK=255.255.255.0
DNS1=114.114.114.114

并且在这个机器上配置好 一个nginx

4.3 真实nginxRs2 配置

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
DEVICE=ens160
ONBOOT=yes
IPADDR=172.16.225.111
GATEWAY=172.16.225.222 # 注意要把网关改成 DIP 的 因为DNAT后需要去处理分发过来的请求
#GATEWAY=172.16.225.2 
NETMASK=255.255.255.0
DNS1=114.114.114.114

并且在这个机器上配置好 一个nginx

4.4 配置LVS 的 ipvs模块 (通过ipvsadm配置)

ipvs模块是已经集成到 linux内核了,可以通过ipvsadm 工具去

开启ip_forward , 开启路由转发

# 开启ip_forward
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

sysctl -p
#安装LVS管理工具
yum -y install ipvsadm

# 可以通过 ipvsadm -Ln 查看虚拟服务, 此时是没有配置的

#使用 ipvsadm 命令设置转发规则  
#-A 添加虚拟服务器
#-t 表示 TCP 的服务 VIP:PORT
#-s 指定调度算法 rr 表示 round-robin 平均轮循
#-a 表示添加 real server 的地址
#-r 指定 real server 的 IP 地址
#-m 表示 masquerade 也就是 NAT 方式的 LVS  
#-g 表示 dr模式 后面有机会说
[root@lvs ~] ipvsadm -A -t 172.30.2.151:80 -s rr
[root@lvs ~] ipvsadm -a -t 172.30.2.151:80:80 -r 172.16.225.110 -m
[root@lvs ~] ipvsadm -a -t 172.30.2.151:80:80 -r 172.16.225.111 -m

再次查看 可以看到配置如下

简单的 curl 测试一下 : 可以看到效果已经出来了 我们访问了 172.30.2.151 这个 vip 轮训路由到后端2台真实服务器的nginx了

ab 压测一下: 使用ab工具压测一下

要注意 ab test 是根据返回请求的内容来判断 是否成功 如果2次返回的数据不同则算作 Failed requests, 我一开始把两个nginx.html 区分了内容 所以有一半都是错误的请求... 要注意哦!

# 把 最大文件描述符调大一点 执行如下命令 mac 中
echo kern.maxfiles=65536 | sudo tee -a /etc/sysctl.conf
echo kern.maxfilesperproc=65536 | sudo tee -a /etc/sysctl.conf
sudo sysctl -w kern.maxfiles=65536
sudo sysctl -w kern.maxfilesperproc=65536
ulimit -n 65536 65536   

也要注意nginx的服务器的 ulimit -n 以及 nginx.conf中的 worker_connections #每个进程允许的最多连接数

ipvsadm -Ln -c  # 查看 ipvs 连接请求情况

总结

本篇主要介绍了LVS 是什么它做负载均衡和Nginx的区别,以及它的NAT网络模式的搭建配置, LVS作为集群的入口它是4层网络转发 不解析url 只是把 ip 跟换一下, 是nginx的10几倍性能, 并且它的DR模式 会更加提高性能

有了LVS 后 可以把它作为nginx集群的入口 , 可以支持很高的并发, 并且可以在LVS 前面再添加F5硬件负载均衡 (F5 一差不多一个奥迪Q5...)

最后手动搭建了一个 LVS 的NAT模式 体验了一下使用 ipvsadm 工具搭建一个 lvs集群 ,需要注意的是 NAT模式它的返回是要通过LVS服务器的所以性能在LVS三种模式中是比较低的, 可以后期改成 DR模式 直接通过后端真实服务器给客户端返回结果 不再经过LVS

LVS 的NAT模式 后端服务器的网关需要配置 为DIP 并且 后端服务器的IP和DIP要在一个网段中 保证通过 DNAT 可以到达

欢迎大家访问 个人博客 Johnny小屋
欢迎关注个人公众号

有关LVS 负载均衡的更多相关文章

  1. ruby-on-rails - EC2 实例在负载均衡器中停止服务 - 2

    我有一个EC2实例正在运行。我有一个负载均衡器,它与EC2实例相关联。PingTarget:HTTP:3001/healthCheckTimeout:5secondsInterval:24secondsUnhealthythreshold:2Healthythreshold:10现在该实例显示为OutofService。我什至尝试更改监听端口等等。一切正常,直到重新启动我的EC2实例。任何帮助将不胜感激。仅供引用:我有一个在端口3001上运行的Rails应用程序,我有一个用于HTTP:80(loadbalancer)到HTTP:3001的监听器。我还在终端中通过ssh检查了正在运行的应

  2. ruby-on-rails - 负载测试期间 Unicorn CPU 使用率激增,优化方法 - 2

    我对为我的RubyonRails3.1.3应用优化我的Unicorn设置的方法很感兴趣。我目前正在高CPU超大实例上生成14个工作进程,因为我的应用程序在负载测试期间似乎受CPU限制。在模拟负载测试中,每秒大约20个请求重放请求,我的实例上的所有8个内核都达到峰值,盒子负载飙升至7-8个。每个unicorn实例使用大约56-60%的CPU。我很好奇可以通过哪些方式对其进行优化?我希望能够每秒将更多请求汇集到这种大小的实例上。内存和所有其他I/O一样完全正常。在我的测试过程中,CPU越来越低。 最佳答案 如果您受CPU限制,您希望使用

  3. ruby - 解析 100mb JSON 负载的有效方法 - 2

    我每12小时在我的亚马逊EC2微型实例上运行一次cron作业。它下载118MB的文件并使用json库解析它。这当然会使实例内存不足。我的实例有416MB的可用内存,但随后我运行脚本,它下降到6MB,然后被操作系统杀死。我想知道我在这里有什么选择?是否可以通过Ruby有效地解析它,或者我是否必须下降到像C这样的低级东西?我可以获得一个功能更强大的亚马逊实例,但我真的很想知道是否可以通过Ruby做到这一点。更新:我看过yajl。它可以在解析时为您提供json对象,但问题是,如果您的JSON文件仅包含1个根对象,那么它将被迫解析所有文件。我的JSON看起来像这样:--Root-Obj1-Ob

  4. 云原生(十八) | Kubernetes篇之Kubernetes(k8s)工作负载 - 2

    文章目录Kubernetes(k8s)工作负载一、Workloads二、Pod三、Deployment四、RC、RS、DaemonSet、StatefulSet五、Job、CronJob1、Job2、CronJob六、GCKubernetes(k8s)工作负载一、Workloads什么是工作负载(Workloads)工作负载是运行在Kubernetes上的一个应用程序。一个应用很复杂,可能由单个组件或者多个组件共同完成。无论怎样我们可以用一组Pod来表示一个应用,也就是一个工作负载Pod又是一组容器(Containers)所以关系又像是这样工作负载(Workloads)控制一组PodPod控制

  5. Nginx的6种负载均衡策略 - 2

    Nginx的6种负载均衡策略【轮询/加权轮询weight/ip_hash/least_conn/urlhash/fair】总结:nginx负载均衡策略1、轮询策略轮询策略其实是一个特殊的加权策略,不同的是,服务器组中的各个服务器的权重都是1upstreambackend{server192.168.136.136weight=1;server192.168.136.136:81weight=1;server192.168.136.136:82weight=1;server192.168.136.136:83weight=1;}server{listen80;server_namelocalho

  6. Angular 4懒负载模块与名称的儿童插座无效 - 2

    我正在尝试为模块实现懒惰加载。该模块有一堆儿童路线独特的出口名称。当我尝试访问路线时,这似乎不起作用。从我保存的这个示例中,这似乎可以:https://plnkr.co/edit/nnxaozitm00riixzemts?p=preview您可以看到我有孩子的路线{path:'list',component:HeroListComponent,outlet:'abc'},在hero-routing.module.ts和路由器出口:在hero.com.ponent.ts当我在本地运行时,我应该能够访问Localhost:3000/Heroes/(ABC:List),但似乎不起作用。注意:您可以通

  7. ruby-on-rails - 网站负载过重+ROR - 2

    我们在CentOS6上使用2个Web服务器和1个数据库服务器运行一个具有ROR的网站。有时它会显示消息“网站负载过重”...请帮忙检查一下。我们将Passenger4.0.21与Ruby1.8.7和Apache2.2.15一起使用。Web服务器以默认设置运行。下面是passenger-status的一些输出:#乘客状态Version:4.0.21Date:ThuDec1202:02:44-05002013Instance:20126-----------Generalinformation-----------Maxpoolsize:6Processes:6Requestsintop-

  8. javascript - 隐藏的 JavaScript 负载 - 2

    我发现这个javascript很奇怪,当我在我的控制台浏览器上运行时,它会给我一个带有以下消息的警告'AlwaysbewaryofJavascriptcontainingquotes.Noquotes=safe!'我很好奇(真的不知道这是不是一个东西,有什么用吗?)如果你们中有人愿意分享关于这种“技术”的知识,我将不胜感激!:)for(Ain{A????????????????????????????????????????????????????????????????:0}){alert(unescape(escape(A).replace(/u.{8}/g,[])))};

  9. javascript - 如果指定了多个类型和有效负载选项,为什么 Redux Promise 会返回 Unresolved promise ? - 2

    我很难弄清楚为什么会这样,但基本上ReduxPromise在返回类似内容时对我来说工作正常:return{type:STORY_ACTIONS.STORY_SPOTIFY_REQUEST,payload:request}但是,我现在需要像这样传递另一个信息return{order:0,//Newfieldtype:STORY_ACTIONS.STORY_SPOTIFY_REQUEST,payload:request}这导致Unresolvedpromise而不是数据。我尝试将order重命名为position或index之类的东西......仍然没有。 最佳

  10. 恒模盲均衡算法(CMA)及修正MCMA算法 - 2

    提供源代码及说明文档伸手党走远点儿。上来就口吐莲花的请自重,注意自己的素质和境界。恒模盲均衡算法(CMA)    在各种盲均衡算法中,恒模算法(CMA)是一种重要的盲信道均衡方法,广泛地应用在了数字通信系统中,这种算法隐含地利用了接收信号的高阶统计量。结构框图可由下图所示。误差函数可定义为:其中R2是一个依赖于信源序列高阶统计量的一个实常数,可定义如下式,p由信源序列决定:(目前见到的QAM信号,P=2)抽头系数更新可由下式表示: 系统均衡输出可表示为:修正MCMA算法MCMA针对CMA的代价函数进行改进,将其分为实部和虚部两部分,通过对实部和虚部同时进行信道均衡实现对载波相位恢复。MCMA的

随机推荐