Docker - 搭建rabbitmq 集群

眉间皱痕 提交于 2020-02-27 19:02:41

Docker - 搭建rabbitmq 集群


1、首先,拉取rabbitmq 的镜像

我们以3.8.2 版本为例

docker pull rabbitmq:3.8.2-management

2、然后运行3个rabbitmq 的实例


# 运行镜像,集群模式
docker run \
  --name rabbitmq-1 \
  --hostname=rabbitmq-1 \
  --restart=always \
  -d \
  -e RABBITMQ_DEFAULT_USER=rabbitmq \
  -e RABBITMQ_DEFAULT_PASS=OnlinezuozuoCreated.rabbitmq.test.password \
  -e RABBITMQ_ERLANG_COOKIE='oNYE40jp2YbuXfWKd9vFu1VZiic8' \
  -v /etc/docker/volume/rabbitmqcluster/rabbitmq-1:/var/lib/rabbitmq \
  -p 52001:5672 \
  -p 52002:15672 \
  rabbitmq:3.8.2-management

docker run \
  --name rabbitmq-2 \
  --hostname=rabbitmq-2 \
  --restart=always \
  --link rabbitmq-1:rabbitmq-1 \
  -d \
  -e RABBITMQ_DEFAULT_USER=rabbitmq \
  -e RABBITMQ_DEFAULT_PASS=OnlinezuozuoCreated.rabbitmq.test.password \
  -e RABBITMQ_ERLANG_COOKIE='oNYE40jp2YbuXfWKd9vFu1VZiic8' \
  -v /etc/docker/volume/rabbitmqcluster/rabbitmq-2:/var/lib/rabbitmq \
  -p 52301:5672 \
  -p 52302:15672 \
  rabbitmq:3.8.2-management

docker run \
  --name rabbitmq-3 \
  --hostname=rabbitmq-3 \
  --restart=always \
  --link rabbitmq-1:rabbitmq-1 \
  --link rabbitmq-2:rabbitmq-2 \
  -d \
  -e RABBITMQ_DEFAULT_USER=rabbitmq \
  -e RABBITMQ_DEFAULT_PASS=OnlinezuozuoCreated.rabbitmq.test.password \
  -e RABBITMQ_ERLANG_COOKIE='oNYE40jp2YbuXfWKd9vFu1VZiic8' \
  -v /etc/docker/volume/rabbitmqcluster/rabbitmq-3:/var/lib/rabbitmq \
  -p 52501:5672 \
  -p 52502:15672 \
  rabbitmq:3.8.2-management


RABBITMQ_ERLANG_COOKIE是rabbitmq 集群的通信字符串,用于进行集群连接,所以必须都保持一致

--link rabbitmq-1:rabbitmq-1 \我们通过把2号3号实例进行连接,让他们能够进行通讯

3、然后我们构建集群,并同步时区

进入一号实例,并一个一个的执行如下命令

docker exec -it rabbitmq-1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&
  echo "Asia/Shanghai" >/etc/timezone
date "+%Y-%m-%d %H:%M:%S" ## 显示设置后,新的系统时间
exit


进入二号实例,并一个一个的执行如下命令

docker exec -it rabbitmq-2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
rabbitmqctl start_app
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&
  echo "Asia/Shanghai" >/etc/timezone
date "+%Y-%m-%d %H:%M:%S" ## 显示设置后,新的系统时间
exit

进入三号实例,并一个一个的执行如下命令

docker exec -it rabbitmq-3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
rabbitmqctl start_app
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&
  echo "Asia/Shanghai" >/etc/timezone
date "+%Y-%m-%d %H:%M:%S" ## 显示设置后,新的系统时间
exit

4、如何删除容器

如果遇到启动失败,或者端口占用等,我们可以停止容器并删除容器,进行重新生成

docker container stop rabbitmq-1
docker container rm rabbitmq-1

docker container stop rabbitmq-2
docker container rm rabbitmq-2

docker container stop rabbitmq-3
docker container rm rabbitmq-3

5、打开防火墙,或者端口控制器进行端口放行,检测运行状态

通过访问

http://localhost:52101/

http://localhost:52301/

http://localhost:52501/

验证是否可以正常登陆,帐号为上面的脚本中定义的帐号和密码

并查看集群状态是否良好。

6、通过nginx 做负载均衡

nginx 增加管理页面的负载均衡

upstream rabbitmq {   
  	 server localhost:52002 weight=1 max_fails=2 fail_timeout=10s;   
	 server localhost:52302 weight=1 max_fails=2 fail_timeout=10s;
	 server localhost:52502 weight=1 max_fails=2 fail_timeout=10s;
}

location /
{
    proxy_pass http://rabbitmq;
    proxy_set_header Host rabbitmq;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    
    add_header X-Cache $upstream_cache_status;
    
    #Set Nginx Cache
    
    	add_header Cache-Control no-cache;
    expires 12h;
}

这样,我们就可以通过nginx 的反向代理,进行访问控制台的负载均衡访问了


nginx 增加连接端口的负载均衡

stream{

upstream rabbitmq {   
  	 server localhost:52001 weight=1 max_fails=2 fail_timeout=10s;   
	 server localhost:52301 weight=1 max_fails=2 fail_timeout=10s;
	 server localhost:52501 weight=1 max_fails=2 fail_timeout=10s;
}


server{
    listen 52701;
    proxy_connect_timeout 20s;
	proxy_pass rabbitmq;
}

}

这样,我们就可以通过nginx 的反向代理,进行数据连接的负载均衡访问了

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!