设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

从Ruby迁移到Go语言,服务器从30台缩到2台

2014-4-11 10:29| 发布者: joejoe0332| 查看: 4064| 评论: 0|原作者: 外刊IT评论|来自: 外刊IT评论

摘要: 我们开发第一版的IronWorker已经是3年前的事了,是用Ruby写的,API基于Rails开发。我们没用多久就发展成了相当大的规模,很快我们就触及到了Ruby程序的承载上限。长话短说,我们切换到了Go语言,请接着读下去,下面 ...

  我们开发第一版的IronWorker已经是3年前的事了,是用Ruby写的,API基于Rails开发。我们没用多久就发展成了相当大的规模,很快我们就触及到了Ruby程序的承载上限。长话短说,我们切换到了Go语言,请接着读下去,下面是事情如何一步步发展的。


phoneb10


  最初的设计


  首先,做一点背景介绍:我们开发的第一版IronWorker,起初叫做SimpleWorker(很不错的名称,不是吗?),用的是Ruby。我们过去是一个顾问公司,为其它公司开发应用,在当时有两个东西被炒得非常火:亚马逊的Web Services和Ruby on Rails。所以我们开发的应用都基于AWS的Ruby on Rails架构,并因此吸引了不少大客户。我们开发IronWorker的初衷是来源我们自身的需求。我们有不少做硬件设备的客户,他们会7×24小时不停的给我们发送数据,我需要收集这些数据,把它们整理成有用的信息。典型的做法就是让定时任务每天每小时的遍历这些数据。我们想到应该开发一个东西,能够处理所有用户的数据,而不必做一大批的定时任务为每个客户单独处理。于是我们开发了一个服务类应用,并在内部使用了一段时间,但后来我们认为一定会有其他的人也需要这个应用,于是我们决定公布它,这样,IronWorker诞生了。


  我们的服务器可承受的CPU使用率大概在50-60%。当超过这个额度,需要增加服务器来保持它在50%左右。只要我们不介意大量的{敏感词}费(我们当然介意),这种模式会工作的很好。但最大的问题是出现在流量大量陡增时。当一个大型的流量高峰到来时,它会产生多米诺效应,会拖垮我们整个的服务器集群。当某些指标超过50%的阀值时,我们的Rails服务器会吃掉100%的CPU使用率,变成无响应状态。这会导致负载均衡设备认为它已经宕了,把它移出分发池,于是这台无响应的服务器上的负载就会转移到池中其他服务器上。因为池中剩下的服务器需要承载这失去的服务器上的负载再加上流量高峰,必然会有第二台服务器倒下,负载均衡设备又会把它移除,前赴后继。很快池中所有的服务器都会耗尽。这种现象也叫做colossal clusterf**k (ref: +Blake Mizerany)。


这里是一个简单描绘多米诺宕机效应的绘图


  这里是一个简单描绘多米诺宕机效应的绘图。


  在这种架构下避免这种事情发生的唯一办法就是保持有大量的额外处理能力,让我们的服务器的负载远低于它应该能承受的能力,但这意味着要多花一大笔钱。必须让这种状态有所改变。



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部