实现只读/写入数据库服务器体系结构

时间:2012-08-30 06:29:41

标签: database asp.net-mvc-3 architecture sql-server-2008-r2

我们有一个ASP.NET MVC3 Web应用程序,它包含以下内容:

  • 网站(MVC3)
  • 数据访问服务(WCF + EF)
  • 数据库服务器(SQL Server 2008 R2)

为了性能优势,我们建议实施以下架构:

  • Web服务器群集(网站+数据访问服务)
    • 循环负载均衡
    • 此群集中的每个服务器都有一个缓存(只读)数据库
    • 我们有一组SP,我们可以明确划分为两类 - 读取SP 写入SP
    • 每个Read SP将连接到缓存数据库,每个Write SP将连接到写入数据库
  • 具有复制/镜像的数据库服务器
    • 这是写入数据库
    • 每当它发生变化时,它都会向所有缓存数据库
    • 传播所有更改
    • 除此之外,它还实现了复制/镜像,因此在发生故障时可以进行备份。

这是一个非常粗略的想法,我不确定它会给我们的系统带来性能提升。

支持它的论据是 80%的时间,操作是只读的。它们可以在缓存DB 上制作(因为它们被配置为只读,它们更快)。其他 20%可以在写入数据上进行。

但是,我有以下问题:

  • 只读配置:我们实际上可以将缓存数据库配置为只读吗?由于写入数据库需要在更改时将更改推送给它们。
  • 同步:通过网络实现所有这些复杂性,确保一切都同步是多么容易? 网络延迟:以及保持所有内容同步的网络开销怎么办?
  • 复杂性和维护:是否真的值得增加维护费用并增加系统的复杂性?

1 个答案:

答案 0 :(得分:0)

设计不错,它类似于我曾经讨论过如何创建审计数据库的讨论,每个人都可以添加,但无法更新或删除。

如果状态设置为只读,则无法更改数据库,因此无法在SQL Server中利用该功能。我认为只读数据库的真正优势在于,您可以在执行查询时忽略锁定,并且可以创建专用索引,因为知道什么都不会改变。根据{{​​3}}(对于SQL 2005),将其设置为只读的收益并不是那么大。

如果您愿意牺牲某些一致性,可以将查询的隔离级别降低到例如读取已提交,以便生成更少的锁。

创建两个数据库的一个优点是,它使您能够跨不同的数据库服务器分隔数据库。即使CacheDb服务器具有100%的CPU负载和网络负载,这也可以保证写操作成功。

我认为写入数据库允许所有用户写入(甚至可能禁止读取?),而缓存数据库只会向用户提供读取权限,特定服务帐户具有写入权限。

Write DB和Cache DB之间的内容同步可以使用SQL Server Integration Services(SSIS)进行,我不认为设计传输逻辑会很困难。将两台服务器放在同一建筑物中,并且它们之间具有千兆位网络将意味着您在传输中的延迟将会很低。