扩展以在短时间内支持大量流量

时间:2013-04-04 04:07:18

标签: ruby-on-rails amazon-s3 scaling load-testing stress-testing

到目前为止,我们的网站拥有适量的流量。我们的开发人员都不是大型运营商,但我们一直保持领先,并保持网站运行非常快。也就是说,我们的开发团队已经捉襟见肘,我们积累了一些技术债务,并且有很多机会进行优化。

在没有详细说明的情况下,我们发现在不久的将来,我们将在很短的时间内期待大量的流量。在几个小时内就达数百万次点击。缩放是一回事,但这比我们现在看到的要高几个数量级。

我们是使用ELB和Postgresql在S3上托管的Rails应用程序。

在这种情况下,我想提出一些建议,以便为扩展和负载测试提供广泛的起点。

  • 更新:对不起,EC2,深夜:)

2 个答案:

答案 0 :(得分:2)

@LastZactionHero 非常有趣的问题,让我详细回答你,我希望你在谈论一些电子商务应用程序,企业或B2B应用程序看起来如此尖峰。既然你已经提到你在s3上托管了你的rails应用程序。让我说清楚几件事。 1)您无法在s3上托管rails应用程序。 S3是简单的存储服务。你只能存储文件的地方。 2)我猜你已经在AWS ec2上托管了你的rails应用程序,并在ec2实例上方附加了一个弹性负载均衡器,这非常好。

3)您在ec2实例上部署了自我管理的Postgresql。

如果您在AWS上运行,那么您可以轻松安全地扩展并缩小规模。

我可以在你现在的模型中看到一个问题,就是你的数据库。 AWS已将db作为服务。这称为Relation数据库服务。它支持Mysql Oracle和MS SQL服务器。

RDS具有许多功能,如自动备份数据库,高IOPS等。

但它不支持你的Postgresql。您需要拥有或管理自我管理的ec2实例并运行postgresql数据库,但要确保其安全,并且您确实有适当的备份和恢复系统。

AWS提供自动缩放api和命令行工具,非常简单。

你不担心带宽问题等,但我也承认Angelo的答案。

您可以使用弹性mem缓存来缓存您的应用。如果需要加速您的应用程序,请使用CDN。 RDS可以管理高达30000的IOPS,它的怪物将为你做很多工作。

如果您需要任何帮助,请随时问我。

(免责声明:我是一名为电子商务公司工作的高级devOps工程师,在轨道上使用ruby)

答案 1 :(得分:1)

恭喜,我希望你的期望能够实现!

鉴于可获得的信息,这是一个难以全面回答的问题。例如,您的站点是否在db读取,写入或两者上都很重要(并且您的分片/复制策略是否与db应变一致)?带宽是一个问题,等?明确的要点将集中在确保您可以访问适当的硬件,并且您用于配置/部署硬件的任何内容的收件人都是最新的并且很好用。你可以经常把硬件投入到突然的流量高峰中,直到你找到你发现的任何瓶颈的根源(是的,你会在不方便的时候发现它们!)

关于扩展您的应用,您至少应该:

1)尽可能缓存。注意缓存过期等 2)确保您的数据库设置了适当的索引(实质上,您应该在您正在搜索的任何字段上有索引。) 3)密切关注您的日志以识别潜在的长查询,N + 1个查询,长视图渲染等。 4)在这篇文章中做一些Shopify概述:http://www.shopify.com/technology/7535298-what-does-your-webserver-do-when-a-user-hits-refresh#axzz2O0gJDotV 5)为堆栈的每一层建立一个良好的监控系统(Monit,God等) - 突然的流量峰值可能会在意外的地方迅速阻塞您的应用程序并导致更多问题。级联可以快速发生。 6)设置cron来自动执行你目前手动执行的所有小任务......一旦你处理了流量峰值,你可能会忘记做。 7)谷歌缩放轨道,你会看到大量的好信息。 8)等等...

你可以使用一些分析工具(rubyperf,或类似NewRelic之类的东西)。无论你从它们那里获得什么样的反应都可能最好被认为是最好的粗略基线。简单的原因是您的分析依赖于您的硬件堆栈,这肯定会根据实际的流量模式而改变。如果您的网站有一页静态内容,那么很容易做到......如果您的CMS网站数量不断增加且流量不断增长,那将非常困难。

祝你好运!!!