从单个Web服务器迁移到多个Web服务器负载均衡环境时,Nhibernate二级缓存问题/问题

8

我的以前的设置是一个Web服务器和一个数据库服务器。我使用了nhibernate第二级缓存来缓存一些东西,以避免大量的调用到数据库。这个方法一直很好用,因为我使用了这个程序集。

nhibernate.caches.syscache

我添加了以下代码,以启用第二级缓存(使用常规syscache提供程序):

       return configuration
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ApplicationMap>().Conventions.Add(typeof(Conventions)))
            .ExposeConfiguration(
                c => {
                    c.SetProperty("proxyfactory.factory_class", proxyFactory);
                    c.SetProperty("cache.provider_class", "NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache");
                    c.SetProperty("cache.use_second_level_cache", "true");
                    c.SetProperty("cache.use_query_cache", "true");
                    c.SetProperty("expiration", "86400");
                })
            .BuildSessionFactory();

我现在已经迁移到一个拥有多个web服务器的新环境中,正在尝试理解这样做的影响(我仍然只有一个数据库服务器)。

由于缓存之前是存储在web服务器上的,现在似乎每个web服务器上都有2个并行的缓存,它们本身可能不同步,可能会导致过时的更新等问题。

如何最好地解决之前所拥有的缓存的好处,同时又利用提供了这种新设置的web服务器负载平衡的弹性?

2个回答

8
Ayende关于NHibernate中二级缓存的使用进行了博客记录。在Web Farm场景下,您需要使用分布式缓存。例如SysCache2(它依赖于ASP.NET缓存,并且可以配置为使用分布式提供程序)或MemCache。这里有一篇文章说明如何配置memcached。

感谢提供这些链接,它们是很棒的文章。我还有几个问题。1. 这个缓存应该在哪里运行(在其中一个 Web 服务器上还是现在需要另一台服务器来进行缓存)。如果必须使用另一台机器,那么由于现在需要通过网络跳转到达缓存,这不会变得更慢吗? - leora
@ooo,理想情况下,应该使用具有大量内存的另一台机器。您也可以使用Web服务器,但通常不建议这样做。 - Darin Dimitrov
关于额外的网络跳跃来到达缓存(与在同一台机器上相比),您有什么看法?此外,这台新机器是否应该专门用作缓存机器? - leora
@ooo,确实与将其存储在同一服务器上相比,额外的网络跳跃可能会慢一些。但请记住,如果您在实际的Web服务器上使用它们进行缓存,并且由此导致实际应用程序的速度变慢,那么您将消耗大量内存,这个额外的网络跳跃就像光速一样快。因此,在分布式环境下,绝对要专门用于缓存的独立服务器。如果出于财务原因,您可以从同一台服务器开始,但是您应该考虑在某个时候卸载缓存。 - Darin Dimitrov
你知道每个提供商的比较情况(设置容易程度、性能等)是否有好的参考吗? - leora
+1 for memcached,在我们的环境中,我们使用http://www.couchbase.com/products-and-services/membase-server作为服务器。 - DanP

1

我用过memcached,它像魔法一样好用。除了需要调整缓存大小之外,它完全不会有任何麻烦。在每个Web服务器节点上设置一个memcached节点,并在添加节点时维护该配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接