[英]Why infinispan replicated cache isn't replicating?
我有一个EE应用程序,我想在集群中部署到2个wildfly13实例。 我有一个使用@Cache
(来自休眠状态)和@NamedQuery
的实体,并带有使用缓存的提示:实体可以通过id(将使用@Cache
)和其他查询(在这种情况下使用查询提示)进行查询。
用于提示的缓存区域是“复制查询”。 我使用wildfly 13,所以我有休眠5.1.14(非ee 8预览模式),infinispan 9.2.4,jgroups 4.0.11和Java 10(由于Unsafe类中的某些删除,所以我们无法进入Java 11)有依赖的库)。 该应用程序有100多个EJB,并且LOC接近150k,因此暂时无法升级wildfly。
问题是:复制的缓存不进行复制,甚至不能按复制开始。
Infinispan复制的缓存不复制要读取的对象没有帮助, Wildfly 11的 Infinispan的复制缓存也不起作用 。
我将jgroups与tcpping一起使用(由于该应用程序将部署在私有云上,因此我们需要保持网络尽可能低,因此udp是不可选项)。 群集在2个wildfly实例之间形成良好(由日志和jmx确认),但是复制的缓存并未在部署时启动,就好像找不到传输一样。
我用于“复制缓存”类型的缓存名称没有任何区别,包括预配置的“复制查询”。
保罗·费拉罗(Paul Ferraro) 在此处提到的对jgroup使用“不推荐使用的配置”不允许集群形成(在我的情况下,这是后退,因为使用conf时集群正在形成)。
一件奇怪的事情是:配置为复制的UpdateTimestamp缓存正在复制(由日志和jmx确认:该区域的名称以repl_async结尾)。
默认情况下,缓存处于invalidation_sync中,并且可以正常运行,因为sql查询仅使用相同的参数(由日志和统计信息确认)才发出一次。
目前(出于测试/调试目的),我将两个实例都部署在本地。 端口偏移为20000的omega1和端口偏移为30000的omega2。
我没有尝试过分布式缓存,因为从我读到的内容来看,我会遇到同样的问题。
这是实体的相关部分:
@Entity
@Table(name = "my_entity", schema = "public")
@NamedQueries({
@NamedQuery(name = "myEntityTest", query = "select p from MyEntity p where p.value = :val", hints = {
@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"),
@QueryHint(name = org.hibernate.annotations.QueryHints.CACHE_REGION, value = "RPL-myEntityTest")
})
})
@Cache(usage = CacheConcurrencyStrategy.NONE, region = "replicated-entity")
这是standalone-full-ha.xml的jgroups子系统部分:
<subsystem xmlns="urn:jboss:domain:jgroups:6.0">
<channels default="omega-ee">
<channel name="omega-ee" stack="tcpping" cluster="omega-ejb" statistics-enabled="true"/>
</channels>
<stacks>
<stack name="tcpping">
<transport type="TCP" statistics-enabled="true" socket-binding="jgroups-tcp"/>
<protocol type="org.jgroups.protocols.TCPPING">
<property name="port_range">
10
</property>
<property name="discovery_rsp_expiry_time">
3000
</property>
<property name="send_cache_on_join">
true
</property>
<property name="initial_hosts">
localhost[27600],localhost[37600]
</property>
</protocol>
<protocol type="MERGE3"/>
<protocol type="FD_SOCK"/>
<protocol type="FD_ALL"/>
<protocol type="VERIFY_SUSPECT"/>
<protocol type="pbcast.NAKACK2"/>
<protocol type="UNICAST3"/>
<protocol type="pbcast.STABLE"/>
<protocol type="pbcast.GMS"/>
<protocol type="MFC"/>
<protocol type="FRAG2"/>
</stack>
</stacks>
</subsystem>
这是jgroups-tcp的套接字绑定:
<socket-binding name="jgroups-tcp" interface="private" port="7600"/>
这是standalone-full-ha.xml的infinispan休眠缓存容器部分:
<cache-container name="hibernate" module="org.infinispan.hibernate-cache">
<transport channel="omega-ee" lock-timeout="60000"/>
<local-cache name="local-query">
<object-memory size="10000"/>
<expiration max-idle="100000"/>
</local-cache>
<invalidation-cache name="entity">
<transaction mode="NON_XA"/>
<object-memory size="10000"/>
<expiration max-idle="100000"/>
</invalidation-cache>
<replicated-cache name="replicated-query">
<transaction mode="NON_XA"/>
</replicated-cache>
<replicated-cache name="RPL-myEntityTest" statistics-enabled="true">
<transaction mode="BATCH"/>
</replicated-cache>
<replicated-cache name="replicated-entity" statistics-enabled="true">
<transaction mode="NONE"/>
</replicated-cache>
</cache-container>
并且我在persistence.xml中设置了以下属性
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL9Dialect"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
我预计:
复制的缓存以在部署时启动(如果在infinispan子系统中配置了它们,甚至可能在启动时启动)
缓存的数据将在更新/到期/无效时在读取的节点和无效的群集范围内的节点之间复制
从缓存中检索的数据(本地,因为它应该已经被复制)。
我觉得离预期的结果还差得很远,但我缺少一些东西。
任何帮助都感激不尽!
更新1 :我只是尝试了@Bela Ban的建议,并将两个节点上的初始主机都设置为localhost[7600]
,但没有成功:集群没有形成。 我使用端口偏移量来启动本地计算机上的两个节点,以避免端口重叠。
在两台主机上都使用localhost[7600]
时,由于我需要使用端口偏移量,一个节点如何知道在哪个端口上连接到另一端口?
我甚至尝试localhost[7600],localhost[37600]
i上启动与所述节点的偏移20000和localhost[7600],localhost[27600]
在一个我开始偏移30000簇被形成但缓存不复制。
更新2 :实体的缓存位于invalidation_sync中,并按预期方式工作,这意味着jgroups可以按预期方式工作,并确认集群的格式正确,所以我猜这是与infinispan或wildfly有关的问题。
如果使用端口7600(在jgroups-tcp.xml中),则列出端口27600和37600将不起作用: localhost[27600],localhost[37600]
应为localhost[7600]
。
除了按照其他答案中所述纠正端口外,我认为您还需要在<cache-container>
<global-state/>
<cache-container>
,例如:
<cache-container name="hibernate" module="org.infinispan.hibernate-cache">
<transport channel="omega-ee" lock-timeout="60000"/>
<global-state/>
<local-cache name="local-query">
<object-memory size="10000"/>
...etc...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.