如何以可扩展的方式部署[Ruby on Rails]网站?

14

我已经在我的[第一个] 创业项目上工作了一个月,虽然距离alpha版本还有至少一个月的时间,但我想知道如何正确地部署它。该网站对于新用户来说会有初始高负载(网络+CPU),因此我正在考虑为此初始过程使用单独的服务器/队列,以便不会减慢现有用户的网站速度。

根据我的调研,目前我倾向于使用nginx + haproxy + unicorn/thin + memcached + mysql,并在Linode上进行部署。然而,我以前没有任何上述方面的经验;因此,我希望能够利用社区的经验。

  • 以上架构是否合理?您有什么建议/文章/书籍可以推荐吗?
  • Linode是一个好选择吗?Heroku/EY 对我来说似乎太昂贵了(至少在我有足够的收入之前),但是我错过了其他更好的选择吗?MediaTemple?
  • 有关负载均衡架构的任何好建议?我仍在阅读相关内容。
  • 在两个分开的Linodes服务器实例上运行2个Rails实例,还是在一台容量翻倍的Linode上运行1个实例更好?我应该从多少个Linodes开始?
  • 应该选择哪个Linux发行版?(Linode提供8种不同的发行版 - http://www.linode.com/faq.cfm)对于Rails网站,它们之间有相对优势/缺点吗?

如果我的任何问题很愚蠢或自相矛盾,请归因于我的经验不足。

1个回答

18

架构

你的方案是正确的。我个人更喜欢 Passenger 而非 thin/unicorn(已经长期使用 nginx 对接 thin 后端),因为它更加便利,但是你所提出的架构也很标准。如果你使用 Ruby 1.8.7,我推荐你考虑使用 REE + Passenger 来节省框架内存。

托管和负载均衡

Linode 是一个很棒的选择,我用它来托管几乎所有的服务。但是你需要注意内存限制。每个 Rails 进程会占用不少内存,你需要避免让机器进入交换空间。计划在每台机器上运行足够多的 Rails 实例,以使你的内存分配约为 Linode 内存的 90%。你可能还需要另一台 Linode 来专门托管数据库,尽管你可以先将它们都放在同一台机器上;只要做好随着应用规模的增长将 MySQL 拆分出去的准备即可。你可以使用私有 IP 在同一数据中心的 Linode 之间设置通信,这些通信不计入你的带宽配额。

你的扩展策略应该尽可能地水平化,因此我建议你在需要更多计算资源时,只需获取第二个 Linode 并将其添加到 haproxy 池即可——Linode 会向你收取 $20 获得 512MB 更多的内存,或者你可以花同样的 $20 获取完整的新 Linode(包括 CPU、内存、硬盘和带宽配额),这似乎是一个不用思考的决定。在 Rails 中,一个实例就是一个实例,无论它是在同一台虚拟机上还是不同机器上,只要连接数据库机器等操作的时间大体相同即可。你可以运行 10 台 Linode,每台 Linode 启动 10 个 Rails 进程,也不会遇到太多问题。Linode 还提供 IP 故障切换功能,因此如果主要 Linode(haproxy 运行的那台)发生故障,它可以自动切换到备用 Linode 上,你可以在其中再次启动 haproxy,让它能够像第一台 Linode 那样工作。

分发

说实话,这取决于你自己!许多人选择Ubuntu或Redhat(CentOS / Fedora)发行版 - 我个人比较喜欢CentOS -但这只是关于你最舒适使用的发行版。如果你没有喜欢的发行版,我建议尝试Ubuntu / CentOS,因为它们往往非常适合初学者,并且具有极其强大的社区支持。

除非你有充分的理由选择64位发行版,否则你可能需要选择32位发行版;64位可执行文件需要比32位版本更多的RAM,而由于RAM很可能是您最珍贵的资源,因此在可以节省的地方节省它是明智的。


感谢您详细的回复。我有几个后续问题要问:(1)我正在使用Ruby 1.9.2。在这种情况下,REE还有优势吗? (2)相比Thin,Passenger有什么优势? - Asif Sheikh
Passenger自动管理您的进程集群。而使用thin,则需要手动管理每个后端。Passenger还利用REE的写时复制功能,在后端实例之间共享框架内存,节省RAM。它的安装和配置也非常简单。 - Chris Heald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接