非常慢的数据库服务器的模式

时间:2008-12-28 15:51:02

标签: sql-server asp.net-mvc design-patterns architecture caching

我正在构建一个Asp.net MVC站点,我有一个用于Web应用程序的快速专用服务器,但数据库存储在许多其他应用程序使用的非常繁忙的Ms Sql Server中。

此外,如果Web服务器速度非常快,则应用程序响应时间很慢,主要是因为数据库服务器响应缓慢。

我无法更改数据库服务器,因为在Web应用程序中输入的所有数据都需要在最后到达那里(出于备份原因)。

数据库仅在webapp中使用,我想找到一种缓存机制,其中所有数据都缓存在Web服务器上,并且更新以异步方式发送到db。

对于我来说,读取db数据和插入数据之间的直接对应并不重要:想象一下如何读取StackOverflow上的问题以及插入后不必立即显示的新插入问题。

我想在WCF服务之间构建一个可以在慢速数据库服务器和本地服务器之间交换和同步数据的服务(可能是Sqllite或SqlExpress服务器)。

这个问题的最佳模式是什么?

7 个答案:

答案 0 :(得分:3)

你的瓶颈是什么?读数据还是写数据?

如果您对阅读数据感到担忧,那么使用像memcached这样的基于内存的数据缓存机制将会成为一种性能助推器,就像大多数主流和最大的网站一样。 Scaling facebook hi5 with memcached是一本很好的读物。同时实现应用程序侧页面缓存会丢弃应用程序发出的查询,从而触发较低的db负载和更好的响应时间。但这对数据库服务器负载没有太大影响,因为您的数据库有其他一些重度用户。

如果编写数据是瓶颈,那么实现某种异步中间件存储服务似乎是必要的。如果你在前端服务器上有快速和慢速的响应时间数据存储,那么使用像mysql或postgresql这样的轻量级数据库存储(也许不是那么轻量级;))并使用你的真实数据库作为你站点的从属复制服务器是一个很好的选择对你而言。

答案 1 :(得分:1)

我会做你正在考虑的事情。为应用程序使用另一个数据库,仅将当前数据库用于备份目的。

答案 2 :(得分:1)

我曾经遇到过这个问题,我们决定采用数据仓库的组合(即每隔一段时间从数据库中提取数据并将其存储在一个单独的只读数据库中)和通过Windows服务排队的消息(更新。)

这非常好用,因为MSMQ确保了可靠的消息传递(更新没有丢失),数据仓库确保数据在本地数据库中可用。

但仍然取决于几个因素。如果要将大量数据传输到Web应用程序,则可能需要一些时间来重建仓库,您可能需要考虑数据复制或事务日志传送。此外,在重建仓库并处理消息之前,更改不可见。

另一方面,该解决方案是可扩展的,并且可以相对容易地实现。 (例如,您可以使用集成服务将数据提取到仓库,并使用BL层处理更改。)

答案 3 :(得分:0)

有许多复制技术可以为您提供正确的结果。通过在配置的“Web”端安装SQL Server实例,您可以选择:

  • 从Web端(发布者)到数据库服务器端(suscriber)进行快照复制。您需要在Web服务器上使用付费版本的SQLServer。我从未参与过这种配置,但它可能会在预定的同步时间内使用大量的Web服务器资源
  • 在数据库 - 服务器端(发布者)和Web端(suscriber)之间进行合并(或在请求时进行事务处理)复制。然后,您可以使用免费版本的MS-SQL Server,并根据您对Web服务器出现故障时潜在数据丢失的容忍度来安排同步过程。

答案 4 :(得分:0)

我想知道你是否可以改进它在Web端添加MDF文件而不是在其他IP中处理Sever ...

只需添加一个SQL 2008 Server Express Edition文件并尝试,只要你没有传递4Gb数据就可以了,当然还有更多的限制,但是,为了速度,为什么不尝试?

答案 5 :(得分:0)

您还应该考虑涉及的网络交换机。如果数据库服务器正在与多个Web服务器通信,则它可能受到网络连接速度的限制。如果它们仅通过100mb网络交换机连接,那么您可能还想查看升级。

答案 6 :(得分:0)

WCF服务对于这个问题来说是一个非常糟糕的工程解决方案 - 为什么在可以使用标准SQLServer连接机制确保数据正确传输时自己创建。日志传送将按选定的时间间隔发送数据。

这样,您就可以获得快速本地sql服务器,并且数据在慢速备份服务器中正确保存。

你应该调查慢速sql服务器,性能问题可能与它的负载无关,而更多地与你要求它使用的查询和索引有关。