RabbitMQ docker部署镜像队列
一、镜像模式
docker pull rabbitmq:3-management
容器间建立连接,不使用--link,推荐使用 network
创建桥接网络
docker network create rabbitmanet
启动并创建容器master72、slave73、slave74
docker run -d --name=master72 -p 5672:5672 -p 15672:15672 -e RABBITMQ_NODENAME=master72 -e RABBITMQ_ERLANG_COOKIE='YAOZH' -h master72 --net=rabbitmanet rabbitmq:3-management docker run -d --name=slave73 -p 5673:5672 -p 15673:15672 -e RABBITMQ_NODENAME=slave73 -e RABBITMQ_ERLANG_COOKIE='YAOZH' -h slave73 --net=rabbitmanet rabbitmq:3-management docker run -d --name=slave74 -p 5674:5672 -p 15674:15672 -e RABBITMQ_NODENAME=slave74 -e RABBITMQ_ERLANG_COOKIE='YAOZH' -h slave74 --net=rabbitmanet rabbitmq:3-management
RABBITMQ_ERLANG_COOKIE:通过Erlang Cookie,相当于共享秘钥的概念,长度任意,只要所有容器都一致即可。
-h: 设置容器hostname名称
–net: 设置所属网络
访问:IP:15672
遇到问题,阿里云服务器需要创建安全组才能访问
默认账户密码:guest
基础了解:https://blog.csdn.net/lobber1987/article/details/79045494
新增用户密码(可以跳过):
在添加用户时,我们选择了Tags,Tags也就是用户角色,它有如下五种:
超级管理员(administrator):可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
监控者(monitoring):可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)。
策略制定者(policymaker):可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息。
普通管理者(management):仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
其他:无法登陆管理控制台,通常就是普通的生产者和消费者。
通过命令的方式
-
# 设置用户为administrator角色
-
rabbitmqctl set_user_tags username administrator
添加用户
docker exec -it myrabbit1 bash
rabbitmqctl list_users
rabbitmqctl add_user username passwd
rabbitmqctl set_user_tags newadmin administrator
rabbitmqctl set_permissions -p / newadmin "." "." ".*" (这个没有执行,也能登陆,等遇到问题在说)
删除用户
rabbitmqctl delete_user username
修改用户密码
rabbitmqctl change_password username newpasswd
查看用户列表
rabbitmqctl list_users
salve加入集群操作(注意做这个步骤的时候:需要配置/etc/hosts必须相互能够寻地到 我们已通过-h指定hostname)
分别进入slave73、slave73容器(docker exec -it 容器id /bin/bash),执行一下:
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram master72@master72
//(--ram:内存存储方式,默认磁盘存储
master72
磁盘存储,用于数据存储和交换
)
rabbitmqctl start_app
ex:
[root@iZuf6f9ue9eyhx2y1892nhZ ~]# docker exec -it 5ba894a93d6a /bin/bash
root@slave74:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node slave74@slave74 ...
root@slave74:/# rabbitmqctl join_cluster --ram master72@master72
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Clustering node slave74@slave74 with master72@master72
root@slave74:/# rabbitmqctl start_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Starting node slave74@slave74 ...
访问任意一个节点:
//其他基本操作 // 在另外其他节点上操作要移除的集群节点 rabbitmqctl forget_cluster_node master73@master73
//集群名称(默认为第一个node名称)修改(任意节点): rabbitmqctl set_cluster_name rabbitmq_cluster1
//查看集群状态(任意节点) rabbitmqctl cluster_status
配置镜像队列:
//设置镜像队列策略(在任意一个节点上执行) rabbitmqctl set_policy ha-all "^node." '{"ha-mode":"all"}'
其他问题
如出现改过期警告:RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
有些特殊的情况,比如已经运行了一段时间的几个单个物理机,我们在之前没有设置过相同的Erlang Cookie值,现在我们要把单个的物理机部署成集群,实现我们需要同步Erlang的Cookie值。
1.为什么要配置相同的erlang cookie?
因为RabbitMQ是用Erlang实现的,Erlang Cookie相当于不同节点之间相互通讯的秘钥,Erlang节点通过交换Erlang Cookie获得认证。
2.Erlang Cookie的位置
要想知道Erlang Cookie位置,首先要取得RabbitMQ启动日志里面的home dir路径,作为根路径。使用:“docker logs 容器名称”查看,
注意:每个人的erlang cookie位置可能不同,一定要查看自己的home dir路径。
3.复制Erlang Cookie到其他RabbitMQ节点
获取到第一个RabbitMQ的Erlang Cookie之后,只需要把这个文件复制到其他RabbitMQ节点即可。
物理机和容器之间复制命令如下:
- 容器复制文件到物理机:docker cp 容器名称:容器目录 物理机目录
- 物理机复制文件到容器:docker cp 物理机目录 容器名称:容器目录
设置Erlang Cookie文件权限:“chmod 600 /var/lib/rabbitmq/.erlang.cookie”。
二、HaProxy
HaProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HaProxy特别适用于负载特大的web站点,这些站点通常又需要会话保持或七层处理。HaProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以简单安全整合进您当前框架中,同时可以保护你的web服务器不被暴露到网络上
获取最新镜像:
sudo docker pull haproxy
创建容器rabbitmq-haproxy8100挂载的配置文件haproxy.cfg
[root@iZuf6f9ue9eyhx2y1892nhZ 8100]# pwd
/home/haproxy/8100
[root@iZuf6f9ue9eyhx2y1892nhZ 8100]# cat haproxy.cfg
#logging options global log 127.0.0.1 local0 info maxconn 5120 chroot /usr/local/etc/haproxy uid 99 gid 99 daemon quiet nbproc 20 pidfile /var/run/haproxy.pid defaults log global #使用4层代理模式,”mode http”为7层代理模式 mode tcp #if you set mode to tcp,then you nust change tcplog into httplog option tcplog option dontlognull retries 3 option redispatch maxconn 2000 timeout connect 5s #客户端空闲超时时间为 60秒 则HA 发起重连机制 timeout client 60s #服务器端链接超时时间为 15秒 则HA 发起重连机制 timeout server 15s #front-end IP for consumers and producters listen rabbitmq_cluster bind 0.0.0.0:5678 #配置TCP模式 mode tcp #balance url_param userid #balance url_param session_id check_post 64 #balance hdr(User-Agent) #balance hdr(host) #balance hdr(Host) use_domain_only #balance rdp-cookie #balance leastconn #balance source //ip #简单的轮询 balance roundrobin #rabbitmq集群节点配置 #inter 每隔五秒对mq集群做健康检查, 2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制 server master72 11.111.11.11:5672 check inter 5000 rise 2 fall 2 server slave73 11.111.11.11:5673 check inter 5000 rise 2 fall 2 server slave74 11.111.11.11:5674 check inter 5000 rise 2 fall 2 #配置haproxy web监控,查看统计信息 listen stats bind 0.0.0.0:8101 mode http option httplog stats enable #设置haproxy监控地址为http://localhost:8100/rabbitmq-stats stats uri /rabbitmq-stats stats refresh 5s stats auth admin:admin@1234 listen rabbitmq_admin #监听8000端口转发到rabbitmq的客户端 bind 0.0.0.0:8001 server master72 11.111.11.11:15672 check inter 5000 rise 2 fall 2 server slave73 11.111.11.11:15673 check inter 5000 rise 2 fall 2 server slave74 11.111.11.11:15674 check inter 5000 rise 2 fall 2
-----
运行容器:
docker run --name rabbitmq-haproxy8100 -p 5677:5677 -p 8100:8100 -p 8000:8000 --net=rabbitmanet -v /home/haproxy/8100/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:latest
后记:至于keppalived,后续再说