构建集群由3台使用JGroups的Linux机器组成

时间:2014-07-23 14:51:52

标签: java network-programming jgroups

我将使用JGroups构建一个由三台Lunix机器组成的集群。代码运行正常,但每台机器独立工作,显然没有集群。

然而,当我在单机中运行代码作为独立的并且我创建3个实例时,它工作正常并形成一个集群。所以我认为问题不在于代码。

以下是java代码和UDP.XML文件。

package com.github.dustinbarnes;

import org.jgroups.JChannel;
import org.jgroups.ReceiverAdapter;
import org.jgroups.View;
import org.jgroups.blocks.locking.LockService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;

@SuppressWarnings("FieldCanBeLocal")
public class Node extends ReceiverAdapter
{
    private static final Logger LOG = LoggerFactory.getLogger(Node.class);

    private AtomicBoolean isMaster = new AtomicBoolean(false);

    private Thread statusPrinter;
    private Thread acquiringThread;
    private LockService lockService;
    private JChannel channel;
    private Lock masterLock;

    public static void main(String[] args) throws Exception
    {
        Node node = new Node();
        node.start();
    }

    public Node() throws Exception
    {
        this.channel = new JChannel(Node.class.getClassLoader().getResourceAsStream("udp.xml"));
        this.channel.setReceiver(this);
        this.channel.connect("master-cluster");
        this.lockService = new LockService(this.channel);
    }

    public void start()
    {
        this.startAcquiringThread();
        this.startStatusPrintingThread();
    }

    @Override
    public void viewAccepted(View view)
    {
        LOG.info("Cluster event has happened!");
    }

    private void startAcquiringThread()
    {
        acquiringThread = new Thread()
        {
            @Override
            public void run()
            {
                Thread.currentThread().setName("acquire-lock");
                getLock();
            }
        };

        acquiringThread.setDaemon(true);
        acquiringThread.start();
    }

    private void getLock()
    {
        masterLock = lockService.getLock("master");
        masterLock.lock();

        isMaster.set(true);
        LOG.info("I have become the master!");
    }

    private void startStatusPrintingThread()
    {
        statusPrinter = new Thread() {
            @Override
            public void run()
            {
                Thread.currentThread().setName("status-printer");

                //noinspection InfiniteLoopStatement
                while ( true ) {
                    try
                    {
                        LOG.info("is master [" + isMaster + "]");
                        LOG.info("cluster view [" + channel.getViewAsString() + "]");
                        sleep(2000L);
                    }
                    catch ( InterruptedException e )
                    {
                        // If the sleep gets interrupted, that's fine.
                    }
                }
            }
        };

        statusPrinter.setDaemon(true);
        statusPrinter.start();
    }
}

这是UDP文件: -

<!--
  Default stack using IP multicasting. It is similar to the "udp"
  stack in stacks.xml, but doesn't use streaming state transfer and flushing
  author: Bela Ban
-->

<config xmlns="urn:org:jgroups" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/JGroups-3.1.xsd">
<UDP mcast_port="${jgroups.udp.mcast_port:45588}" tos="8" ucast_recv_buf_size="20M" ucast_send_buf_size="640K" mcast_recv_buf_size="25M" mcast_send_buf_size="640K" loopback="true" max_bundle_size="64K" max_bundle_timeout="30" ip_ttl="${jgroups.udp.ip_ttl:8}" enable_bundling="true" enable_diagnostics="true" thread_naming_pattern="cl"

    timer_type="old" 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="2" thread_pool.max_threads="8" thread_pool.keep_alive_time="5000" thread_pool.queue_enabled="true" thread_pool.queue_max_size="10000" 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" />

<PING timeout="2000" num_initial_members="20" />
<MERGE2 max_interval="30000" min_interval="10000" />
<FD_SOCK />
<FD_ALL />
<VERIFY_SUSPECT timeout="1500" />
<BARRIER />
<pbcast.NAKACK2 xmit_interval="1000" xmit_table_num_rows="100" xmit_table_msgs_per_row="2000" xmit_table_max_compaction_time="30000" max_msg_batch_size="500" use_mcast_xmit="false" discard_delivered_msgs="true" />
<UNICAST xmit_interval="2000" xmit_table_num_rows="100" xmit_table_msgs_per_row="2000" xmit_table_max_compaction_time="60000" conn_expiry_timeout="60000" max_msg_batch_size="500" />
<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="2M" min_threshold="0.4" />
<MFC max_credits="2M" min_threshold="0.4" />
<FRAG2 frag_size="60K" />
<RSVP resend_interval="2000" timeout="10000" />
<pbcast.STATE_TRANSFER />
<CENTRAL_LOCK/>
<!-- pbcast.FLUSH  /-->

1 个答案:

答案 0 :(得分:0)

  • 确保绑定到可路由的IP地址:127.0.0.1将工作
  • 确保防火墙上有所需端口的孔:您可以通过iptables -F
  • 关闭防火墙来测试
  • 使用McastSenderTest / McastReceiverTest查看主机之间是否收到多播