2

Im running jgroups application inside docker containers. Containers are running across two nodes (A & B) and they are all connected using docker swarm mode overlay network.

I referred to https://docs.docker.com/engine/swarm/networking/

Here is what i did and observed.

  1. Jgroup bind address is set to the overlay network IP of the container
  2. containers running inside the same node are forming a cluster.
  3. I used nslookup to ensure that the overlay network IP of a container running in node A is reachable by a container running in node B
  4. docker node ls display the nodes correctly and able to schedule the containers instances successfully.

Docker Version: Docker version 17.03.1-ce, build c6d412e

OS: Ubuntu 16.04.2

Cloud: AWS (Port 7946 TCP/UDP and 4789 UDP are open)

JGroups: 3.6.6

Jgroups XML:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="urn:org:jgroups"
    xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/jgroups.xsd">
<TCP bind_port="7600"
     recv_buf_size="${tcp.recv_buf_size:5M}"
     send_buf_size="${tcp.send_buf_size:5M}"
     max_bundle_size="64K"
     max_bundle_timeout="30"
     use_send_queues="true"
     sock_conn_timeout="300"

     timer_type="new3"
     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"/>

<JDBC_PING connection_url="jdbc:mysql://${database.host:localhost}:3306/mydb"
           connection_username="root"
           connection_password="root"
           connection_driver="com.mysql.jdbc.Driver"
           initialize_sql="CREATE TABLE JGROUPSPING (
                    own_addr varchar(200) NOT NULL,
                    bind_addr varchar(200) NOT NULL,
                    created timestamp NOT NULL,
                    cluster_name varchar(200) NOT NULL,
                    ping_data varbinary(5000) DEFAULT NULL,
                    PRIMARY KEY (`own_addr`,`cluster_name`))"
   insert_single_sql="INSERT INTO JGROUPSPING (own_addr, bind_addr, created, cluster_name, ping_data) values (?,
   '${jgroups.bind_addr:127.0.0.1}',now(), ?, ?)"
   delete_single_sql="DELETE FROM JGROUPSPING WHERE own_addr=? AND cluster_name=?"
   select_all_pingdata_sql="SELECT ping_data FROM JGROUPSPING WHERE cluster_name=?"
/>

<MERGE3  min_interval="10000"
         max_interval="30000"/>
<FD_SOCK/>
<FD timeout="3000" max_tries="3" />
<VERIFY_SUSPECT timeout="1500"  />
<BARRIER />
<pbcast.NAKACK2 use_mcast_xmit="false"
                discard_delivered_msgs="true"/>
<UNICAST3 />
<pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000"
               max_bytes="4M"/>
<pbcast.GMS print_local_addr="true" join_timeout="2000"
            view_bundling="true"/>
<MFC max_credits="2M"
     min_threshold="0.4"/>
<FRAG2 frag_size="60K"  />
<RSVP resend_interval="2000" timeout="10000"/>
<pbcast.STATE_TRANSFER/>

Any help is appreciated

Pragalathan M
  • 1,673
  • 1
  • 14
  • 19

1 Answers1

0

You probably need to use host networking (--net=host) or use external_addr in the transport in addition to bind_addr.

An alternative if you have DNS available is DNS_PING [2].

For details take a look at [1].

[1] https://github.com/belaban/jgroups-docker

[2] http://www.jgroups.org/manual4/index.html#_dns_ping

Bela Ban
  • 2,186
  • 13
  • 12