为什么infinispan复制的缓存不复制?

时间:2019-05-09 12:04:53

标签: java hibernate wildfly infinispan

我有一个EE应用程序,我想将其部署到集群中的2个wildfly13实例。我有一个使用@Cache(来自休眠状态)和@NamedQuery的实体,并带有使用缓存的提示:实体可以通过id(将使用@Cache)和其他查询(使用查询提示)。

用于提示的缓存区域是“ replicated-query”。 我使用wildfly 13,所以我有休眠5.1.14(非ee 8预览模式),infinispan 9.2.4,jgroups 4.0.11和Java 10(由于Unsafe类中的某些删除,所以我们无法进入Java 11)有依赖的库)。 该应用程序有100多个EJB,并且LOC接近15万,因此暂时不升级Wildfly。

问题是:复制的缓存没有复制,甚至没有按复制开始。

Infinispan replicated cache not replicating objects for read没有帮助,Replicated infinispan cache with Wildfly 11也没有帮助。

我将jgroups与tcpping一起使用(由于该应用程序将部署在私有云上,因此我们需要保持网络尽可能低,因此udp是不可选项)。集群在2个wildfly实例之间形成良好(由日志和jmx确认),但是复制的缓存并未在部署时开始,就好像找不到传输一样。

我用于“复制缓存”类型的缓存名称没有任何区别,包括预先配置的“复制查询”。

使用Paul Ferraro here提到的jgroup的“未弃用的配置”,不允许集群形成(在我的情况下,这是后退一步,因为使用conf时集群正在形成)。

一件奇怪的事情:配置为复制的UpdateTimestamp缓存正在复制(由日志和jmx确认:该区域的名称以repl_async结尾)。

默认情况下,缓存处于invalidation_sync中,并且可以正常运行,因为sql查询仅使用相同的参数(由日志和统计信息确认)才发出一次。

目前(出于测试/调试目的),我将两个实例都部署在本地。 omega1的端口偏移为20000,omega2的端口偏移为30000。

我没有尝试过分布式缓存,因为从我读到的内容来看,我会遇到同样的问题。

以下是实体的相关部分:

@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>

我希望:

  1. 复制的缓存将在部署时启动(如果在infinispan子系统中配置,甚至可能会在启动时启动)

  2. 缓存的数据将在更新/过期/无效时在读取的节点和无效的群集范围内的节点之间复制

  3. 要从缓存中检索的数据(本地,因为它应该已被复制)。

我觉得我离预期的结果还差得很远,但我缺少一些东西。

任何帮助将不胜感激!

更新1 : 我只是尝试了@Bela Ban的建议,并在两个节点上将初始主机设置为localhost[7600],但均未成功:集群未形成。我使用端口偏移量来启动本地计算机上的两个节点,以避免端口重叠。

在两台主机上都使用localhost[7600]时,由于我需要使用端口偏移量,一个节点如何知道要连接到另一个端口的端口?

我什至尝试在以偏移量20000开头的节点上localhost[7600],localhost[37600],并在以偏移量30000开头的节点上尝试localhost[7600],localhost[27600]。集群正在形成,但是缓存没有复制。

更新2 : 实体的缓存位于invalidation_sync中,并按预期方式工作,这意味着jgroups可以按预期方式工作,并确认集群结构良好,所以我猜这是与infinispan或wildfly相关的问题。

2 个答案:

答案 0 :(得分:0)

如果使用端口7600(在jgroups-tcp.xml中),则列出端口27600和37600将不起作用:localhost[27600],localhost[37600]应该为localhost[7600]

答案 1 :(得分:-1)

除了纠正其他答案中指出的端口外,我认为您还需要val datasets = Try(Computing.process(input_bi.asInstanceOf[(Dataset[SortieFondsct], Dataset[SortieFondIP], Dataset[EntreeFondsct], Dataset[EntreeFondIP])], connector)) match { case Success(v) => System.out.println("Success") case Failure(err) => { val monitoringToSave = err match { case _: ArrayIndexOutOfBoundsException => Logger.error(ERROR_TYPE_MISSING_ARGS, "Computing", DRIVER_VIR_SORT_NAME, err, true, idDimTemps) case _: AnalysisException => Logger.error(ERROR_TYPE_INVALID_QUERY, "Computing", DRIVER_VIR_SORT_NAME, err, true, idDimTemps) case _: FileNotFoundException => Logger.error(ERROR_TYPE_FILE_NOT_FOUND, "Computing", DRIVER_VIR_SORT_NAME, err, true, idDimTemps) case _: EmptyFileException => Logger.error(ERROR_TYPE_FILE_IS_EMPTY, "Computing", DRIVER_VIR_SORT_NAME, err, true, idDimTemps) case _: EmptyColumnException => Logger.error(ERROR_TYPE_COLUMN_VALUE_EMPTY, "Computing", DRIVER_VIR_SORT_NAME, err, true, idDimTemps) case _: Throwable => Logger.error(ERROR_UNKNOWN, "Computing", DRIVER_VIR_SORT_NAME, err, true, idDimTemps) } CassandraClient.saveMonitoring(monitoringToSave, connector) throw err } } // ******************** SAVING STEP ******************** val persist = Try(Saving.process(datasets.asInstanceOf[(Dataset[SortieFondsct], Dataset[SortieFondIP], Dataset[EntreeFondsct], Dataset[EntreeFondIP])])) match { //error here case Success(v) => System.out.println("Success") case Failure(err) => { val monitoringToSave = err match { case _: DifferentNumberInsertedLinesException => Logger.error(ERROR_TYPE_DIFF_NB_LINES_INSERT, "Saving", DRIVER_VIR_SORT_NAME, err, true, idDimTemps) case _: CannotGetDataFromCassandra => Logger.error(ERROR_TYPE_CANNOT_GET_DATA_FROM_DB, "Saving", DRIVER_VIR_SORT_NAME, err, true, idDimTemps) case _: Throwable => Logger.error(ERROR_UNKNOWN, "Saving", DRIVER_VIR_SORT_NAME, err, true, idDimTemps) } CassandraClient.saveMonitoring(monitoringToSave, connector) throw err } } 中的<global-state/>,例如:

<cache-container>