2011-08-24 29 views
2

我们在集群中使用Ehcache作为Hibernate的L2缓存。由于我们逐个更新服务器以避免宕机,因此在某些时候,群集中可能有一台服务器运行的是旧版本的代码,另一台则是更新后的版本。休眠 - 集群缓存和更新类版本

我认为这个问题是Ehcache,但我将其缩小到Hibernate。 Hibernate不会缓存整个实体,而是缓存字段值的数组。所以如果你的实体有不同的模式复制到你的缓存中,那么负载就会发生坏事,因为这个数组是盲目复制的。

我无法在Ehcache级别停止此操作。我想在我的实体类上设置serialVersionUID,但这不适用于那些较低级别的数组。

我该如何向Hibernate表明实体版本已经改变,缓存中的值不应该被加载?

回答

0

我不认为你可以避免在这种情况下的容量暂时降低,因为你在这里是一个系统运行服务器与不兼容的代码库。

即使您可以评估实体格式与其缓存版本的不兼容性,并且不会从缓存中加载它,您最终得到的结果是有些机器会读取/写入缓存,有些会去直接到数据库,这将导致不一致的数据访问,等等等等。基本上,这种方法是一堆蠕虫。

还有一个更好的解决方案。步骤如下:

  1. 从网络断开一半的集群。您可以使用交换机或负载平衡器的管理或任何其他可用的方式。
  2. 取下那一半,升级它,把它带起来。
  3. 连接它。
  4. 断开第二个。
  5. 重复#2和#3。

您在这里得到的是容量暂时降低,同时仍然保持系统可用于在升级时满足客户请求。在非高峰时段它可以很好地工作。您可以通过将新请求路由到集群的升级部分来增强它,因为它变得越来越可用。还有其他的变化,但这个想法是一样的 - 分而治之。

唯一重要的是新老集群不应该互相交谈。你需要你的操作帮助,但它肯定是可行的。

希望这会有所帮助。

斯拉瓦Imeshev

Cacheonix: Reliable Distributed Java Cache