缓存特定方案的体系结构建议

时间:2011-04-12 07:31:23

标签: c# .net oracle caching architecture

SETUP:

我们有一个.Net应用程序,它分布在6个本地服务器上,每个服务器都有一个本地数据库(ORACLE),1个主服务器和1个负载均衡机。请求来到负载均衡器,负载均衡器将传入的请求重定向到6个本地服务器之一。在某些时间间隔内,数据在主服务器中收集并重新分配到6个本地服务器,以便能够使用完整数据做出决策。

每个本地服务器都有一个缓存组件,它根据不同的参数(位置,传入参数等)缓存传入的请求。对于每个请求,本地服务器决定是转到数据库(ORACLE)还是从缓存中获取响应。但是,在这两种情况下,本地服务器都必须转发数据库,​​以便为每个请求执行1次插入和1次更新。

问题:

在高峰期,每个本地服务器每秒接收2000个请求,系统开始减速(CPU:90%)。我想在添加另一台本地服务器之前增加容量。在运行一些基准测试后,瓶颈一如既往,似乎是每次请求数据库不可避免的1次插入和1次更新。

试验方法

为了降低频率,我创建了一个位于DB和.NET应用程序之间的Windows服务。它包含一个管道服务器,并从主.NET应用程序接收每个插入和更新,并将它们保存在Hashtable中。然后,新服务以特定时间间隔进入数据库一次,以进行批量插入和更新。关键是要不那么频繁地去数据库。虽然这有一个积极的影响,但它并没有像我预期的那样有益于系统负载。大多数cpu负载来自oracle.exe,因为每秒请求数增加。

我试图避免尽可能多地访问数据库,避免DB的唯一方法似乎是增加缓存命中率,而不是我尝试的上述解决方案。我的缓存命中率目前约为81%。因为每个本地计算机都有自己的缓存,所以我实际上缺少许多可缓存的请求。当两个类似的请求重定向到不同的服务器时,第二个请求无法从第一个请求的缓存结果中受益。

我在系统架构方面没有太多经验,所以我很感激这个问题的任何帮助。欢迎任何有关不同缓存架构或设置或任何工具的建议。

提前谢谢你,希望我明白我的问题。

3 个答案:

答案 0 :(得分:4)

对我而言,这看起来像是一个计时器解决方案的应用程序。在这种情况下,您可以删除本地数据库并返回到一个。如果您现在拥有本地oracle数据库,则可以实现缓存网格。很可能这将是一个AWT(异步,写入)缓存。见Oracle In-Memory Database Cache Concepts 这不是一个便宜的选择,但如果值得调查。 您可以继续专注于业务逻辑,而不必担心速度。如果已经调整了应用程序代码并且sql具有高性能和可伸缩性,那么这当然只能正常工作。必须准备SQL(使用绑定变量)才能获得最佳性能。 您的应用程序连接到缓存,而不再连接到数据库。您可以在要为其进行缓存的缓存组中创建缓存表。应缓存SQL中的所有表,否则,将完整的SQL传递到Oracle数据库。在网格中,存在缓存融合机制,因此您无需担心网格中数据的位置。 在当前版本中包含对.net的支持。 数据是一致的,并且异步更新到Oracle数据库。如果所需的数据位于缓存中并且您关闭了Oracle数据库,则该应用程序可以继续运行。一旦数据库再次返回,同步就会再次启动。很强大。

答案 1 :(得分:1)

每台服务器每秒2000个请求,大约24000 rps到数据库。这对DB来说是一个巨大的负担。 尝试优化,扩展或集群化数据库。

可能是NoSQL DB(Redis \ Raven \ Mongo),因为中间件适合您。本地服务器将读取\ write sharded NoSQL DB,聚合数据将与Oracle非高峰时间同步。

答案 2 :(得分:1)

我知道这个问题已经过时了,但我想让大家知道我们是如何解决我们的问题的。

经过多次优化后,我们所需要的只是6台本地机器的固态硬盘。安装后,CPU立即下降到30%。这是我第一次看到任何类型的硬件更新对性能有很大帮助。

如果您具有高负载设置,则在进行任何软件或体系结构更改之前,请尝试升级到SSD。

感谢大家的回答。