我的服务器是安装了 LAMP、Webmin 和 Indefero 的 VPS。它运行在 512mb RAM 上,运行效果很好。
我的朋友告诉我有一家 VPS 公司提供 128MB 内存,每年只需 15 美元(每月 80 美分)。这相当便宜。即使我运行 7 个独立的 VPS,这也比我目前的计划便宜。
将我的独立服务移至几个 VPS 而不是将它们保留在我当前的单个 VPS 上是否值得?我可以将 Apache 放在一个 VPS 上,将 MySQL 放在一个 VPS 上,将防火墙放在一个 VPS 上。在
性能方面,我应该期待看到哪些好坏差异?
因此,抛开质量和价格不谈:假设我目前使用的是 5GB RAM 计划,那么切换到 5 个 1GB 计划是否更好?
答案1
任何真的廉价 VPS 交易将严重超卖或公司亏损运营。如果安排严重超卖,那么您有时会遇到性能问题,特别是 I/O 方面,还有 CPU 分配方面。如果这样的企业没有严重超卖,那么它很快就会倒闭,除非该服务是某种吸引人们注意力的亏本销售,在这种情况下,当他们意识到他们不会从您身上赚到更多钱时,支持不太可能是一流的。
因此从这个角度来看,我会避免这个计划,甚至不会考虑技术问题。
在同一主机上的多个虚拟机上运行单个服务可能会像您当前的 VPS 一样快(或者至少对于小负载“足够快”,如果您的设计可以在多台机器上很好地扩展,那么对于大负载可能更快)但设置起来会更加麻烦,而且会有一些额外的限制。例如,您可以按照以下方式安排您提到的七台虚拟机:
3 6
,---> web -------> db <----.
| server | slave |
| | |
1 2 | \ 5 /
firewall / ----> load ----| >---> db <--<
external access balancer | / master \
| | |
| 4 | 7 |
`---> web -------> db <----'
server slave
正确设置后,您可以根据需要通过添加更多 Web 服务器或 DB 服务器来快速扩展。但存在很多问题:
- 您需要正确配置该负载均衡器
- 每个 Web 服务器都需要经过良好调整才能在 128Mbye RAM 下工作,否则您将进行交换,这样由于严重超卖而导致的过度争用将严重影响 IO,并且让 Apache+PHP 设置在如此少的内存下正常工作无论如何都是不可能的,具体取决于您正在运行的内容(例如,检查 wordpress 的潜在每个进程内存要求)。您可以通过使用不同的 Web 服务器(例如 nginx)和/或让 PHP 实例在网络上通过 FastCGI 调用的更多 VM 上运行来缓解这种情况,但这会使设置更加复杂,并且可能仍然不可能,具体取决于您的脚本执行的操作。
- 您将必须配置数据库复制,要么使用一个主服务器加上只读从服务器(这将需要更改您的应用程序),如我的图表所示,要么使用主-主安排,如果您关心的是事务完整性,那么效率会低得多。
- 每个数据库服务器将限制为 128Mb:这对 mySQL 来说可能很麻烦,通常需要进行一些调整,并且一台服务器上的大型查询将无法“借用”另一台服务器上的内存空闲,因此限制是固定的。如果您不非常小心,数据库节点最终可能会交换,在这种情况下,又会出现令人讨厌的 IO 争用惊喜。
- 四台 128Mbyte 的机器无法像一台 512Mbyte 的机器一样运行:首先,操作系统和应用程序开销基本固定,将单独应用于每个节点,节点将无法共享其 RAM 池,因此一个 DB 服务器上的大型查询或一个 Web 节点上的大型进程将无法将 RAM 分配给另一个当前空闲的节点。对于许多负载模式,七台 128Mbyte 的机器不太可能像一台 512Mbyte 的机器那样工作。
除了“一定有陷阱”之外,128MB RAM 可能不是专用的:对于基于 VZ 的主机,它可能是“64MB 可突发到 128MB”,对于基于 Xen 的系统,它可能是“64MB 带 64MB 交换”。即使 theca RAM 名义上是专用于您的 VM,一些虚拟化解决方案也允许过度使用 RAM(VMWare 在一定程度上允许),因此您会发现部分或“专用 RAM”被调出到主机交换区域,这会严重影响性能。另一个致命的问题是虚拟机之间的通信(而不仅仅是虚拟机与外界之间的通信)可能会计入您的带宽分配:因此,从数据库拉取 512Kbyte 到其中一台服务器,经过一些计算后向客户端发送 128Kbyte 的响应,总共可能算作 1664Kbyte(512 个来自数据库节点,512 个进入 Web 节点,128 个来自 Web 节点,128 个通过负载均衡器,128 个通过防火墙),而不仅仅是 128K,而且数据库节点之间的复制流量也将计入您的配额。
lt;dr:虽然这对于某些工作负载来说可能是可行的(即,如果你的设计中的每个 web/app/sql 节点都可以在这么小的 RAM 中高效运行,并且你有足够的节点来应对相同的负载),但这可能还远远不够。远的麻烦多于其价值,因为轻负载即使在好的主机上也会运行得更慢(由于额外的网络开销),而且非常便宜的主机不太可能是“好”主机(昂贵的主机不一定是好的,但可能性略高!)。所涉及的所有额外设置和维护时间真的比您每月节省的现金更不值得吗?!
我建议这样做的原因之一就是为了学习:这可能是一个有趣的项目,可以学习技术并获得第一手经验,尝试将应用程序扩展到多台机器以实现性能和/或可用性。我不会建议将其用于生产设置,即使是个人项目,除非您已经拥有这些知识和经验(正如您问的问题一样,我认为您没有)。
仍然 lt; dr:我会坚持使用单个虚拟机。