我维护一个大型 Web 项目 (java + postgres + 一些相关工具) 的服务器,该项目目前托管在三台机器上:
- 机器:邮件服务器(postfix)、广告服务器(lighttpd + php + openx)
- 机器:Tomcat + Servlet
- 机器:PostgreSQL 服务器,静态内容(通过 lighttpd)
所有机器都运行 Debian Stable 并通过 VPN(openvpn)连接。由于硬件非常老旧(每台都配有 AMD Athlon 3000+ 和 2GB RAM),因此是时候进行更换了。
这些服务器现在应该被一台大型机器(16GB Ram、支持 VT 的大型 Intel CPU、5 个 IP)取代。
现在的问题是:我是否仍应使用虚拟机分离不同的任务,还是应该像往常一样将所有任务都放在虚拟机上。优缺点是什么?
我想到以下几点:
专业虚拟化:
- 安全性:由于虚拟机是分开的,所以您不能拿走整台机器(希望如此)
反对虚拟化:
- 性能:存在性能损失
- 工作:每个虚拟机都需要进行多次维护工作
- 通信:不同虚拟机(数据库的 Servlet)之间的通信变得更加复杂。
- 硬内存限制:我必须为每台机器分配静态资源(如内存)。如果我的数据库服务器在 30 秒内需要更多的内存(比分配的内存多),而其他机器上有更多的内存可用,那么这可能是一个缺点。如果没有虚拟化,这不会成为问题。
谢谢任何提示。
答案1
性能损失 - 是的,从技术上讲确实存在。您或您的用户会注意到吗?除非是一些疯狂的高端工作负载,或者您严重过度配置虚拟机*(或者试图将 5 个具有“正常”RAM 分配的虚拟机挤到旧的现有服务器上,否则我对此表示严重怀疑。请记住实际检查您的 RAM 使用情况 - 如果您将所有内容拆分,则不需要为默认运行级别 3 的 NTP 服务器分配 512MB 内存。(仅拆分 NTP 服务器是过度的,这只是一个例子。)
工作 - 这是真的。如果只是从一台服务器转移到三台服务器,可能没什么大不了的 - 进行更改,将命令从一个终端会话复制/粘贴到另一个终端会话。除此之外,你还需要某种管理工具,我目前正在研究木偶。
*内存限制 - 取决于您使用的虚拟化解决方案。某些环境(如 ESX/vSphere)允许您为虚拟机分配比物理可用内存更多的 RAM。如果您为该功能付费,ESX 可让您设置资源池,并根据需要自动调整资源,同时还能够设置优先级。与所有事物一样,您必须了解其工作原理以及特定环境中的权衡。
答案2
正如许多人提到的那样,虚拟化非常好,因为您可以轻松地制作/恢复快照。
我想谈一些事情。有人提到需要维护多台机器而不是一台。通过网络启动虚拟机并从中心点安装所有软件的分区,可以减少大量维护工作。这样,软件更新/安装会自动迁移到其他机器,从而消除大部分额外的维护时间。
还有第三个选择:FreeBSD jails。——这些让您创建单独的环境,而无需虚拟化的开销。——分离度比常见的 GNU/Linux chroot 高得多(所有内容,甚至网络层,都在内核级别分离)——每个 jail 可以拥有自己的 IP,而且这些实际上不是虚拟化的,而只是内核+文件系统中的隔离环境。 http://en.wikipedia.org/wiki/FreeBSD_jail
我不会否认安全性提升是其优点。确实,在某些情况下,虚拟机是有可能被破解的(虚拟机软件中的错误 - 尽管这些错误会被修补;和其他任何事情一样,请跟上更新) - 安全性取决于各个层,没有一层是万无一失的。虽然简单往往有利于安全性,但有些事情会给你带来太多好处,正如我所提到的,可以通过从中央位置安装基础系统(甚至可以是只读安装)来简化事情 -
以下是真实世界中的例子:
假设一个 php 应用程序存在 mysql 注入漏洞,攻击者可以利用此漏洞将文件写入您的服务器。(例如:通过 INTO OUTFILE sql 语法) - 一种常见的方法是编写一个包含更多漏洞代码的 php 文件,进一步破坏服务器;毕竟 php 脚本几乎相当于以执行它的用户身份运行的 shell 帐户(执行 apache 进程的用户) - 从那里,攻击者只需本地利用即可获得完全 root 访问权限。如果 mysql 处于隔离环境中,例如虚拟机、bsd jail 或 chroot 环境,攻击者将能够将其 php 代码写入文件,但他永远无法通过访问 url 来执行该文件,因为 mysql 服务无法访问由 apache 托管的任何文件。
答案3
我更喜欢虚拟化,因为,
a.) 你可以用一种非常简单的方式进行服务器备份
b.) 您可以创建正在运行的服务器的第二个实例来测试某些内容,而无需接触生产服务器
c.) 您可以完美地处理资源,使一台服务器比其他服务器具有更高的优先级。
干杯
拨弦
答案4
安全部分是相对的,因为您必须保护三个环境而不是一个环境,而单靠分离并不能提供太多的安全性。
您说得对,性能确实会有所损失,更不用说虚拟化软件中的任何错误都可能导致整个机器崩溃。