zoukankan      html  css  js  c++  java
  • 高性能服务器负载均衡的一个可行方案

    面试官总爱问一些负载均衡的问题,不知道是他们真的遇到了还是自己意淫的。我只想说,在你否定别人的想法时,是否是真的认真考虑过别人的想法是不是比你的好。

    大概意思就是说多个用户请求服务,服务器是一个集群,在客户与服务器之间加了一层负载均衡,使得每个用户能够正常请求服务,而且负载均衡机构可以把用户的请求分到一个合适的服务器上。这样就能够使服务器能够达到最佳的工作状态。

    不过对于这种问题,大多数人给出的解决方案都是基于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台服务器的电费,维护费。

  • 相关阅读:
    Java 构造方法总结
    Intellij IDEA使用总结
    阿里巴巴Java开发手册
    灰度发布策略
    php redis 命令合集
    php redis 常用方法
    php excel 设置单元格格式为文本格式
    php curl get post 方法的封装
    PHP 判断手机号归属地 和 运营商的免费接口
    lnmp centos7 memcache服务器端 和 memcache memcached扩展的安装
  • 原文地址:https://www.cnblogs.com/haolujun/p/2722437.html
Copyright © 2011-2022 走看看