我正在听播客#19,而Joel和Jeff正在争论在与IIS安装相同的机器上运行SQL Server.我不得不说,这听起来像Jeff折叠到了Joel,但是我再次猜测哪一个是哪个.;)
各自的优点和缺点是什么?哪个更好?
我通常单独运行它们(Joel的偏好),但我可以看到Jeff的观点,即两者彼此更接近.
出于安全考虑,最好将Web和数据库机器分开,最好在两者之间安装防火墙.Web服务器向全世界公开.不幸的是,有些人乐于窃取或破坏这些服务器上包含的信息.
然后是性能方面.众所周知,SQL Server喜欢内存.IIS也是如此,特别是如果网站广泛使用缓存和会话信息.所以你在这里也有潜在的冲突.拥有专用的SQL Server机器显然比让一台机器完成所有负载要好.
然后,分离可以更容易地识别调谐的需要和调整各个硬件组件的能力.
总而言之,一台功能强大的机器可以满足现场环境中IIS和SQL Server的需求,并不一定比两台为每台服务器的特定要求而定的机器便宜.(杰夫阿特伍德在其中一个播客中提到,升级一台机器的成本与获得第二台机器相同).
@MarkR
通过将SQL Server移动到另一个盒子确实增强了安全性,这与暴露的Attack Surface有关.
Web服务器受到来自Internet的恶意访问.人们希望它永远不会发生,但是已经(并且将来可能存在)漏洞可以通过穿越防火墙的畸形请求来利用.
利用其中一个漏洞可能导致任意代码能够执行.
如果Web服务器以这种方式受到损害,那么在该机器上运行的任何其他内容现在都是易受攻击的,并且利用软件可能会在特权上下文中运行.受感染机器的攻击面要宽得多.
如果SQL Server安装在同一台计算机上,则任何数据库都容易受到攻击.
现在,如果SQL Server安装在单独的机器上,它本身只能通过其公共接口访问.数据库的附加表面仅限于该接口.因此,为了破坏数据库,您现在必须先破坏Web服务,然后是SQL Server.这比在同一台机器上使用它们要困难得多.
进一步扩展原则,它也是使用存储过程的一个论据.如果Web服务器只能使用存储过程访问数据库服务器,则接口以及受攻击表面受到大量约束.如果Web服务器能够对数据库服务器执行任意SQL,则攻击面再次大得多,并且数据的风险大大增加.
在数据有价值的系统中,这些风险虽然相对较小,但却非常真实,并且确定此类风险的业务风险是解决方案设计的一个重要方面.
将它们放在同一台机器上:
减少它们之间的延迟 - 因此,如果您有大量简单的查询,这可以提高性能
使您的开发和性能测试更容易,因为您可以使用单个盒子(或VM)来完成
如果应用程序不需要冗余而且不需要扩展,那么将它们放在同一个盒子上就是明确的胜利 - 它更容易维护.
我不认为安全性论点有任何重要性 - 我认为分离它们没有任何安全性好处.Web服务器需要具有足够的数据库访问权限才能查看和修改所有或大部分数据,因此如果它完全受到攻击,SQL框也会被有效地破坏.
对于非常敏感的站点,它们之间具有防火墙的单独服务器的优势可能很有用,但它带来了许多问题.
分离IIS上的查询性能 - 由于需要通过网络传递数据,SQL服务器的运行速度可能非常慢,即使服务器间隔2英尺,DNS仍可能是一个因素,因此可能需要做一些工作才能使应用程序工作也分裂.
管理.它可能很明显,但它有2个服务器,2个Windows许可证和涉及的管理以及遍历防火墙的复杂性.
拆分服务器建议:
在服务器之间安装千兆位LAN.
优化查询以作为存储过程运行
优化查询以仅返回最少量的数据.
确保服务器间寻址使用IP地址或有效的DNS查找.
为SQL临时结果提供足够的SQL内存.