Caching JBoss缓存JGroups成员资格GMS TCping

Caching JBoss缓存JGroups成员资格GMS TCping,caching,tcp,jboss,membership,jgroups,Caching,Tcp,Jboss,Membership,Jgroups,我正在使用JBoss缓存(试用版本3.2.7和3.1.0)在应用服务器之间创建一个用于缓存数据的复制映射。在过去,我做了一些检查,如果它的工作,它做了。我的测试环境始终是同一网段中的两个节点。 由于IT部门有时会遇到UDP问题,因此我们使用TCP(TCping进行发现)。 现在,一位客户报告了我们的节点丢失同步而不复制数据的问题。 它们在2个子网(2和2)中有4个节点。他们说,当他们在任何子网中只使用2个节点时,它就工作了。当他们开始第三次时,问题就开始了。 日志文件说明了许多“合并”问题,表明

我正在使用JBoss缓存(试用版本3.2.7和3.1.0)在应用服务器之间创建一个用于缓存数据的复制映射。在过去,我做了一些检查,如果它的工作,它做了。我的测试环境始终是同一网段中的两个节点。 由于IT部门有时会遇到UDP问题,因此我们使用TCP(TCping进行发现)。 现在,一位客户报告了我们的节点丢失同步而不复制数据的问题。 它们在2个子网(2和2)中有4个节点。他们说,当他们在任何子网中只使用2个节点时,它就工作了。当他们开始第三次时,问题就开始了。 日志文件说明了许多“合并”问题,表明存在分区问题。 所以我在我的公司做了我自己的测试。我的设置是Windows下的笔记本电脑和两台带有Ubuntu的虚拟机。虚拟机使用桥接网络接口。使用DHCP,我们的IT部门为我的3个节点提供不同的子网IP。我的主机笔记本电脑与虚拟机位于不同的网络中。节点之间的TCP通信正常工作。不应该涉及防火墙。 我的设置太多了。 我写了一个小程序,初始化JBoss缓存,获取缓存(MAP),在一段时间内更改MAP中的值,然后显示整个MAP的内容。非常简单,涉及两个类。 我的JBoss缓存设置如下:

<?xml version="1.0" encoding="UTF-8"?>
<jbosscache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="urn:jboss:jbosscache-core:config:3.1">
    <clustering mode="replication" clusterName="${jgroups.clustername:DEFAULT}">
    <stateRetrieval timeout="20000" fetchInMemoryState="true" />
    <sync replTimeout="20000" />
    <jgroupsConfig>
            <TCP start_port="${jgroups.tcpping.start_port:7800}" loopback="true" recv_buf_size="20000000"
                 send_buf_size="640000" discard_incompatible_packets="true"
                 max_bundle_size="64000" max_bundle_timeout="30"
                 use_incoming_packet_handler="true" enable_bundling="false"
                 use_send_queues="false" sock_conn_timeout="3000"
                 skip_suspected_members="true" use_concurrent_stack="true"

                 thread_pool.enabled="true" thread_pool.min_threads="1"
                 thread_pool.max_threads="25" thread_pool.keep_alive_time="5000"
                 thread_pool.queue_enabled="false" thread_pool.queue_max_size="100"
                 thread_pool.rejection_policy="run" oob_thread_pool.enabled="true"
                 oob_thread_pool.min_threads="1" oob_thread_pool.max_threads="8"
                 oob_thread_pool.keep_alive_time="5000"
                 oob_thread_pool.queue_enabled="false"
                 oob_thread_pool.queue_max_size="100"
                 oob_thread_pool.rejection_policy="run" />
            <TCPPING timeout="3000"
                     initial_hosts="${jgroups.tcpping.initial_hosts:localhost[7800],localhost[7801]}"
                     port_range="3" num_initial_members="3" />
            <MERGE2 max_interval="100000" min_interval="20000" />
            <MERGE3 max_interval="100000" min_interval="20000" />
            <FD_SOCK />
            <FD timeout="10000" max_tries="5" shun="true" />
            <VERIFY_SUSPECT timeout="1500" />
            <BARRIER />
            <pbcast.NAKACK use_mcast_xmit="false" gc_lag="0"
                           retransmit_timeout="300,600,1200,2400,4800" discard_delivered_msgs="true" />
            <UNICAST timeout="300,600,1200" />
            <pbcast.STABLE stability_delay="1000"
                           desired_avg_gossip="50000" max_bytes="400000" />
            <VIEW_SYNC avg_send_interval="60000" />
            <pbcast.GMS print_local_addr="true" join_timeout="6000"
                        shun="true" view_bundling="true" />
            <FC max_credits="2000000" min_threshold="0.10" />
            <FRAG2 frag_size="60000" />
            <pbcast.STREAMING_STATE_TRANSFER />
        </jgroupsConfig>
    </clustering>
</jbosscache>
从日志消息中,我可以看到GMS消息,即节点地址确实为所有节点指定的NODE-X[7900]

节点1-3以IP编号的形式给出。可以从其他节点访问这些IP号码。 节点1,2位于同一子网中 节点3位于不同的子网中

我做了大量的测试,更改了配置、JBossCache版本、运行的节点组合等等。 有时有效,有时无效。 一个似乎会影响成员是否找到对方的原因是初始主机信息。根据主机的顺序,如果给定的3个主机中还有其他主机,则将自己的ip从列表中删除,安装程序是否有效。它还取决于节点的启动顺序

我确信这与JGroups组的成员资格有关。也许需要添加一些参数,使其更加健壮。 我真的很想得到一些关于如何让节点可靠地相互通信的提示

除了试图找出JBoss缓存(JGroups)的问题外,我还使用Hazelcast(TCP)进行了相同的测试。它完美地工作,没有任何问题,因此基本的网络应该为节点工作。
我考虑切换到HAZELCAST,但这需要在我们的几个客户IT部门中重新部署,并且我希望避免这一点。

我们与FielF飞9有完全相同的问题。不幸的是,我没有太多的建议,我们仍在与之斗争。显然,TCP传输似乎是一定数量的节点带来的麻烦。我们正在考虑将集群拆分为更小的分区,但也许有更好的解决方案。您最终是如何解决的?我们在软件中引入了Hazelcast。我们的客户在至少2个网段中运行6个节点(我们不确切知道)。到目前为止,没有报告任何问题。Hazelcast很容易配置,而且运行良好。因此,据我所知,您在Wildfly作为子系统的配置中用Hazelcast取代了Infinispan,对吗?谢谢。不,Wildfly不知道Hazelcast。我们将Hazelcast添加到应用程序(EAR/lib)中。在appserver init@@Singleton@@启动期间,我们在一个抽象助手类中初始化Hazelcast。由于我们的客户,我们必须使用TCP而不是UDP,因此要侦听的接口、端口和成员作为系统属性提供给每个节点,并在我们自己的初始化过程中使用。Hazelcast的使用是通过我们的抽象类(静态方法)Cachehelper.put(“Key”,Value)等来完成的。我在使用TCP堆栈和TCping配置的纯JGroups时遇到了一些问题,当我使用版本3.4.1时,我看到JBoss EAP直到6.4都在使用旧版本的JGroups。在我的例子中,使用3.6.13.Final解决了TCping配置中的问题,该配置不尊重带有主机和端口的初始_主机配置。我不知道是你的问题还是相关的。
-Djgroups.bind_addr=NODE1 
-Djgroups.tcpping.initial_hosts=NODE1[7900],NODE2[7900],NODE3[7900]
-Djgroups.tcpping.start_port=7900