我有一台服务器,配备两个 2.6GHz 四核处理器和 32GB RAM(以及大量存储空间)。我有一个 Django 应用程序,打算在此服务器上运行,我想设置(使用 VMWare)2 个数据库服务器(Ubuntu 上的 Postgres)、2-3 个应用服务器(Ubuntu 上的 Django + Nginx + 其他一些东西)、一个任务服务器(Ubuntu 上的 Celery 和 RabbitMQ)以及一些其他用于较小任务的小型 VM。
我想知道的是,在 2-3 个应用服务器(将执行基本的 Django 操作,如数据库访问、一些图像大小调整和模板渲染)之间平衡请求负载是否明智,或者我是否最好为应用服务器设置 1 个大型(大量 RAM)VM?我不知道以这种方式拆分单个物理服务器会产生什么样的开销(或收益),如果有的话。我认为每个 VM 大概需要 4GB 左右,这样可以留下 8GB 来执行其他小任务。
答案1
在我开始之前,我需要说明的是,你将要阅读的所有内容实际上只是初始点充其量。这一切都是废话,直到你真正有值得观察和测量的东西来找到真实的在给定负载下系统的性能特征。正如人们所说,三思而后行(花费/建设)。
除此之外,我注意到了四件事。第一件是这句话:
还有一些其他用于较小任务的小型虚拟机
我会将它们合并为 1 个“实用程序”虚拟机。这将节省系统的操作系统开销。VMware 中的 RAM 共享对于这种事情来说很好,但并不完美。至少,您将节省一些管理开销。
其次,单个物理主机内的负载平衡有点奇怪……如果只有一台主机,我认为使用一台虚拟机更合适,因为虚拟机的资源与三台较小的虚拟机相同。不过,这是我的观点,我怀疑其他人可能不同意。
我真正希望您在这里争取的是至少两台物理主机,最好是三到五台。机器的配置应使您总共拥有足够的马力来运行必要的虚拟机,以便在一个物理机箱完全发生故障时让您的系统保持正常运行。这时负载平衡就非常有用了,因为您现在已经准备好将性能负载平衡与高可用性基础架构的核心结合起来。不幸的是,听起来您在这里已经购买了可能比您在这个设置中任何一个系统所需的更多的东西。但作为我希望您努力的一个例子:
主机1 主机2 主机3 ----- ------ ------- DjangoApp1 DjangoApp2 DjangoApp3 DB1 DB2 Celery/RabitMQ1 Celery/RabbitMQ2 (热空闲) UtilityServer2 (热空闲) UtilityServer1
如果任何一台物理主机发生故障,上述系统允许您以最少的工作量继续运行。不过,这个设置仍然非常简单。随着规模的扩大,您的数据库服务器最终将需要自己的物理主机,您需要在某个地方使用 HAProxy 来处理平衡,在某个地方使用 SAN(或两个)进行存储,也许还需要某个地方使用缓存服务器(一对或更多)。但这是您可以在初始产品启动并运行后构建的目标。
接下来,对于实用程序服务器和 Celery/RabbitMQ 实例来说,4GB 实际上是相当多的 RAM。对于这些机器,您可能只需要不到 1/2 的 RAM,而对于 Django,4GB 甚至可能有点多,这取决于您的实际负载。这为您的数据库服务器释放了 RAM,这些服务器通常需要您为其腾出的任何 RAM。
最后,我想听听你对“充足的存储空间”的定义。如果你只是把一个 2TB 的硬盘放在那里,或者甚至把一组 4 块硬盘放在 RAID 10 中,你可能会发现这不是尺寸这与速度一样重要。尤其是您的数据库,它将消耗您的 I/O 性能。确保您处理好这一点,因为很容易出错。如果您使用的是 SAN,那很好……但如果没有,对于上面的例子来说最低限度每台物理主机应为 2U 机箱,至少配备 7 个传统磁盘(用于 RAID 10),其中包含一个热备用磁盘,以便在磁盘发生故障时立即开始重建;或者配备 4 个高端 SSD(再次为 RAID 10)的 1U 机箱。您甚至可能希望在支持数据库服务器的系统上拥有更多。
答案2
对此确实没有好的答案。
性能取决于您的硬件和应用程序的需求。
通常使用虚拟机是因为当您没有在一个操作系统上运行所有东西时,它们会使机器的维护和管理变得容易得多。现代硬件上的裸机虚拟机管理程序(例如 Vmware ESXi)可以最大限度地减少虚拟化带来的开销。