我们有一个使用休眠和二级缓存的网站。我们正在进行一场辩论,因为当我们迁移到多网络服务器环境(前面有一个负载平衡器)时,有人想要关闭二级缓存。
一个论点是摆脱二级缓存并专注于优化和调整 Db。另一个论点是推出分布式缓存作为二级缓存。
我很想听听人们对 DB 调优与分布式缓存的赞成和反对(考虑到所涉及的工作量、成本、复杂性等)
我们有一个使用休眠和二级缓存的网站。我们正在进行一场辩论,因为当我们迁移到多网络服务器环境(前面有一个负载平衡器)时,有人想要关闭二级缓存。
一个论点是摆脱二级缓存并专注于优化和调整 Db。另一个论点是推出分布式缓存作为二级缓存。
我很想听听人们对 DB 调优与分布式缓存的赞成和反对(考虑到所涉及的工作量、成本、复杂性等)
In case of a load balancing scenario you have to use a distributed cache provider to get best performance and consistency, that has nothing to do with optimizing your database. In any scenario you should optimize you database.
两个都。您应该有一个分布式缓存以防止对数据库的不必要调用和一个经过调整的数据库,以便快速返回初始调用。例如,facebook 需要大量的缓存来扩展,但我敢肯定,如果初始查询需要 10 分钟,它不会有太大的好处。:)
两个字:量。
由于您已经实现了缓存,因此您可能可以衡量将其关闭以进行基准测试的影响。
我认为多 Web 服务器和分布式二级缓存可以并且可能应该共存。
首先,如果我们以 memcached 为例,它支持分布式对象存储,所以如果你不使用它,你可以切换到它。有用。
其次,我猜您正在引入 Web 服务器场以响应不断增加的 Web 请求,这反过来又意味着对数据的请求增加。如果您终止缓存,那么您将通过查询来优化您的数据库并不重要。因此,您将改善执行时间,但在等待数据库返回数据的同时。
对于 web-node 1 请求数据集 A 和 web-node 2 请求数据集 A 的情况尤其如此 --> 您将执行两次相同的查询,而使用二级缓存您只执行一次。
所以我的建议是:
不要杀死你的二级缓存。您已经花费了资源来实现它,并且禁用它并不会提高应用程序的性能。即使是单个节点的 memcached 也比没有节点要快。
优化您的数据库操作。这意味着从数据库端(索引、视图、sp、函数,可能是具有只读和只写节点的集群)和应用程序端(优化您的查询、延迟/急切加载分析、不要获取您不获取的数据) '不需要,通过 Future、MutliQuery、MultiCriteria 将多个查询组合成单次往返)
请优化您的二级缓存实现。有些数据集的过期日期是无限的,因此您只查询数据库一次,有些数据集的过期日期很短,因此可能会更频繁地执行昂贵的查询。通过优化查询和数据库,您将提高查询的性能,但二级缓存将在峰值负载时节省您的皮肤,因为缓存将更频繁地获取短到期日期数据集。
如果使用文本查询是日常操作,请使用数据库的全文功能,或者更好的是,使用像 Lucene.NET 这样的独立服务(可以通过 NHibernate.Search 与 NHibernate 集成)
这是一个非常困难的话题。无论哪种情况,您都需要熟练度。要么是非常精通的 DBA,要么是非常精通的 NHibernate/Cache 管理员。
就个人而言,我更喜欢完全控制我的 SQL 并调整数据库。由于您只有多个网络服务器(不一定是多个数据库实例),因此您也可能会更好。现代数据库有非常高效的缓存,所以通常你在应用程序中使用错误配置的二级缓存会造成更大的伤害,而不是仅仅让数据库缓存 sql 语句、游标、数据、缓冲区等。我已经体验过它可以很好地工作大约 15 个 weblogic 服务器和只有一个具有大量内存的数据库。
但是,由于您已经拥有 NHibernate,因此离开它,回到 SQL(也许使用 LINQ?)可能是一项相当昂贵的任务,不值得付出努力。
我们在使用 Microsoft AppFabric 分布式缓存框架( NHibernate Velocity Provider )的多服务器环境中使用 NHibernate 的二级缓存并取得了巨大成功。
话虽如此,使用二级缓存需要对框架有更深入的了解,以防止出现意外结果。此外,在使用分布式缓存之前,测量它们的开销也很重要。
所以我的回答基本上是——在使用二级缓存之前,你应该真正测试一下,看看它是否真的需要。