漫画 | 打死我也不搞负载均衡了!
这是1998年一个普通的上午, 张大胖刚上班就被老板叫去训话。
张大胖有个亲戚在卖IBM的服务器,经常吹嘘说性能有多好,张大胖就想花钱把现在的‘老破小’服务器给替换掉。
老板不管过程,只要结果。
大胖悻悻地去找Bill, 将老板的指示声情并茂地做了传达。
张大胖思索了一会儿,想出了用DNS做中间层的办法。
让网站的域名映射到多个服务器的IP!
用户面对系统的域名,查询IP的时候用轮询的方式。
这DNS系统也真是太不智能了, 张大胖没招了。
Bill决定另辟蹊径,开发一个自己的负载均衡软件。
Load Balancer 简称LB , 有两个IP,一个对外(115.39.19.22),一个对内(192.168.0.100)。
用户看到的是那个对外的IP。后面的真正提供服务的服务器有三个,称为RS1, RS2,RS3, 他们的网关都指向LB。
但是这个数据包一看就是发给Load Balancer的, 怎么发给后面的某个服务器呢?
等到RS1处理完了,要返回首页的HTML, 会把数据包发给网关LB, LB再次施展同样的手段,把IP和端口都修改成自己的, 再发给客户就行了。
Bill 吩咐张大胖组织人力把这个负载均衡软件给开发出来。
三个月后,Load Balancer的第一版开发出来了,这是运行在Linux上的一个软件, 公司试用了一下,感觉还真是不错,仅仅用几台便宜的服务器就可以实现负载均衡了。
可是好景不长,张大胖发现这个Load Balancer存在这瓶颈。
所有的数据包都要通过它,不管是客户端发来的,还是要发给客户端的。
Bill 给出了一个新的方案:把请求和响应分开处理。
Bill展示了一张更加复杂的图:
张大胖通过第一版Load Balancer的开发,积累了丰富的经验。
所有服务器都有一个IP:115.39.19.22, 简称VIP。
每个实际的服务器的loopback都绑定到了这个VIP上。
但是,一个巨大的问题出现了:
RS1(192.168.0.10)这个服务器收到了数据包,拆开一看,目的地IP是115.39.19.22,是自己的IP, 那就可以处理了。
张大胖决定把这种方式叫做Direct Server(DR)模式。
几个月以后,DR模式也开发成功,并且部署到了生产环境上。
后记: 本文所描述的,其实就是著名开源软件LVS的原理,上面讲的两种负载均衡的方式,就是LVS的NAT和DR。LVS是章文嵩博士在1998年5月成立的自由软件项目,现在已经是Linux内核的一部分。
最后再留个小疑问给大家:对于用户的一个请求来说,可能会被分成多个数据包来发送, 如果这些数据包被我们的Load Balancer发到了不同的机器上,那就完全乱套了啊!这该怎么办?