我正在使用JBoss Cache(尝试过的版本3.2.7和3.1.0)来创建一个复制的Map,用于在Application Server之间缓存数据。在过去,我做了一些检查,如果它成功,它确实。我的测试环境始终是同一网段中的2个节点。 由于IT部门有时会遇到UDP问题,我们使用TCP(TCPPING进行发现)。 现在,客户报告了我们的节点丢失同步而不是复制数据的问题。 它们在2个子网(2和2)中有4个节点。他们说,当他们在任何子网中使用2个节点时,它可以工作。当他们开始第三次时,问题就开始了。 日志文件状态很多" merge"表示分区问题的问题。 所以我在公司做了自己的测试。我的设置是Windows下的笔记本电脑和两个带Ubuntu的虚拟机。虚拟机使用桥接网络接口。使用DHCP,我们的IT部门为我的3个节点提供不同的子网IP。我的主机笔记本电脑与虚拟机不同。 TCP节点之间的通信有效。不应该涉及防火墙。 我的设置太多了。 我编写了一个小程序,它只是初始化JBoss Cache,获取缓存(MAP)并在地图中的intervall中更改值,然后显示整个地图的内容。很简单,涉及2个课程。 我的JBoss Cache设置如下:
<?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>
启动我的测试节点我为他们提供了以下系统属性。
-Djgroups.bind_addr=NODE1
-Djgroups.tcpping.initial_hosts=NODE1[7900],NODE2[7900],NODE3[7900]
-Djgroups.tcpping.start_port=7900
从日志消息中我可以看到GMS消息,NODE地址确实是所有节点的指定NODE-X [7900]。
NODE1-3作为IP号码给出。可以从其他节点到达这些IP号。 NODE1,2位于同一子网中 NODE3位于不同的子网
我做了大量测试,更改了配置,JBossCache版本,运行的节点组合等。 有时候它有效,有时它不起作用。 如果成员找到对方似乎影响的一个原因是初始主机信息。根据主机的顺序,如果给出了3的其他主机,则从列表中省略自己的ip,设置是否有效。它还取决于节点的启动顺序。
我确信它与JGroups Group会员资格有关。可能需要添加参数以使其更加健壮。 我真的很感激为了让节点可靠地相互通信而尝试的一些提示。
除了试图找出JBoss Cache(JGroups)的问题之外,我还使用Hazelcast(TCP)进行了相同的测试。它完美地工作没有任何问题,因此基本网络应该适用于节点。 我考虑转用Hazelcast,但这需要在我们的几个客户IT部门进行重新部署,我希望避免这种情况。