为什么不建议将数据库和Web服务器放在同一台计算机上?


126

在听完Scott Hanselman对Stack Overflow团队的采访(第1部分和第2 部分)时,他坚持认为SQL Server和应用程序服务器应该位于单独的机器上。这是否只是为了确保如果一台服务器遭到破坏,两个系统都无法访问?安全问题是否超过了两台服务器的复杂性(额外成本,两台服务器之间的专用网络连接,更多维护等),特别是对于小型应用程序,其中两个服务器都不使用过多的CPU或内存?即使有两台服务器,其中一台服务器受损,攻击者仍可能通过删除数据库或弄乱应用程序代码来造成严重损害。

如果性能不成问题,为什么这会是一件大事?

Answers:


158
  1. 安全。您的Web服务器位于DMZ中,可通过公共Internet访问,并接受匿名用户的不可信输入。如果您的Web服务器受到威胁,并且在连接到数据库时遵循了最小特权规则,则最大程度的公开就是您的应用程序可以通过数据库API进行的操作。如果您之间有业务层,则在攻击者和数据之间又迈出了一步。另一方面,如果您的数据库位于同一服务器上,则攻击者现在具有对您的数据和服务器的根访问权限。
  2. 可扩展性。使Web服务器保持无状态可让您轻松地水平扩展Web服务器。这是非常困难的横向扩展的数据库服务器。
  3. 性能。2个盒= CPU的2倍,RAM的2倍和磁盘访问的主轴2倍。

话虽如此,我当然可以看到合理的情况,这些要点都不重要。


27
但是使用2台机器,您发生硬件故障的可能性就会增加一倍;)
TWith2Sugars 2009年

4
@ TWith2Sugars-相对于什么?
凯夫

3
参考 要点1.如果拥有Web层,那么除了App / database API接口之外,您还需要或需要什么?当然那时候游戏结束了吗?然后,就支持DMZ基础结构所需的服务而言,事情变得非常有趣,例如正在运行的任何AD或Microsoft服务?
Noelie Dunne,2009年

4
@Noelie-您的Web层将无权访问,将数据库备份到文件,然后使用xp_cmdshell将文件ftp到ftp.hackers.com。或删除数据库。或修改配置值。等
Mark Brackett

6
@kirgy-由于两台机器是并行的,并且每一个都是单点故障,因此总体可靠性较低;从技术上讲,它不是两倍(实际上是1-(r1 * r2)),但是对于大型可靠性和小型节点来说足够接近了。在0.01%的情况下,它将是0.0199%。但是对于100个节点,它将是36.6%,而不是双倍语句所隐含的100%。
Mark Brackett

45

它并不真正的事(你可以很愉快地运行您的网站在同一台机器上的网络/数据库),它只是在缩放最简单的一步..

这正是StackOverflow所做的-从运行IIS / SQL Server的单台计算机开始,然后在负载开始重载时,购买了第二台服务器,然后将SQL Server移至该服务器上。

如果性能不是问题,请不要浪费金钱来购买/维护两台服务器。


3
我同意,这可以在低负载时完成...随着负载的增加,很容易将它们分成2台或更多台机器。
EJ Brennan

4
我进来并打算就同一件事发表评论。切换数据库服务器就像更改连接字符串一样容易(在大多数情况下)。
CitizenBane

嗯,我喜欢。在提出解决方案之前,有人正在考虑上下文!
demisx

22

另一方面,通过引用不同的Blog Scott(Telligent的Watermasyck),他们发现大多数用户可以通过将数据库与网站放置在同一台计算机上来加快网站访问速度(使用Telligent的Community Server)。但是,对于他们的客户而言,通常db&web服务器是该计算机上的唯一应用程序,并且网站不会对计算机造成太大的压力。然后,不必在网络上发送数据的效率就足以弥补压力的增加。


4
...直到并发使用增加,并且数据库服务器需要更多内存才能有效使用缓冲区和缓存。一旦Web /应用程序和数据库服务器需要的内存超过了它们在一个盒子上可以共享的内存,分页和磁盘I / O就会增加,并且性能会降低。
kermatt

@MattK-但是如果您有大量的内存怎么办?我们有一个应用程序,每个客户端都有自己的数据库,因此数据库和Web服务器都可以非常轻松地水平扩展。鉴于我们拥有的内存多于使用中的磁盘(64GB和〜40GB),将它们全部保留在同一台计算机上的性能会更好吗?
哔哔

1
如果您的工作集适合内存,那么您可能看不到我提到的任何性能问题。服务器的磁盘空间通常多于RAM,但在您的情况下,听起来好像您的数据库完全可以容纳在RAM中,只要共享服务器上的应用程序不占用过多的磁盘空间即可。
kermatt 2011年

15

我认为最大的因素将是性能。Web服务器/应用程序代码和SQL Server都会在内存中缓存常用的数据,而您在相同的内存空间中运行它们会破坏缓存性能。


12
如果您的数据库很小但有大量内存怎么办?通过网络进行每个数据库调用的成本(尤其是如果有很多数据库调用)的收益是否超过了收益?
哔哔

1
@Tom Ritter尽管性能是一个问题(根据这个答案,以及Mark Brackett的答案中的第3点),我知道有些人(包括我在内)可能会通过不将单独的DB服务器放入更多CPU / RAM /中来节省金钱。等等 在替换它的一台唯一服务器上。因此,应考虑到这一点。至于独立的内存,IIS和SQL可以配置为解决它们在资源上的竞争。就我个人而言,“踢球者”是马克的第一要点……安全。我喜欢这样的想法,即受感染的Web服务器对单独的 DB服务器的访问受限。
Dylan-INNO Software

@Tom,您始终可以将内存空间分成两个单独的单元。服务器一半,数据库一半。
Pacerier 2014年

15

汤姆对此是正确的。其他一些原因是它不具有成本效益,并且存在其他安全风险。

Web服务器对硬件的要求与数据库服务器不同。数据库服务器在具有大量内存和真正快速的磁盘阵列的情况下表现更好,而Web服务器仅需要足够的内存来缓存文件和频繁的DB请求(取决于您的设置)。关于成本效率,两台服务器不一定会便宜一些,但是性能/成本比应该更高,因为您不必在不同的应用程序之间争夺资源。由于这个原因,您可能需要为一台服务器花更多的钱,而这既要满足这两种要求,又要提供与2台专业服务器相同的性能。

安全问题是,如果单台计算机受到威胁,则Web服务器和数据库都会受到攻击。使用两台服务器,您将有喘息的机会,因为第二台服务器仍将是安全的(至少一段时间)。

此外,还有一些可伸缩性优点,因为您可能只需要维护几个数据库服务器,这些数据库服务器将被一堆不同的Web应用程序使用。这样,您无需做任何工作即可应用升级或补丁以及进行性能调整。我相信有服务器管理工​​具可以简化这些任务(在单机情况下)。


2
如果您正在运行除SP以外的任何内容,则您的Web服务器可能仍然可以完全访问数据库中的数据
George Mauer

为什么不划算?请明确说明。
罗伯特·杰普森

Robert I在此方面进行了扩展,并在可伸缩性和维护方面添加了一些注释。
Dana the Sane

9

安全是一个主要问题。理想情况下,您的数据库服务器应位于防火墙后面,并且仅打开执行数据访问所需的端口。您的Web应用程序应使用一个SQL帐户连接到数据库服务器,该SQL帐户仅具有该应用程序运行所需的足够权限。例如,您应该删除允许放置对象的权限,并且最肯定不应该使用“ sa”之类的帐户进行连接。

万一您的Web服务器被劫持(即特权完全升级为管理员权限),最坏的情况是您的应用程序的数据库可能会受到威胁,但整个数据库服务器都不会受到威胁(如果数据库服务器和Web服务器是同一台机器)。如果您已经加密了数据库连接字符串,但黑客不够聪明,无法解密它们,那么您丢失的只是Web服务器。


但是您备份了数据库,对吗?否则,由于硬件故障或鲜为人知的错误而导致丢失它的风险同等高。杀死Web服务器的攻击将完全导致停机。将记录添加到表的足够特权足以使站点无用。
丹尼尔·艾威克

当然,您备份数据库是隐式的,在我的帖子中我建议不这样做。
–'Kev

1
是的,但是结论是,旨在破坏该站点的攻击可以通过破坏Web服务器配置或数据库来实现,并且两种解决方案都相同:从备份还原。专门保护数据库是(a)不必要的,并且(b)无论如何都是不可能的。
Daniel Earwicker 09年

@Earwicker-数据库服务器上的所有其他数据库又如何呢?您丢失的只是一个数据库。
Kev

8
除了丹尼尔,您还缺少一个巨大的积分。这与数据库备份无关,而与泄露的数据有关。您的客户还可以吗?“黑客窃取了您所有的客户和销售数据,但是不用担心,我已经备份了。” :)
Dylan-INNO Software

9

尚未提及的一个因素是负载平衡。如果您开始将Web服务器和数据库视为独立的机器,则可以进行优化以减少网络往返次数,并且随着需求的增加,添加第二台Web服务器或第二台数据库引擎也变得更加容易。


6

我可以从第一手经验中得知,将Web服务器和数据库放置在不同的机器上通常是一个好主意。如果您的应用程序占用大量资源,则很容易导致计算机上的CPU周期达到峰值,从而使计算机停机。但是,如果您的应用程序对数据库的使用受到限制,则让它们共享服务器可能没什么大不了的。


6

哇,没有人提出这样一个事实:如果您实际上以5千美元的价格购买SQL Server,您可能会想将它用于Web应用程序之外。如果您使用快递,也许您不在乎。我看到SQL服务器为20到30个应用程序运行数据库,因此将其放在Web服务器上并不明智。

其次,取决于服务器适用于谁。我为金融公司和政府工作。因此,我们在仅使用存储过程并限制从Web服务器到SQL的端口的混帐方法中感到非常痛苦。因此,如果网络应用被黑。黑客唯一可以做的就是调用sproc,因为Web服务器上的用户帐户被锁定为只能查看/调用数据库上的sproc。因此,现在黑客必须弄清楚如何进入数据库。如果它在Web服务器上运行良好,则很容易获得。


5

我同意Daniel Earwicker的观点-安全性问题有很多缺陷。

如果您有一个带有Web服务器的单一安装程序设置,并且只有该Web服务器上的数据库,则如果该Web服务器受到威胁,则您将丢失该Web服务器,并且只会丢失该特定应用程序的数据库。

这与在两台服务器上丢失网络服务器时发生的情况完全相同。您将丢失Web服务器,仅丢失该特定应用程序的数据库。

在两台服务器上进行安装时,“维护数据库服务器其余部分的完整性”这一论点是不相关的,因为在第一种情况下,与其他所有应用程序相关的所有其他数据库服务器(如果有)也不会受到影响。 -被托管在其他地方。

同样,对于Kev提出的问题,“ DB服务器上驻留的所有其他数据库又如何呢?您丢失的只是一个数据库。

  • 如果要在一台服务器上托管一个应用程序和数据库,则只能在该服务器上托管与该应用程序相关的数据库。因此,与多服务器设置相比,您不会在单服务器设置中丢失任何其他数据库。

相比之下,在两台服务器的设置中,攻击者可以访问Web服务器,并且通过代理,可以限制对数据库服务器的权限(在最佳情况下)(在最佳情况下),他们可能会将其他所有应用程序的数据库置于危险之中。进行缓慢的,占用大量内存的查询,或者最大化数据库服务器上的可用存储空间。通过将应用程序分为各自的关注点,就像虚拟化一样,您也可以出于安全目的将它们隔离开来。


4

这取决于应用程序和目的。当高可用性和性能并不重要时,不分离数据库服务器和Web服务器也很不错。尤其要考虑性能的提高-如果应用程序进行大量的数据库查询,则可以通过将它们全部保留在同一系统上来降低响应时间,从而消除大量的网络负载。


2

我认为是因为两台机器通常需要以不同的方式进行优化。除此之外,我不知道,我们将所有应用程序与服务器数据库一起运行在同一台机器上-前提是我们不是面向公众的-但我们没有遇到任何问题。

我无法想象太多的人会担心一台计算机同时受到这两者的危害,因为Web应用程序通常至少对数据库(如果不是数据库内部的架构)几乎无限制地访问数据。

对别人可能会说的东西感兴趣。


1
乔治,我想您应该参考马克·布拉克特的回答。您的Web服务器对数据库的安全性与单独服务器时的安全性不同。特别是“本地磁盘”将不可访问。另外,如果仅一个(多个)网站被黑客入侵,则它们很可能只会损害对该网站数据库的访问(除非您对该连接字符串使用过强大的用户)。还有其他无数种情况,我只是不认为在此发表评论。
Dylan-INNO Software

2

我听了那个播客,这很有趣,但是安全性的论点对我来说毫无意义。如果您破坏了服务器A,并且该服务器可以访问服务器B上的数据,那么您立即可以访问服务器B上的数据。


不对。您可以访问Box A必须拥有的所有数据或特权。在安全设置中,这意味着您具有Box A上的应用程序具有的最高级别的数据库访问权限。你不这样做,不过,有盒B的OS上的DB SA PRIVS,或根
马克·布拉克特

2
“您可以访问Box A必须拥有Box B所拥有的任何数据或特权”-这就是我的意思,即“您可以立即访问服务器B上的数据”。如果RDBMS位于框A上,而框B上没有,它将产生什么区别?注意 我们假设您已经以任何一种方式入侵了BoxA。
Daniel Earwicker 2009年

在两框配置中,如果您应用最小特权原则,并且如果框A(网络)受到威胁,那么应该发生的最坏情况是您丢失了框B上的数据库,而没有更多信息了。
凯夫

1
在单框配置中,如果该框遭到破坏,则您将丢失该框,其中包括数据库。有什么不同?
Daniel Earwicker 09年

2
区别在于,在两框配置中,如果Web服务器受损,您丢失的只是Web服务器,最糟糕的是DB。其余数据库服务器的完整性得到维护。
Kev

2

数据库许可证不是便宜的,通常按CPU收费,因此,通过分离Web服务器,可以降低数据库许可证的成本。

例如,如果您有1台同时运行8个CPU的服务器和包含8个CPU的数据库,则必须支付8 cpu的许可证费用。但是,如果您有两台服务器,每台服务器具有4个CPU,并且在一台服务器上运行数据库,则只需支付4个cpu许可证的费用。


请说明这是如何节省的。
约翰·桑德斯

1
John-他的意思是,要使2台计算机具有同等的性能,您需要将内核数量加倍,这将使SQL Server许可成本增加一倍。如果您获得的所有性能与使用两台计算机相同,为什么还要为SQL Server额外支付$ 10-20k。
发出哔哔声

仅当性能/资源利用率(例如cpu)由应用程序服务器而非数据库服务器控制时才为true。如果数据库需要8 cpus,它将无法正常工作。
安德烈亚斯·迪特里希

1

另一个问题是数据库喜欢占用所有可用内存,并在需要使用内存时将其保留。您可以强制它限制内存,但这会大大降低数据访问速度。


-1

关于通过在Web服务器上运行数据库服务器来获得真正的性能提升的说法是有缺陷的。

由于数据库服务器采用查询字符串并返回结果集,因此实际从数据服务器流向Web服务器的数据相对较小,但是处理查询和生成结果集所需的能力相对较大。因此,围绕数据传输时间优化性能就是围绕错误的事物进行优化。

关于安全性,将数据服务器放置在与Web服务器不同的盒子上具有优势。进行这样的设置并不是安全的全部,也是最终的安全,而是朝着正确方向迈出的一步。

关于可伸缩性,添加Web服务器并将其放入群集中以处理增加的流量非常容易且相对便宜。添加数据服务器并对其进行集群并不是那么容易且便宜。此外,Web服务器和数据服务器具有不同的硬件需求,因此多个设备箱可提供可扩展性。

如果您刚开始时只有一个盒子,那么使用虚拟机是个不错的选择。在一台主机上的不同VM中运行Web服务器和数据服务器可让您获得单独包装的所有收益,而费用却是一个大包装的价格。


1
最初的问题是关于应用程序服务器的,不一定是面向公共Internet的Web服务器。
若昂·布拉干萨

-2

操作系统是另一个考虑因素。尽管您的数据库可能需要更大的内存空间,因此需要UNIX,但是您的Web服务器(或更具体地讲,由于您仅提到了两层,因此更是您的应用程序服务器)可能基于.Net,因此需要Windows。


我没有对此表示反对,但是“虽然您的数据库可能需要更大的内存空间,因此需要UNIX”-如果您运行的是64位Windows和64位SQL,则有很多内存可以使用。
凯夫

抱歉,内存只是作为需要部署到拆分OS的示例原因。其他原因还包括:性能,安全性,企业标准/许可证,供应商的支持,等等
克里斯·诺埃

-6

好!这就是问题,将您的数据库服务器安装在另一台计算机上,并将您的应用程序安装在网络服务器上更加安全。然后,使用Web链接将应用程序连接到DB。谢谢


3
为什么它更安全?
布赖恩·陈
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.