一个高速lvs-dr替代系统设计 -- 基于dpdk的高性能负载均衡器

简介:


LVS DR 原理

LVS-DR不同于普通的haproxy代理机制,它在网络中的作用层级更加底层。haproxy一般代理应用层的应用数据,所有的数据都会通过haproxy收发,导致了haproxy是一个性能瓶颈。而lvs-dr作用在IP和数据链路层,效率更高,并且只代理进入proxy的数据,应用的返回数据由应用服务器直接返回给client。

 


pros

cons

haproxy

可以基于端口做代理

真实server与proxy不需要在一个二层网络

单点问题

进出流量都走proxy,负载高

lvs-dr

只有request请求通过proxy,response数据直接返回给客户,性能高。

proxy和server必须在同一个二层网络

 


 

整个数据包的处理流程如下:

  1. Client要访问192.168.1.2上的服务

  2. request数据经过路由到达我们的proxy,上面运行着负载均衡器,负载均衡器通过策略算法,把目标MAC改成真实的Server MAC,并发送给目标MAC(这里决定了proxy和server只能在同一个二层网络中)

  3. Server收到请求后,将响应数据直接通过路由发送给client,不再经过proxy

 

 

基于DPDKDR架构

为什么要用DPDK呢?因为lvs是基于linux内核的,而linux内核处理包的速度太慢(10G网卡34Mpps),特别是对小包的处理,导致了性能瓶颈。而利用DPDK技术可以绕过linux内核从而直接处理网络数据报,写的好的话可以达到线速(10G网卡14Mpps)。

 

这个负载均衡器主要由两部分组成,转发器(Forwarder)和健康检查器(Monitor)。


Monitor通过ping或者arp的方式检查Server的状态,如果无法连接,则将此Server设置成unreachable的状态。

Forwarder通过hash算法把同一个来源的数据报发往同一个Server,以保证连接的一致性。

 

 

技术细节的考虑

来看看现在的设计距离google的设计还差多远?


还差着一个集群这么远。。。。。。。。。

目前只有单个proxy的设计,那作为一个集群要怎么玩呢?

首先是DNS层面,根据来源返回一个就近的VIP地址(如果在多个数据中心部署了的话)

然后是Router层面,使用了ECMP,把大量的请求分发到不同的负载均衡器上。

这就带来了一个问题,如何让同一个来源的请求总是能够到达同一个Server呢?有两个方法。

  1. 通过配置ECMP,把相同来源的请求都发往相同的负载均衡器。

  2. 使用一致性hash算法,让不同的负载均衡器在处理同一个请求时都能够转发到同一台Server。

 

 现有技术

在构思这篇博文的时候还没注意到VPP刚出的LoadBalancing,之前一直想自己实现一个lb application或者基于ovs-dpdk进行修改。但是搜索了一下之后发现了VPP LoadBalancing plugin这个plugin就是仿照了Maglev进行设计和实现的。

不知道VPP是何技术的可以去google一下,这是cisco开源的sdn技术,类似于openvswitch,自称转发性能比openvswitch高不知道哪去了。VPP底层基于dpdk或者netmap的技术实现高速收发数据报。

VPP实现的LB跟上面说的有一部分不太一致,就是从proxy到server的过程,VPP是用gre tunnel技术实现的,这样就不需要server和proxy在同一个二层网络里了,相应的,tunnel技术会增加每个封包的长度,需要相应的修改MTU,启用Jumbo Frame

最后的最后,至于VPP的LB性能如何,怎么用,我现在并没有试过:P

 

 Reference

  1. http://www.infoq.com/cn/articles/Maglev-Vortex

  2. http://oilbeater.com/%E5%8D%9A%E5%AE%A2/2016/11/21/google-loadbalancert.html

  3. https://docs.fd.io/vpp/16.12/md_plugins_lb-plugin_README.html

  4. https://github.com/chrisy/vpp/tree/master/plugins/lb-plugin

  5. http://www.xinghaixu.com/archives/472

 


      本文转自Tenderrain 51CTO博客,原文链接:http://blog.51cto.com/tenderrain/1983570,如需转载请自行联系原作者




相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
6月前
|
负载均衡 应用服务中间件 Linux
企业实战(13)LVS负载均衡NAT(网络地址转换)模式实战详解(一)
企业实战(13)LVS负载均衡NAT(网络地址转换)模式实战详解(一)
|
5月前
|
负载均衡 应用服务中间件 Linux
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
175 0
|
3月前
|
缓存 负载均衡 应用服务中间件
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
在本章内容中,我们将深入探讨 Tomcat 服务器的运行架构、LVS 负载均衡的运行机制以及 Cache 缓存机制,并提供相应的解决方案和指导。通过理解这些关键概念和机制,您将能够优化您的系统架构,提高性能和可扩展性。
205 4
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
|
4月前
|
负载均衡 监控 调度
Keepalived+Lvs(dr)调度器主备配置小实验
Keepalived和LVS(Linux Virtual Server)是两个常用的开源软件,通常结合使用以提供高可用性和负载均衡的解决方案。 Keepalived是一种用于实现高可用性的软件,它可以监控服务器的健康状态,并在主服务器出现故障时自动切换到备份服务器。
95 2
|
5月前
|
负载均衡 算法 网络协议
Keepalived+LVS搭建高可用负载均衡
Keepalived+LVS搭建高可用负载均衡
180 1
|
6月前
|
负载均衡 应用服务中间件 nginx
71分布式电商项目 - nginx高可用以及lvs+nginx负载均衡(资料)
71分布式电商项目 - nginx高可用以及lvs+nginx负载均衡(资料)
41 0
|
11天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
28 0
|
3月前
|
负载均衡 应用服务中间件 nginx
百度搜索:蓝易云【Nginx和tomcat实现负载均衡教程】
至此,你已经成功地使用Nginx和Tomcat实现了负载均衡。Nginx将根据配置的负载均衡策略将客户端请求分发到多个Tomcat服务器上,以提高系统的性能和可用性。请注意,在实际生产环境中,还需要进行其他配置和优化,如健康检查、会话保持等,以满足具体的需求。
34 0
|
3月前
|
负载均衡 安全 前端开发
百度搜索:蓝易云【Nginx与Tomcat负载均衡-动静分离教程】
这些是将Nginx与Tomcat结合使用实现负载均衡和动静分离的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
48 1
|
2月前
|
负载均衡 Java 应用服务中间件