Jgroups群集在重新启动单个群集成员时中断

时间:2016-03-02 14:29:05

标签: jgroups

当一些集群成员重新启动时,我遇到了jgroups集群相互失去的问题。 我们在群集中有13个节点,它们都在同一个子网中。重新启动4个节点时,整个群集都会崩溃。所有成员都不再相互认可,现有的未重新启动的成员也找不到对方。

我们开始收到SUSPECT消息并且无法收集所有ACK

0; 33mWARN [Incoming-1,广播,节点-12] [GMS]节点-12:在2000ms之后未能收集视图[node-12 | 27]的所有ACK(预期= 11),缺少11个ACK node-12,node-4,node-6,node-13,node-11,node-2,node-7,node-8,node-9,node-0,node-3

0; 33mWARN [INT-2,广播,节点-12] [FD]节点-12:我被节点-5怀疑;忽略SUSPECT消息并发回HEARTBEAT_ACK

PFB我们正在使用的配置,如果配置有任何问题,请告诉我。我们正在使用3.4.1.Final版本的JGroups

<TCP loopback="true"
recv_buf_size="${tcp.recv_buf_size:20M}"
send_buf_size="${tcp.send_buf_size:640K}"
discard_incompatible_packets="true"
max_bundle_size="64K"
max_bundle_timeout=“5"
enable_bundling="true"
use_send_queues="true"
sock_conn_timeout="300"
timer_type="new"
timer.min_threads="4"
timer.max_threads="10"
timer.keep_alive_time="3000"
timer.queue_max_size="500"
thread_pool.enabled="true"
thread_pool.min_threads="1"
thread_pool.max_threads="10"
thread_pool.keep_alive_time="5000"
thread_pool.queue_enabled=“true"
thread_pool.queue_max_size="100000"
thread_pool.rejection_policy="discard"
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="discard"
bind_addr="${jgroups.bind_addr}"
bind_port="${jgroups.bind_port}" />

<JDBC_PING connection_driver="${database.driver}"
            connection_password="${database.password}"
            connection_username="${database.user}"
            connection_url="${database.url}"
            initialize_sql="${jgroups.schema}"
    datasource_jndi_name="${datasource.jndi.name}"/>

    <MERGE2 min_interval="10000" max_interval="30000" />
    <FD_SOCK />
    <FD timeout="3000" max_tries="3" />
    <VERIFY_SUSPECT timeout="1500" />
    <BARRIER />
    <pbcast.NAKACK use_mcast_xmit="false" exponential_backoff="500" discard_delivered_msgs="true" />
    <UNICAST2 />
    <pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000" max_bytes="4M" />
    <pbcast.GMS print_local_addr="true" join_timeout="3000" view_bundling="true" />
    <UFC max_credits="20M" min_threshold="0.4" />
    <MFC max_credits="20M" min_threshold="0.4" /`enter code here`>
    <FRAG2 frag_size="60K" />
    <pbcast.STATE_TRANSFER />

1 个答案:

答案 0 :(得分:1)

如何重启节点?通过杀死它们,还是通过优雅的关闭(=集群休假)? 对您的配置的一些评论:

  • 常规线程池只有1个线程在运行,直到队列已满(100&#39; 000个元素),因此队列中可能有相当多的待处理消息。我建议禁用队列(thread_pool.queue_enabled=“false"),或增加最小线程数和/或减少队列大小(比如100)

  • 尝试TCPPING而不是JDBC_PING,只是为了看看这是否有帮助

  • 使用MERGE3代替MERGE2

  • 使用NAKACK2代替NAKACK。一般情况下,我建议使用您使用的JGroups版本附带的udp.xml,并应用上面的建议。这可以防止您使用旧协议。

  • 使用FD_ALL代替FD

  • MFC / UFC的最大信用额度为20M太多,实际上无法实现流量控制的目的。

同时运行probe.sh(查看JGroups手册以获取详细信息)以获取有关各种协议的信息,例如:传输中的线程池使用(TCP),FD_ALL等中的怀疑

希望有帮助,