有一天我在听 Hanselminutes 节目时,突然想到了这个问题。在什么情况下应该将数据与代码分开?例如,在我工作的系统中,数据库与 Web 内容服务器位于同一个机器上。在另一种情况下,我们将它们分开。哪种方法更好?为什么你会有这种感觉?
我个人认为,如果可以承受的话,分开是好的。
数据可以得到更好的保护,免受潜在入侵者的侵害。分离可以实现更好的故障转移控制。分离使您能够更好地管理和平衡流量负载。
数据访问时间确实会成为问题。当两者在一起时,盒子上的延迟与网络上相比显著减少。
您有什么想法?
答案1
考虑分离数据库和 Web 服务器的原因有多种,其中一些与已经提到过的内容相呼应。
首先,存在潜在的性能问题。通常,数据库服务器喜欢内存。它可以分配给缓存数据的内存越多,从磁盘读取所需的访问量就越少。因此,拥有内存是有好处的。因此,您可能会遇到 Web 服务器和数据库服务器之间的内存争用问题。话虽如此,有很多情况下数据库服务器与 Web 服务器在同一台机器上运行,例如 MySQL 或 SQL Server Express,甚至是带有 SQL Server 2005 Reporting Services 的完整版 SQL Server。
其次,您的应用程序可能会使用部分数据,但不是全部数据。如果内部系统也接触数据库,情况尤其如此。这在网络托管环境中不太可能发生,我猜您是根据标签来判断的。但在这种情况下,您可以将网络服务器对数据库的访问权限限制为所需的访问权限。是的,如果网络服务器受到攻击,他们可以获得访问权限,但如果权限有限,他们就无法获得所有内容。将其托管在同一网络服务器上,情况就完全不同了。
第三,因为您可以通过使用 IDS/IPS 查看 Web 服务器和数据库服务器之间的网络流量来了解您的 Web 服务器是否受到攻击。例如,如果我们谈论的是 SQL Server,并且 xp_cmdshell 被发送到数据库服务器或 sp_configure,这应该会告诉 IDS/IPS 有事情发生。这会立即警告您 Web 服务器已受到攻击。
第四是职责分离。如果您有人员负责部署 Web 应用程序,他们可能需要升级 Web 服务器的权限才能执行此操作。需要什么样的权限取决于您正在做什么、使用什么操作系统、使用什么 Web 服务器等,但您明白我的意思。如果这些人不应该访问数据库服务器中的所有内容,并且数据库服务器的更新由不同的人员(如 DBA)处理,那么您可以通过使用不同的服务器更好地保护公司。
答案2
至少这是个非常糟糕的主意。我之前有过这样的设置,我们在同一台服务器上安装了 Apache+MySQL,它经常会超过 10 的负载平均值,页面加载需要很长时间。我们拆分了这两项服务,并将 MySQL 放在较小的服务器上。两台服务器的负载平均值永远不会超过 0.35。
算一下...将 Web 服务器 + DB 服务器放在同一台服务器上会带来很大的损失。
Evan 的观点也很好。将各种东西合并到一台机器中往往会导致许多捷径,这会让扩展变得更加困难。一个服务 = 一个操作系统是一个很好的经验法则(本来会说一个服务 = 一台机器,但现在有了虚拟化)。
答案3
我想到的第一个想法是不要过度设计解决方案。
把所有东西都放在一个盒子里是没问题的。万能的 Stack Overflow 也是这样开始的。
当您有足够的需求(和资源)来证明多个盒子的合理性时,就这么做吧。第一次构建完美的设置不会发生。
无论您设置了什么,如何设置,都要保留出色的备份,以便快速恢复和还原。将您的数据库复制到异地,以便您可以在任何地方重建和还原它(进入云、其他主机等)
祝你好运!
答案4
需要记住的一件重要事情是,当您从一台机器变成两台机器时,停机的可能性会加倍 - 也就是说,如果您的网站依赖数据库才能运行。如果正常运行时间对您来说很重要,那么您可能需要 4 台(或更多)服务器 - 然后您就万事大吉了。
我认为您无需担心数据库与网络服务器通信的速度。通过添加机器获得的 CPU 能力将加快数据库查询本身的速度,并且即使在 100Mb 下,服务器之间的传输与您在实时互联网上提供网页服务的速度相比也微不足道。