【问题标题】:What are the pros and cons of a distributed second level cache versus focusing on tuning database分布式二级缓存与专注于调优数据库的优缺点是什么
【发布时间】:2011-09-30 03:06:34
【问题描述】:

我们有一个使用休眠和二级缓存的网站。我们正在进行一场辩论,因为当我们迁移到多网络服务器环境(前面有一个负载平衡器)时,有人想要关闭二级缓存。

一个论点是摆脱二级缓存并专注于优化和调整 Db。另一个论点是推出分布式缓存作为二级缓存。

我很想听听人们对 DB 调优与分布式缓存的优缺点(考虑到所涉及的工作量、成本、复杂性等)

【问题讨论】:

    标签: sql-server asp.net-mvc nhibernate second-level-cache distributed-caching


    【解决方案1】:

    我们在使用 Microsoft AppFabric 分布式缓存框架 (NHibernate Velocity Provider) 的多服务器环境中使用 NHibernate 的二级缓存并取得了巨大成功。

    话虽如此,使用二级缓存需要对框架有更深入的了解,以防止出现意外结果。此外,在使用分布式缓存之前,测量它们的开销也很重要。

    所以我的回答基本上是——在使用二级缓存之前,你应该真正测试一下,看看是否真的需要。

    【讨论】:

    • 您能否强调一些需要担心的问题或问题。还有你用来衡量的最佳指标是什么??
    【解决方案2】:

    我认为多网络服务器和分布式二级缓存可以 - 并且可能应该 - 共存。

    首先,如果我们以 memcached 为例,它支持分布式对象存储,所以如果你不使用它,你可以切换到它。它有效。

    其次,我猜您正在引入网络服务器场以响应不断增加的网络请求,这反过来又意味着对数据的请求增加。如果您终止缓存,那么您将通过查询来优化您的数据库并不重要。因此,您将在等待数据库返回数据的同时缩短执行时间。

    对于 web-node 1 请求数据集 A 和 web-node 2 请求数据集 A 的情况尤其如此 --> 您将执行两次相同的查询,而使用二级缓存您只执行一次。

    所以我的建议是:

    不要杀死你的二级缓存。您已经花费了资源来实现它,并且禁用它并不会提高应用程序的性能。即使是单个节点的 memcached 也比没有节点要快。

    做优化您的数据库操作。这意味着从数据库端(索引、视图、sp、函数,可能是具有只读和只写节点的集群)和应用程序端(优化您的查询、延迟/急切加载分析、不要获取您不获取的数据) '不需要,通过 Future、MutliQuery、MultiCriteria 将多个查询组合成单次往返)

    做优化您的二级缓存实现。有些数据集的过期日期是无限的,因此您只查询数据库一次,有些数据集的过期日期很短,因此可能会更频繁地执行昂贵的查询。通过优化查询和数据库,您将提高查询的性能,但二级缓存将在峰值负载时节省您的皮肤,其中短到期日期数据集将由更频繁地缓存。

    如果使用文本查询是日常操作,请使用数据库的全文功能,或者更好的是,使用像 Lucene.NET 这样的独立服务(可以通过 NHibernate.Search 与 NHibernate 集成)

    【讨论】:

      【解决方案3】:

      两者兼而有之。您应该有一个分布式缓存以防止对数据库的不必要调用和一个经过调整的数据库,以便快速返回初始调用。例如,facebook 需要大量的缓存来扩展,但我敢肯定,如果初始查询需要 10 分钟,它不会有太大的好处。 :)

      【讨论】:

        【解决方案4】:

        这是一个非常困难的话题。无论哪种情况,您都需要熟练度。要么是非常精通的 DBA,要么是非常精通的 NHibernate / Cache 管理员。

        就个人而言,我更喜欢完全控制我的 SQL 并调整数据库。由于您只有多个网络服务器(不一定是多个数据库实例),因此您也可能会更好。现代数据库有非常高效的缓存,所以通常你在应用程序中使用错误配置的二级缓存会造成更大的伤害,而不是仅仅让数据库缓存 sql 语句、游标、数据、缓冲区等。我已经体验过它可以很好地工作大约 15 个 weblogic 服务器和只有一个具有大量内存的数据库。

        虽然您已经拥有 NHibernate,但从它移回 SQL(也许使用 LINQ?)可能是一项相当昂贵的任务,不值得付出努力。

        【讨论】:

          【解决方案5】:

          两个字:衡量。

          由于您已经实现了缓存,因此您可能可以衡量将其关闭以进行基准测试的影响。

          【讨论】:

            【解决方案6】:

            在负载平衡场景中,您必须使用分布式缓存提供程序来获得最佳性能和一致性,这与优化数据库无关。在任何情况下,您都应该优化您的数据库。

            【讨论】:

              猜你喜欢
              • 2012-05-12
              • 2010-11-02
              • 2021-12-06
              • 1970-01-01
              • 2016-03-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多