听听Scott Hanselman对Stack Overflow团队(part 1和2)的采访,他坚持认为SQL服务器和应用服务器应该在不同的机器上。这只是为了确保如果一台服务器受到攻击,两个系统都无法访问?安全问题是否超过两台服务器的复杂性(额外成本,两者之间的专用网络连接,更多维护等),特别是对于小型应用程序而言,这两种服务器都没有使用过多的CPU或内存?即使有两台服务器,一台服务器受到攻击,攻击者仍可能通过删除数据库或弄乱应用程序代码而造成严重损害。
如果表现不成问题,为什么会这么大?
答案 0 :(得分:136)
所有这一切,我当然可以看到合理的情况,这些点都不重要。
答案 1 :(得分:38)
它不是真的重要(你可以很高兴地在同一台机器上使用web /数据库运行你的网站),这只是扩展中最容易的步骤..
正是StackOverflow所做的 - 从运行IIS / SQL Server的单机开始,然后当它开始负载很重时,购买了第二台服务器,并将SQL服务器移到了它上面。
如果性能不是问题,请不要浪费钱购买/维护两台服务器。
答案 2 :(得分:21)
另一方面,参考不同的博客斯科特(特易西根的Watermasyck) - 他们发现大多数用户可以通过将数据库放在与网站相同的机器上来加速网站(使用Telligent的社区服务器) 。但是,在客户的情况下,通常是db& Web服务器是该机器上唯一的应用程序,并且该网站不会对机器造成太大影响。然后,不必通过网络发送数据的效率更高,以弥补增加的压力。
答案 3 :(得分:14)
汤姆对此是正确的。其他一些原因是它不具有成本效益,并且存在额外的安全风险。
Web服务器具有与数据库服务器不同的硬件要求。数据库服务器具有大量内存和非常快的磁盘阵列,而Web服务器只需要足够的内存来缓存文件和频繁的数据库请求(取决于您的设置)。关于成本效益,两台服务器不一定会更便宜,但性能/成本比应该更高,因为您不需要竞争资源的不同应用程序。出于这个原因,你可能不得不花费更多的时间来为一台迎合两者的服务器提供相同的性能,并提供与2个专业服务器相同的性能。
安全问题是如果单台计算机受到攻击,则Web服务器和数据库都容易受到攻击。有两个服务器,你有一些喘息的空间,因为第二个服务器仍然是安全的(至少一段时间)。
此外,还有一些可伸缩性优势,因为您可能只需维护一些不同Web应用程序使用的数据库服务器。这样,您可以减少应用升级或修补程序以及执行性能调整的工作量。我相信有一些服务器管理工具可以让这些任务更容易(在单机情况下)。
答案 4 :(得分:13)
我认为最重要的因素是表现。 Web服务器/应用程序代码和SQL Server都会在内存中缓存常用的请求数据,并且通过在相同的内存空间中运行它们来杀死缓存性能。
答案 5 :(得分:9)
安全是一个主要问题。理想情况下,您的数据库服务器应位于防火墙后面,只打开执行数据访问所需的端口。您的Web应用程序应该使用SQL帐户连接到数据库服务器,该帐户具有足够的权限以使应用程序正常运行,而不再需要。例如,您应该删除允许删除对象的权限,并且大多数情况下您不应该使用诸如“sa”之类的帐户进行连接。
如果您将Web服务器丢失为劫持(即完全权限升级为管理员权限),最糟糕的情况是您的应用程序的数据库可能会受到威胁而不是整个数据库服务器(就像如果数据库服务器和Web服务器是同一台机器的情况)。如果您已经加密了数据库连接字符串,并且黑客不够精明,无法对其进行解密,那么您丢失的只是Web服务器。
答案 6 :(得分:8)
尚未提及的一个因素是负载平衡。如果您开始将Web服务器和数据库视为单独的计算机,则可以优化更少的网络往返次数,并且随着需求的增加,可以更轻松地添加第二个Web服务器或第二个数据库引擎。
答案 7 :(得分:6)
我可以从第一手经验说起,将Web服务器和数据库放在不同的机器上通常是个好主意。如果您的应用程序占用大量资源,则很容易导致计算机上的CPU周期达到峰值,从而导致计算机停止运行。但是,如果您的应用程序对数据库的使用有限,那么让它们共享服务器可能没什么大不了的。
答案 8 :(得分:5)
我同意Daniel Earwicker - 安全问题存在很大缺陷。
如果您使用网络服务器进行单一框设置,并且只有该网络服务器的数据库,那么如果该网络服务器遭到入侵,则会丢失该网络服务器以及该特定应用程序的数据库。
这与在双服务器设置上丢失网络服务器时发生的情况完全相同。您丢失了Web服务器,只丢失了该特定应用程序的数据库。
在具有双服务器设置的情况下“保持数据库服务器完整性的其余部分”这一论点是无关紧要的,因为在第一种情况下,与其他所有应用程序(如果有的话)相关的每个其他数据库服务器仍然存在不受影响,因为他们在其他地方受托。
同样,对于Kev提出的问题,那么驻留在数据库服务器上的所有其他数据库呢?你丢失的只是一个数据库。'
相比之下,在2服务器设置中,攻击者可以访问Web服务器,并通过代理,对数据库服务器的有限权限(在最好的情况下),他们可以将每个其他应用程序的数据库放在通过执行缓慢的内存密集型查询或最大化数据库服务器上的可用存储空间来冒险。通过将应用程序分离到他们自己的关注点,非常类似于虚拟化,您还可以出于安全目的将它们隔离开来。
答案 9 :(得分:5)
其次,取决于服务器的用户。我为金融公司和政府工作。所以我们在使用sprocs并限制从webserver到SQL的端口的方法中使用了一种疯狂的痛苦。因此,如果Web应用程序被黑客入侵。黑客唯一能做的就是调用sprocs,因为Web服务器上的用户帐户被锁定只能查看/调用数据库上的sprocs。所以现在黑客必须弄清楚如何进入数据库。如果它在Web服务器上很好,很容易到达。
答案 10 :(得分:3)
这取决于应用和目的。当高可用性和性能不重要时,不要将数据库和Web服务器分开也不错。特别是考虑到性能提升 - 如果应用程序进行大量的数据库查询,可以通过将所有数据库保持在同一系统上来消除相当大的网络负载,从而保持响应时间较短。
答案 11 :(得分:2)
我认为这是因为这两台机器通常需要以不同的方式进行优化。除此之外我不知道,我们在同一台机器上使用服务器数据库运行我们的所有应用程序 - 授予我们不面向公众 - 但我们没有遇到任何问题。
我无法想象有太多人关心一台计算机遭到攻击,因为如果不是数据库内的架构,Web应用程序通常几乎不受限制地访问数据。
对其他人可能会说的话感兴趣。
答案 12 :(得分:2)
数据库许可证并不che并且通常按CPU收费,因此通过分离Web服务器可以降低数据库许可证的成本。
例如,如果您有1个服务器同时执行包含8个CPU的Web和数据库,则必须为8个cpu许可证付费。但是,如果您有两台服务器,每台服务器有4个CPU并在一台服务器上运行数据库,则只需支付4个cpu许可证
答案 13 :(得分:2)
我听了那个播客,这很有意思,但安全性的说法对我来说毫无意义。如果您已经破坏了服务器A,并且该服务器可以访问服务器B上的数据,那么您可以立即访问服务器B上的数据。
答案 14 :(得分:1)
另一个问题是数据库喜欢占用所有可用内存并保留它以备它何时使用它。您可以强制它限制内存,但这可能会大大减慢数据访问速度。
答案 15 :(得分:-1)
认为通过在Web服务器上运行数据库服务器可以获得真正的性能提升是一个有缺陷的论点。
由于数据库服务器采用查询字符串并返回结果集,实际从数据服务器流向Web服务器的数据相对较小,但处理查询和生成结果集所需的功率相对较大。因此,围绕数据传输时间优化性能是围绕错误的事情进行优化。
关于安全性,将数据服务器放在与Web服务器不同的盒子上是有好处的。拥有这样的设置并不是所有安全,而是结束所有的安全性,但它是朝着正确方向迈出的一步。
关于可扩展性,添加Web服务器并将它们放入集群以处理增加的流量是容易且相对便宜的。添加数据服务器并对其进行集群并不是那么容易和便宜。此外,Web服务器和数据服务器具有不同的硬件需求,因此多个框可以提供可伸缩性。
如果你从小开始只有一个盒子,那么一个好方法就是使用虚拟机。在一台主机上的不同虚拟机中运行Web服务器和数据服务器,可以以一个大的盒子价格为您提供单独盒子的所有收益。
答案 16 :(得分:-2)
操作系统是另一个考虑因素。虽然您的数据库可能需要更大的内存空间,因此需要UNIX,但您的Web服务器 - 或者更具体地说是您的应用服务器,因为您只提到两层 - 可能是基于.Net的,因此需要Windows。
答案 17 :(得分:-3)
确定!这就是将数据库服务器安装在另一台计算机上并将您的应用程序安装在Web服务器上的安全性。然后,使用Web链接将应用程序连接到DB。谢谢。