有一天我在听 Hanselminutes 时就出现了这个问题。在什么情况下应该将数据与代码分开?例如,在我在数据库上工作的其中一个系统中,它与服务器 Web 内容位于同一个盒子上。在另一种情况下,我们将它们分开。哪个更好,为什么你会有这种感觉?
我个人认为,如果你能负担得起,分离是好的。
更好地保护数据免受入侵者的侵害。分离允许更好的故障转移控制。和分离使您能够更好地管理和负载平衡流量。
这确实成为问题的地方在于数据访问时间。与通过网络相比,两者在一起时盒子上的延迟显着降低。
你有什么想法?
至少是非常糟糕的主意。我之前有一个设置,我们在同一台服务器上安装了 Apache+MySQL,它的平均负载通常会超过 10 次,并且页面需要永远加载。我们拆分这两个服务并将 MySQL 放在一个较小的服务器上。两台服务器都不会超过 0.35 的平均负载。
算一算……将Web服务器+数据库服务器放在同一台服务器上会有很多损失。
埃文也有一个很好的观点。将事物合并到机器中往往会导致许多捷径,这使得横向扩展变得更加困难。一项服务 = 一个操作系统是一个很好的经验法则(本来可以说一项服务 = 一台机器,但现在有了虚拟化)。
我想到的第一个想法是不要过度设计解决方案。
把所有东西都放在一个盒子里没关系。万能的 Stack Overflow 也是这样开始的。
当您有足够的需求(和资源)来证明多个盒子的合理性时,就去做。建立完美的设置不会第一次发生。
无论您如何设置它以快速恢复和恢复,都可以保留出色的备份。异地复制您的数据库,以便您可以在任何地方重建和恢复它(到云、其他主机等)
祝你好运!
从安全的角度来看,它应该放在单独的盒子上。但是,根据预算,接受或不接受风险应该是一个商业决定。
这是为什么?首先,最佳实践建议:
如果您的数据库位于单独的机器上,则需要额外的步骤来攻击它。如果您遵循深度防御,Web 服务器将无法访问除 db 之外的 db 框上的任何其他内容(因此,没有 shell,没有运行脚本等)。这就是为什么防火墙也有利于内部控制的原因。
如果您确实在安全方面做得很好,那么您的 web-2-db 用户将在 db 上拥有最低权限,只能访问/修改他真正需要的内容(因此,没有删除表等)。有趣的是,对于只需要从几个表中选择和更新的用户来说,我们经常在数据库上看到 GRANT *。
因此,仅仅因为很多人在单个机器上运行 db+web 服务器 + 邮件服务器 + DNS,并不意味着这是最好的安全决策,只是基于 $$ 的可接受风险。
要记住的一件重要的事情是,当您从一台机器变为两台机器时,停机的机会会加倍 - 也就是说,如果您的站点依赖于数据库来运行。如果正常运行时间对您很重要,那么您可能正在查看 4 个(或更多)服务器 - 然后您就很成功了。
我认为您不必担心数据库与网络服务器通信的速度。通过添加机器获得的 CPU 能力将加速数据库查询本身,并且与您在实时互联网上提供网页的速度相比,即使是 100Mb 的服务器之间的传输也应该可以忽略不计。
您考虑分离数据库和 Web 服务器的原因有很多,其中一些原因会与已经提到的内容相呼应。
首先,存在潜在的性能问题。通常,数据库服务器喜欢内存。它可以分配给缓存数据的内存越多,从磁盘读取所需的访问权限就越少。所以有记忆是有好处的。因此,您可能会在 Web 服务器和数据库服务器之间遇到内存争用问题。话虽如此,在很多情况下,数据库服务器与 Web 服务器在同一个机器上运行,例如使用 MySQL 或 SQL Server Express,甚至使用 SQL Server 2005 Reporting Services 的完整 SQL Server。
其次,在某些情况下,您的应用程序可能会使用部分但不是全部数据。如果内部系统也涉及数据库,则尤其如此。这在网络托管环境中不太可能发生,我猜您正在根据您的标签查看。但在这种情况下,您可以将 Web 服务器对数据库的访问限制为仅需要的访问权限。是的,如果 Web 服务器被入侵,他们可以获得该访问权限,但如果这是一组有限的权限,他们就无法获得所有内容。将它托管在同一个 Web 服务器上,这是一个完全不同的故事。
第三是因为您可以通过查看使用 IDS/IPS 的 Web 服务器和数据库服务器之间的网络流量来了解您的 Web 服务器是否受到损害。例如,如果我们正在谈论 SQL Server 并且 xp_cmdshell 被发送到数据库服务器或 sp_configure,这应该告诉 IDS/IPS 有什么事情发生了。这会立即警告您 Web 服务器已被入侵。
四是职责分离。如果您有负责部署 Web 应用程序的人员,他们可能需要升级到 Web 服务器的权限才能这样做。什么样的权利取决于你在做什么,什么操作系统,什么网络服务器等等,但你明白了。如果这些人不应该访问数据库服务器中的所有内容,并且对数据库服务器的更新由不同的一组人(如 DBA)处理,那么您可以通过使用不同的服务器更好地保护公司。
我不认为单独的盒子安全性会更好。如果攻击者破坏了提供 Web 服务的机器,那么无论如何这都可能导致数据库破坏。故障转移和负载平衡/可扩展性参数要好得多。
但如果你只有一个网络盒子,我肯定更愿意将数据保存在同一个盒子上。
如果他们可以访问您的网络机器,他们可以从您的配置文件中提取数据库详细信息,加载一个 php shell,然后从那里转储数据。一个安全优势是如果您在同一台机器上拥有多个数据库。
但是,它允许您分散负载,如果您需要这样做以提高性能,那很好,只要您有快速连接,如前所述。
如果您担心冗余,那么将所有数据放在一个盒子上并在另一个盒子上备份会很好。
我同意,如果可以负担得起,分离会更好。
如果盒子可以处理负载 CPU/RAM - 那么出于性能原因将它们放在同一个盒子上可能会更好,因为 Web 服务器和数据库服务器之间没有网络延迟。
我对一种方式与另一种方式没有强烈的意见。但是,如果您打算“向外扩展”,您可能会考虑使 Web 服务器尽可能无状态,以便在不重新设计设计的情况下进行扩展。