您的位置:首页 > 其它

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

2017-11-20 19:15 253 查看
# LVS DR 原理LVS-DR不同于普通的haproxy代理机制,它在网络中的作用层级更加底层。haproxy一般代理应用层的应用数据,所有的数据都会通过haproxy收发,导致了haproxy是一个性能瓶颈。而lvs-dr作用在IP和数据链路层,效率更高,并且只代理进入proxy的数据,应用的返回数据由应用服务器直接返回给client。
proscons
haproxy可以基于端口做代理真实server与proxy不需要在一个二层网络单点问题进出流量都走proxy,负载高
lvs-dr只有request请求通过proxy,response数据直接返回给客户,性能高。proxy和server必须在同一个二层网络


整个数据包的处理流程如下:Client要访问192.168.1.2上的服务

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

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

# 基于DPDK的DR架构为什么要用DPDK呢?因为lvs是基于linux内核的,而linux内核处理包的速度太慢(10G网卡3~4Mpps),特别是对小包的处理,导致了性能瓶颈。而利用DPDK技术可以绕过linux内核从而直接处理网络数据报,写的好的话可以达到线速(10G网卡14Mpps)。 这个负载均衡器主要由两部分组成,转发器(Forwarder)和健康检查器(Monitor)。


Monitor通过ping或者arp的方式检查Server的状态,如果无法连接,则将此Server设置成unreachable的状态。Forwarder通过hash算法把同一个来源的数据报发往同一个Server,以保证连接的一致性。 # 技术细节的考虑来看看现在的设计距离google的设计还差多远?


还差着一个集群这么远。。。。。。。。。目前只有单个proxy的设计,那作为一个集群要怎么玩呢?首先是DNS层面,根据来源返回一个就近的VIP地址(如果在多个数据中心部署了的话)然后是Router层面,使用了ECMP,把大量的请求分发到不同的负载均衡器上。这就带来了一个问题,如何让同一个来源的请求总是能够到达同一个Server呢?有两个方法。通过配置ECMP,把相同来源的请求都发往相同的负载均衡器。

使用一致性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 # Referencehttp://www.infoq.com/cn/articles/Maglev-Vortex

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

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

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

http://www.xinghaixu.com/archives/472
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lvs dpdk
相关文章推荐