面试官总爱问一些负载均衡的问题,不知道是他们真的遇到了还是自己意淫的。我只想说,在你否定别人的想法时,是否是真的认真考虑过别人的想法是不是比你的好。
大概意思就是说多个用户请求服务,服务器是一个集群,在客户与服务器之间加了一层负载均衡,使得每个用户能够正常请求服务,而且负载均衡机构可以把用户的请求分到一个合适的服务器上。这样就能够使服务器能够达到最佳的工作状态。
不过对于这种问题,大多数人给出的解决方案都是基于socket和Epool的,但是这种方案下,一台机器也就处理200-300Mbps的流量的负载。下面给出另一个解决方案。基于网络数据包捕获的解决方案。
平台:Linux + 曙光零拷贝网卡
曙光零拷贝推出了千兆网卡和万兆网卡,说白了就是捕包速度为1000Mbps和10000Mbps。
_______ _________ ________
| | | | | |
|Clients| ----->|Balancer |------------->|Servers |
|_______| |_________| |________|
可以通过修改数据包来进行负载均衡。例如Client请求Balancer,Balancer根据多个Server的情况,选择一个合适Server进行处理,之后把这个数据包的目的IP改成选定的Server的IP,目的MAC改成Server的MAC,源MAC改成Balancer自身的MAC。那么可以再通过网卡把修改过的包发出去。这个包就会被相应的Server处理。Server返回来的数据包,我们把其源IP改成Balancer的IP,源MAC改成Balancer的MAC,目的MAC改成客户端的MAC,之后通过网卡发送出去。这样就实现了Balancer的基本功能。需要注意的是,我们必须维护一个Client-Server的对应关系。这个对应关系很容易维护,而且能够做到非常高效。并且修改数据包的MAC和IP简直是不用什么开销。
现在看一下这个方案相比前面的方案的优点。
因为Balancer双向收发包,那么处理的峰值流量需打个对折。如果使用10000Mbps的网卡,那么能双向处理5000Mbps。(能捕获10000Mbps流量的网卡并不是我瞎说的,我们当年用这个网卡处理过7Gb/s的流量,因为我们实在是获取不到更大的流量了。)也就是说这样一个Balancer敌得过socket方式的20个Balancer。再进一步算个帐,如果原来有100个Balancer,那么现在只需要5个Balancer,那么那省下的95台服务器是一笔不小的开销,但是还省下了95台服务器的电费,维护费。