1

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

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

我们被建议实施以下架构以获得性能优势:

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

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

支持它的论点是80%的时间,操作是只读的。它们可以在缓存数据库上制作(因为配置为只读,所以它们更快)。其他20%可以在Write DB上完成上完成。

但是,我有以下问题:

  • 只读配置:我们真的可以将缓存数据库配置为只读吗?自从写数据库需要在更改时将更改推送给它们。
  • 同步:由于网络上的所有这些复杂性,确保一切同步有多容易? 网络延迟:保持一切同步的网络开销如何?
  • 复杂性和维护:增加维护开销和增加系统复杂性真的值得吗?
4

1 回答 1

0

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

如果状态设置为只读,则无法更改数据库,因此无法利用 SQL Server 中的该功能。我认为只读数据库的真正优势在于您可以在执行查询时忽略锁定,并且可以创建专门的索引,因为知道不会有任何变化。根据http://sqlblog.com/blogs/linchi_shea/archive/2007/10/01/performance-impact-setting-a-database-to-read-only.aspx(对于 SQL 2005)将其设置为只读没那么大。

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

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

我假设 Write DB 将允许所有用户写入(甚至可能不允许读取?),而 Cache DB 只会为用户提供读取权限,并且特定服务帐户具有写入权限。

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

于 2012-10-04T10:11:49.233 回答