前言:本文章这次主要是基于docker在多台服务器下搭建的普通集群环境,镜像集群以及集群搭建后通过nginx负载和keepalived实现HA会另出一篇文章进行详细介绍。
一:准备工作集群所需要的虚拟机环境(根据自身的集群需要来准备),我这边测试的话用的是2台;机器准备好后,安装好docke环境等集群所需要的依赖
二:拉取RabbitMQ所需的镜像在线拉取方式:
docker pull rabbitmq:3.9.5-management
离线方式:RabbitMQ官方网站下载对应版本的包
离线安装完毕后通过docker -load -i 加载镜像到docker里面
docker load -i xx.tar(xx.tar是rabbit的tar包) #加载完毕后查看镜像 docker images三:在集群的机器上进行部署
机器1:192.168.23.188
机器2:192.168.23.189
在两台机器上通过上诉 *** 作安装好MQ的镜像;
*** 作机器1
docker run -d --hostname rabbitmq1 --add-host=rabbitmq2:192.168.23.189 --restart=unless-stopped --name rabbitmq1 --net host -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_cookie='rabbit_mq' rabbitmq:management
参数解释:
-d 容器后台运行 --hostname rabbitmq1 容器的主机名为 rabbitmq1 --add-host="rabbitmq1":192.168.23.189 修改容器内部的hosts --restart=unless-stopped docker 容器重启后重启MQ --name rabbitmq1 容器名为rabbitma1,在宿主机上运行“docker ps”命令时显示的名称 -p "5672:5672" 消息通讯端口 -p "15672:15672" 后台管理端口 -e RABBITMQ_DEFAULT_USER=admin 设置rabbitmq默认用户为admin -e RABBITMQ_DEFAULT_PASS=admin 设置rabbitmq默认密码为admin -e RABBITMQ_ERLANG_cookie='rabbit_mq' 设置rabbitmq的cookie为“rabbit_mq”,可以自定义为其他文本,容器保持一致即可
启动完毕后,在网页打开192.168.23.188:15672访问看看是否正常
*** 作机器2
docker run -d --hostname rabbitmq2 --add-host=rabbitmq1:192.168.23.188 --restart=unless-stopped --name rabbitmq2 --net host -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_cookie='rabbit_mq' rabbitmq:management
启动完毕后,在网页打开192.168.23.189:15672访问看看是否正常
这里注意一下:在 *** 作机器1和机器2的时候 --add-host后面的参数一定要记得填写正确;abbitmq的cookie也要保持一致否则建立不了集群关系;两台机器分别部署完毕后,现在这两台MQ是不相干的我们需要使他们建立起集群关系
回到机器1
进入刚刚启动的rabbit容器
docker exec -it rabbitmq1 bash
进入容器后通过rabbitmqctl命令对MQ进行 *** 作
#首先停止当前MQ rabbitmqctl stop_app #resetMQ rabbitmqctl reset #重新启动MQ rabbitmqctl start_app 退出容器 exit
回到机器2
进入刚刚启动的rabbit容器
docker exec -it rabbitmq2 bash
进入容器后通过rabbitmqctl命令对MQ进行 *** 作
#首先停止当前MQ rabbitmqctl stop_app #resetMQ rabbitmqctl reset #跟机器1的消息队列建立关系 rabbitmqctl join_cluster --ram rabbit@rabbitmq1 #重新启动MQ rabbitmqctl start_app 退出容器 exit
这时候机器1和机器2的集群关系已经搭建好了,现在去看看管理地址上的情况:
到这里测试用的两台集群已经搭建完毕,但是这时候还不能用,因为没有做负载。
这里可以另外找一台机器也可以再机器1或者机器2上进行部署nginx来进行负载;实际部署中是需要在另外一台机器进行部署的;测试的话就在机器1上进行部署nginx了
在机器1上面随便建立一个文件夹用来存放nginx的配置文件:/root/nginx/nginx_rabbitmq.conf
文件内容:
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; 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; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 5s; proxy_send_timeout 5s; proxy_read_timeout 5s; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; #rabbitmq管理界面 upstream rabbitManage { server 192.168.23.188:15672; server 192.168.23.185:15672; } server { listen 15673; server_name 192.168.23.188; location / { proxy_pass http://rabbitManage; index index.html index.htm; } } } # rabbitmq通信 stream{ upstream rabbitTcp{ server 192.168.23.188:5672; server 192.168.23.189:5672; } server { listen 5673; server_name 192.168.23.188; location / { proxy_pass http://rabbitTcp; index index.html index.htm; } } }
配置完毕后启动nginx:
docker run -it -d --name nginxMQ -v /root/nginx/nginx_rabbitmq.conf:/etc/nginx/nginx.conf --privileged --net=host nginx
启动完毕后通过负载的地址进行统一访问MQ
后台地址:192.168.23.188:15673
通讯地址:192.168.23.188:5673
至此通过Docker 搭建普通版本RabbitMQ集群已经搭建完毕了,普通版本的集群对于一般公司的业务来说是够用的了,如果针对业务量比较大的公司还是有些弊端的;虽然搭建了nginx进行负载但是还是缺少高可用;这时候需要搭建镜像版的集群:
与普通集群模式区别 主要是消息实体会主动在镜像节点间同步数据,而不是只存储数据元信息。 普通通集群模式 一旦数据节点挂了,如果没有持久化数据,数据就会丢失,且这时候也不会进行消费,只能等待消息重新回到队列中才能再次消费;但镜像集群模式可以保证集群只要不全部挂掉,数据就不会丢失,当相对于性能来说,镜像集群模式会比普通集群模式多出消耗数据的传输。故取决于业务场景进行取舍;且镜像版集群不仅仅需要nginx来进行负载也需要keepaplived进行转发;对机器的要求相对更严格一点;后续会出一份关于镜像版本的集群
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)