Docker部署RabbitMQ集羣

安裝rabbitmq

下載Docker鏡像

docker pull rabbitmq:3.7.12-management

安裝RabbitMQ

mkdir rabbitmq
# node1 172.17.11.22 
cd rabbitmq
vim hosts
#輸入
172.17.11.22 rabbit1 rabbit1
172.17.11.23 rabbit2 rabbit2

sudo docker run -d \
    --name rabbit1  \
    -h rabbit1\
    --log-opt max-size=10m \
    --log-opt max-file=3 \
    -v /root/rabbitmq:/var/lib/rabbitmq:z \
    -v /root/rabbitmq/hosts:/etc/hosts \
    -e RABBITMQ_DEFAULT_USER=rabbitmq   \
    -e RABBITMQ_DEFAULT_PASS=password \
    -e RABBITMQ_ERLANG_COOKIE='cookie' \
    -p 5656:5672 \
    -p 5657:15672 \
    -p 4369:4369 \
    -p 25672:25672 \
    -p 15671:15671 \
    -p 5671:5671 \
    rabbitmq:3.7.12-management

# node2 172.17.11.23
cd rabbitmq
vim hosts
#輸入
172.17.11.22 rabbit1 rabbit1
172.17.11.23 rabbit2 rabbit2
sudo docker run -d \
    --name rabbit2  \
    -h rabbit2\
    --log-opt max-size=10m \
    --log-opt max-file=3 \
    -v /root/rabbitmq:/var/lib/rabbitmq:z \
    -v /root/rabbitmq/hosts:/etc/hosts \
    -e RABBITMQ_DEFAULT_USER=rabbitmq   \
    -e RABBITMQ_DEFAULT_PASS=password \
    -e RABBITMQ_ERLANG_COOKIE='cookie' \
    -p 5656:5672 \
    -p 5657:15672 \
    -p 4369:4369 \
    -p 25672:25672 \
    -p 15671:15671 \
    -p 5671:5671 \
    rabbitmq:3.7.12-management

加入集羣

上述完成2個RabbitMQ節點的啓動,後面是要將兩個節點做成一個集羣,現在講rabbitmq1作爲master,然後rabbitmq2加入到rabbitmq1中

# node2 處理
sudo docker exec -it rabbit2 /bin/bash
# 加入集羣
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app

使用刪除方式處理時出現過以下問題

rabbit@localhost:
      * connected to epmd (port 4369) on localhost
      * epmd reports node 'rabbit' running on port 25672
      * TCP connection succeeded but Erlang distribution failed

      * Hostname mismatch: node "rabbit@warp10" believes its host is different. Please ensure that hostnames resolve the same way locally and on "rabbit@warp10"


    current node details:
    - node name: 'rabbitmq-cli-30@warp10'
    - home dir: /Users/antares
    - cookie hash: Sg08R8+G85EYHZ3H/9NUfg==

官網中有問題顯示,但是具體情況很多,經過後續的分析,是因爲在docker run時hostname的問題,所以在run時指定容器的hostname。也就是通過-h來指定hostname,根本問題就是HOSTNAME

解決方法,在Docker創建時,指定了/etc/hosts文件,但是啓動docker時,應用裏的hostname與hosts中指定的hostname不相同

1. echo $HOSTNAME 查看下當前的hostname  然後export HOSTNAME=*** 修改爲/etc/hosts希望的名字
2. /etc/hostname中科院設置相應的數據

使用docker部署rabbitmq集羣時,因爲hostname不匹配,導致的問題,建議在run時加入參數-h來指定參數,保證hostname的正確性

配置nginx,來保證集羣的可用性

配置文件如下:

server {
    listen 443;
    server_name rabbitmq.example.cn;

    ssl on;
    ssl_certificate   cert/123.pem;
    ssl_certificate_key  cert/123.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    
    # https 因爲安全原因,需要禁用 gzip
    # 但是在一些場景下,不需要禁用
    # gzip off;
    gzip on;
    # 設置允許壓縮的頁面最小字節數
    gzip_min_length 1000;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    # 1~9,默認爲1,數值越大,壓縮率越高,CPU佔用越多,時間越久
    gzip_comp_level 3;
    gzip_vary on;
    # 禁用對 IE 6 使用 gzip 壓縮
    gzip_disable "MSIE [1-6]\.";
    gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/javascript "application/javascript; charset=utf-8" application/xml application/xml+rss application/json "application/json; charset=utf-8" fo
nt/ttf font/otf image/svg+xml;

    # 設置最大允許的POST數據量,如果提交的文件超過這個值,會出現413錯誤
    client_max_body_size 20m;
    keepalive_timeout 15;

    # 不顯示 nginx 的版本號
    server_tokens off;

    # 設置請求頭的長度大小
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;


    ## Individual nginx logs
    access_log  /var/log/nginx/access.log main;
    error_log   /var/log/nginx/error.log;
    # 不保存 access_log
    # access_log off;

    location ^~ /favicon.ico {
        expires 30d;
        # add_header Content-Type text/plain;
        return 200 "";
    }

    location ^~ /robots.txt {
        expires 30d;
        # add_header Content-Type text/plain;
        return 200 "User-Agent:  *\nDisallow:  /";
    }

    location / {
        port_in_redirect on;
        proxy_pass   http://rabbitManage;
        proxy_redirect  off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #index  index.html index.htm;
    }
    
    # 主頁返回 404
    # location = / {
    #     return 404;
    # }
}


server {
   listen 80;
   server_name  rabbitmq.example.cn;
   #告訴瀏覽器有效期內只准用 https 訪問
   add_header Strict-Transport-Security max-age=15768000;
   #永久重定向到 https 站點
   return 301 https://$server_name$request_uri;
}

#rabbitmq管理界面
upstream rabbitManage {
    server 172.17.11.22:5657;
    server 172.17.11.23:5657;
}


#!!! stream 要和http一個層級
# rabbitmq Tcp監聽
stream{
    upstream rabbitTcp{
        server 172.17.11.22:5656;
        server 172.17.11.23:5656;
    }

    server {
        listen 5656;
        proxy_pass rabbitTcp;
    }
}

注意:stream要和http一個層級

參考資料

Docker分佈式部署RabbitMQ集羣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章