Ruby on rails 扩展以在短时间内支持大量流量
到目前为止,我们的网站拥有适度的流量。我们的开发人员中没有一个是大型运营人员,但我们一直保持领先地位,并保持网站快速运行。这就是说,我们的开发团队已经捉襟见肘,我们积累了一些技术债务,还有很多机会进行优化 在没有详细说明的情况下,我们刚刚发现,我们预计在不久的将来,在很短的时间内会有大量的流量。在几小时内点击数达到几百万次。缩放是一回事,但这比我们现在看到的要大几个数量级 我们是一个使用ELB和Postgresql托管在S3上的Rails应用程序 在这种情况下,我想为扩展和负载测试的广泛起点提供一些建议Ruby on rails 扩展以在短时间内支持大量流量,ruby-on-rails,amazon-s3,scaling,load-testing,stress-testing,Ruby On Rails,Amazon S3,Scaling,Load Testing,Stress Testing,到目前为止,我们的网站拥有适度的流量。我们的开发人员中没有一个是大型运营人员,但我们一直保持领先地位,并保持网站快速运行。这就是说,我们的开发团队已经捉襟见肘,我们积累了一些技术债务,还有很多机会进行优化 在没有详细说明的情况下,我们刚刚发现,我们预计在不久的将来,在很短的时间内会有大量的流量。在几小时内点击数达到几百万次。缩放是一回事,但这比我们现在看到的要大几个数量级 我们是一个使用ELB和Postgresql托管在S3上的Rails应用程序 在这种情况下,我想为扩展和负载测试的广泛起点提供
- 更新:抱歉,EC2,深夜:)
- 祝贺你,我希望你的期望成真
鉴于现有信息,这是一个很难全面回答的问题。例如,您的站点是否大量使用数据库读取、写入或两者兼而有之(并且您的分片/复制策略是否符合您的数据库紧张程度)?带宽是一个问题吗?显而易见的一点是,要确保您能够访问适当的硬件,并且无论您使用什么样的方法来配置/部署您的硬件,都是最新的,并且可以正常使用。你经常可以在流量突然增加时抛出硬件,直到你找到瓶颈的根源为止(是的,你会在不方便的时候发现它们!)
关于扩展应用程序,您至少应:
1) 尽可能地缓存任何内容。注意缓存过期等。
2) 确保数据库设置了适当的索引(基本上,您应该在搜索的任何字段上都有索引)
3) 仔细观察日志,以确定潜在的长查询、N+1查询、长视图渲染等。
4) 做一些像Shopify在这篇文章中概述的事情:
5) 为堆栈的每一层设置一个好的监控系统(Monit、God等)——流量的突然激增会在意想不到的地方迅速使应用程序瓶颈,并导致更多问题。级联反应可以很快发生。
6) 设置cron以自动执行您当前手动执行的所有小任务…一旦遇到流量高峰,您可能会忘记执行这些任务。
7) 谷歌缩放rails,你会看到大量的好信息。
8) 等等,等等,等等
你可以使用一些分析工具(rubyperf,或者像NewRelic之类的工具),不管你从他们那里得到什么样的响应,最好是把它们看作一个粗略的基线。原因很简单,您的评测依赖于您的硬件堆栈,而硬件堆栈肯定会根据实际的流量模式而变化。如果你有一个只有一页静态内容的网站,那么做起来非常容易。如果你有一个数据库不断增长、流量不断增长的CMS网站,那么做起来就非常困难
祝你好运 @LastZactionHero
非常有趣的问题,让我详细回答你们,我希望你们谈论的是一些电子商务应用程序,企业或B2B应用程序并没有看到这样的峰值。因为您已经提到,您的rails应用程序托管在s3上。让我澄清几件事。
1) 您不能在s3上托管rails应用程序。S3是简单的存储服务。您只能在其中存储文件。
2) 我猜你已经在AWS ec2上托管了rails应用程序,ec2实例上方连接了一个弹性负载平衡器,这非常好
3) 您在ec2实例上部署了一个自我管理的Postgresql
如果你在AWS上运行,你是安全的一半,你可以很容易地放大和缩小
我可以看出您当前模型中的一个问题,即您的数据库。AWS已将db作为一项服务。这就是关系数据库服务,它支持Mysql、Oracle和MS SQL server
RDS具有许多功能,如自动备份数据库、高IOPS等
但是它不支持你的Postgresql。您需要拥有或管理一个自我管理的ec2实例,并运行postgresql数据库,但要确保它的故障安全,并且您确实有适当的备份和恢复系统
AWS提供自动缩放api和命令行工具,非常简单
你不必担心带宽等问题,但我也承认安吉洛的答案
您可以使用elastic mem cache来缓存应用程序。如果需要加速应用程序,请使用CDN。RDS可以管理高达30000 IOPS,这是一个怪物,它将为您做很多工作
如果你需要帮助,尽管问我
(免责声明:我是一家电子商务公司的高级devOps工程师,使用ruby on rails)能否将需要的信息缓存到静态页面中?S3将为那些没有问题的人服务。您是否希望在数据库中执行大量操作?阅读?写?查询是否特定于单个实体/用户(不是复杂查询或大规模连接)?有很多负载测试应用程序,谷歌应该帮助你找到。你看过EC2的自动缩放功能吗?我相信,它们有一些可以在CPU/内存上触发的功能。另外,静态资源也可以通过Cloudfront完成。谢谢,这很有帮助,并且在很大程度上证实了我们的方向。我们正计划转向RDS——我们有一些特定于Postgresql的查询需要整理,没有什么大问题,大部分情况下我们只是使用ActiveRecord的方法,所以我预计不会有大问题。我还将研究弹性内存缓存。