diff --git a/.env b/.env index a2c76ac..0dc86cb 100644 --- a/.env +++ b/.env @@ -1,3 +1,4 @@ RABBITMQ_DEFAULT_USER=guest RABBITMQ_DEFAULT_PASS=guest -RABBITMQ_DEFAULT_VHOST=/ \ No newline at end of file +RABBITMQ_DEFAULT_VHOST=/ +RABBITMQ_ERLANG_COOKIE=12345 diff --git a/.erlang.cookie b/.erlang.cookie deleted file mode 100644 index bd41cba..0000000 --- a/.erlang.cookie +++ /dev/null @@ -1 +0,0 @@ -12345 \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..526c8a3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sh text eol=lf \ No newline at end of file diff --git a/README.md b/README.md index 9c8f186..3dec586 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,11 @@ Setup a RabbitMQ Cluster environment on your device using the pure [RabbitMQ](ht ## Quick start -``` +```con docker compose up ``` -Open http://localhost:15672 to login RabbitMQ dashboard. +Open to login RabbitMQ dashboard. > Username: `guest` > Password: `guest` @@ -24,13 +24,15 @@ Open http://localhost:15672 to login RabbitMQ dashboard. ### `docker-compose.yml` -Docker [compose](https://docs.docker.com/compose/compose-file/) config file, including 3 RabbitMQ service cluster and a HAProxy. +Docker [compose](https://docs.docker.com/compose/compose-file/) config file, including 5 RabbitMQ service cluster and a HAProxy. | Service | Description | | ----------- | ------------------------- | | `rabbitmq1` | RabbitMQ (cluster) | | `rabbitmq2` | RabbitMQ (cluster member) | | `rabbitmq3` | RabbitMQ (cluster member) | +| `rabbitmq4` | RabbitMQ (cluster member) | +| `rabbitmq5` | RabbitMQ (cluster member) | | `haproxy` | Load Balancer | #### Default expose ports @@ -39,6 +41,7 @@ Docker [compose](https://docs.docker.com/compose/compose-file/) config file, inc | ----------------- | --------------------------------------------------- | | `localhost:5672` | AMQP 0-9-1 and AMQP 1.0 clients | | `localhost:15672` | HTTP API clients, management UI and `rabbitmqadmin` | +| `localhost:1936` | HAProxy statistics | ### `.env` @@ -46,11 +49,11 @@ Docker [compose](https://docs.docker.com/compose/compose-file/) config file, inc | ------------------------ | ------- | | `RABBITMQ_DEFAULT_USER` | guest | | `RABBITMQ_DEFAULT_PASS` | guest | -| `RABBITMQ_DEFAULT_VHOST` | / | +| `RABBITMQ_ERLANG_COOKIE` | 12345 | ### `.erlang.cookie` -Put your custom [Erlang Cookie](https://www.rabbitmq.com/clustering.html#erlang-cookie) inside this file (default: `12345`) for the nodes in cluster communicate with each other. +Put your custom [Erlang Cookie](https://www.rabbitmq.com/clustering.html#erlang-cookie) value in the `RABBITMQ_ERLANG_COOKIE` environment variable file (`.env`). ### `haproxy.cfg` diff --git a/advanced.config b/advanced.config new file mode 100644 index 0000000..b354304 --- /dev/null +++ b/advanced.config @@ -0,0 +1,5 @@ +[ + %% five replicas by default, only makes sense for nine node clusters + {rabbit, [{quorum_cluster_size, 5}, + {quorum_commands_soft_limit, 512}]} +]. \ No newline at end of file diff --git a/cluster-entrypoint.sh b/cluster-entrypoint.sh index 8812021..67fa6a7 100755 --- a/cluster-entrypoint.sh +++ b/cluster-entrypoint.sh @@ -2,20 +2,15 @@ set -e -# Change .erlang.cookie permission -chmod 400 /var/lib/rabbitmq/.erlang.cookie - # Get hostname from enviromant variable HOSTNAME=`env hostname` echo "Starting RabbitMQ Server For host: " $HOSTNAME +/usr/local/bin/docker-entrypoint.sh rabbitmq-server & +sleep 5 +rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@$HOSTNAME.pid -if [ -z "$JOIN_CLUSTER_HOST" ]; then - /usr/local/bin/docker-entrypoint.sh rabbitmq-server & - sleep 5 - rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@$HOSTNAME.pid -else - /usr/local/bin/docker-entrypoint.sh rabbitmq-server -detached - sleep 5 +if [ -n "$JOIN_CLUSTER_HOST" ]; then + echo "Starting RabbitMQ Server For host: " $HOSTNAME rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@$HOSTNAME.pid rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@$JOIN_CLUSTER_HOST @@ -23,4 +18,4 @@ else fi # Keep foreground process active ... -tail -f /dev/null +sleep infinity \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index a002a82..e279d41 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,43 +1,97 @@ -version: '3' services: rabbitmq1: image: rabbitmq:3-management + restart: unless-stopped hostname: rabbitmq1 environment: - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER} - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS} - RABBITMQ_DEFAULT_VHOST=${RABBITMQ_DEFAULT_VHOST} + - RABBITMQ_ERLANG_COOKIE=${RABBITMQ_ERLANG_COOKIE} volumes: - - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie + - ./advanced.config:/etc/rabbitmq/advanced.config - ./cluster-entrypoint.sh:/usr/local/bin/cluster-entrypoint.sh + - rabbitmq1-data:/var/lib/rabbitmq + - rabbitmq1-logs:/var/log/rabbitmq entrypoint: /usr/local/bin/cluster-entrypoint.sh + networks: + - rabbitmq rabbitmq2: image: rabbitmq:3-management + restart: unless-stopped hostname: rabbitmq2 depends_on: - rabbitmq1 environment: - JOIN_CLUSTER_HOST=rabbitmq1 + - RABBITMQ_ERLANG_COOKIE=${RABBITMQ_ERLANG_COOKIE} volumes: - - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie + - ./advanced.config:/etc/rabbitmq/advanced.config - ./cluster-entrypoint.sh:/usr/local/bin/cluster-entrypoint.sh + - rabbitmq2-data:/var/lib/rabbitmq + - rabbitmq2-logs:/var/log/rabbitmq entrypoint: /usr/local/bin/cluster-entrypoint.sh + networks: + - rabbitmq rabbitmq3: image: rabbitmq:3-management + restart: unless-stopped hostname: rabbitmq3 depends_on: - rabbitmq1 environment: - JOIN_CLUSTER_HOST=rabbitmq1 + - RABBITMQ_ERLANG_COOKIE=${RABBITMQ_ERLANG_COOKIE} volumes: - - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie + - ./advanced.config:/etc/rabbitmq/advanced.config - ./cluster-entrypoint.sh:/usr/local/bin/cluster-entrypoint.sh + - rabbitmq3-data:/var/lib/rabbitmq + - rabbitmq3-logs:/var/log/rabbitmq entrypoint: /usr/local/bin/cluster-entrypoint.sh + networks: + - rabbitmq + + rabbitmq4: + image: rabbitmq:3-management + restart: unless-stopped + hostname: rabbitmq4 + depends_on: + - rabbitmq1 + environment: + - JOIN_CLUSTER_HOST=rabbitmq1 + - RABBITMQ_ERLANG_COOKIE=${RABBITMQ_ERLANG_COOKIE} + volumes: + - ./advanced.config:/etc/rabbitmq/advanced.config + - ./cluster-entrypoint.sh:/usr/local/bin/cluster-entrypoint.sh + - rabbitmq4-data:/var/lib/rabbitmq + - rabbitmq4-logs:/var/log/rabbitmq + entrypoint: /usr/local/bin/cluster-entrypoint.sh + networks: + - rabbitmq + + rabbitmq5: + image: rabbitmq:3-management + restart: unless-stopped + hostname: rabbitmq5 + depends_on: + - rabbitmq1 + environment: + - JOIN_CLUSTER_HOST=rabbitmq1 + - RABBITMQ_ERLANG_COOKIE=${RABBITMQ_ERLANG_COOKIE} + volumes: + - ./advanced.config:/etc/rabbitmq/advanced.config + - ./cluster-entrypoint.sh:/usr/local/bin/cluster-entrypoint.sh + - rabbitmq5-data:/var/lib/rabbitmq + - rabbitmq5-logs:/var/log/rabbitmq + entrypoint: /usr/local/bin/cluster-entrypoint.sh + networks: + - rabbitmq haproxy: - image: haproxy:1.7 + image: haproxy:3.0 + restart: unless-stopped volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro depends_on: @@ -47,3 +101,21 @@ services: ports: - 15672:15672 - 5672:5672 + - 1936:1936 + networks: + - rabbitmq + +networks: + rabbitmq: + +volumes: + rabbitmq1-data: + rabbitmq1-logs: + rabbitmq2-data: + rabbitmq2-logs: + rabbitmq3-data: + rabbitmq3-logs: + rabbitmq4-data: + rabbitmq4-logs: + rabbitmq5-data: + rabbitmq5-logs: diff --git a/haproxy.cfg b/haproxy.cfg index 91b466f..0e9fbc7 100644 --- a/haproxy.cfg +++ b/haproxy.cfg @@ -1,5 +1,5 @@ global - log 127.0.0.1 local1 + log stdout format raw local0 maxconn 4096 defaults @@ -28,9 +28,11 @@ listen rabbitmq timeout client 3h timeout server 3h option clitcpka - server rabbitmq1 rabbitmq1:5672 check inter 5s rise 2 fall 3 - server rabbitmq2 rabbitmq2:5672 check inter 5s rise 2 fall 3 - server rabbitmq3 rabbitmq3:5672 check inter 5s rise 2 fall 3 + server rabbitmq1 rabbitmq1:5672 check inter 200ms rise 1 fall 1 + server rabbitmq2 rabbitmq2:5672 check inter 200ms rise 1 fall 1 + server rabbitmq3 rabbitmq3:5672 check inter 200ms rise 1 fall 1 + server rabbitmq4 rabbitmq4:5672 check inter 200ms rise 1 fall 1 + server rabbitmq5 rabbitmq5:5672 check inter 200ms rise 1 fall 1 listen mgmt bind *:15672 @@ -39,6 +41,8 @@ listen mgmt timeout client 3h timeout server 3h option clitcpka - server rabbitmq1 rabbitmq1:15672 check inter 5s rise 2 fall 3 - server rabbitmq2 rabbitmq2:15672 check inter 5s rise 2 fall 3 - server rabbitmq3 rabbitmq3:15672 check inter 5s rise 2 fall 3 \ No newline at end of file + server rabbitmq1 rabbitmq1:15672 check inter 200ms rise 1 fall 1 + server rabbitmq2 rabbitmq2:15672 check inter 200ms rise 1 fall 1 + server rabbitmq3 rabbitmq3:15672 check inter 200ms rise 1 fall 1 + server rabbitmq4 rabbitmq4:15672 check inter 200ms rise 1 fall 1 + server rabbitmq5 rabbitmq5:15672 check inter 200ms rise 1 fall 1