下载的镜像创建和启动容器
docker run --name rabbitmq \
# 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)
--hostname myRabbit \
# 5672:应用访问端口
-p 5672:5672 \
# 15672:控制台Web端口
-p 15672:15672 \
# 给与一些权限
--privileged=true \
# 文件映射
-v `pwd`/conf:/etc/rabbitmq \
-v `pwd`/data:/var/lib/rabbitmq \
-v `pwd`/log:/var/log/rabbitmq \
# RABBITMQ_DEFAULT_VHOST:默认虚拟机名
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
# RABBITMQ_DEFAULT_USER:默认的用户名
-e RABBITMQ_DEFAULT_USER=admin \
# RABBITMQ_DEFAULT_PASS:默认用户名的密码
-e RABBITMQ_DEFAULT_PASS=admin \
-d rabbitmq:3.7.21-management
启动web管理页面
rabbitmqctl start_app
rabbitmq-plugins enable rabbitmq_management
rabbitmqctl stop
# 访问
localhost:15672
集群启动节点
- 创建网络
docker network create rabbitmqnet
- 创建节点
# rabbitmq1
docker run -d --name=rabbitmq1 -p 5672:5672 -p 15672:15672 -e RABBITMQ_NODENAME=rabbitmq1 -e RABBITMQ_ERLANG_COOKIE='YZSDHWMFSMKEMBDHSGGZ' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -h rabbitmq1 --net=rabbitmqnet rabbitmq:3.7.21-management
# rabbitmq2
docker run -d --name=rabbitmq2 -p 5673:5672 -e RABBITMQ_NODENAME=rabbitmq2 -e RABBITMQ_ERLANG_COOKIE='YZSDHWMFSMKEMBDHSGGZ' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -h rabbitmq2 --net=rabbitmqnet rabbitmq:3.7.21-management
# rabbitmq3
docker run -d --name=rabbitmq3 -p 5674:5672 -e RABBITMQ_NODENAME=rabbitmq3 -e RABBITMQ_ERLANG_COOKIE='YZSDHWMFSMKEMBDHSGGZ' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -h rabbitmq3 --net=rabbitmqnet rabbitmq:3.7.21-management
- 组建rabbitmq集群
### Disk Node rabbitmq2
docker exec rabbitmq2 bash -c "rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster rabbitmq1@rabbitmq1 && rabbitmqctl start_app"
### Ram Node rabbitmq3
docker exec rabbitmq3 bash -c "rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster --ram rabbitmq1@rabbitmq1 && rabbitmqctl start_app"
- 退出集群
docker exec rabbitmq3 bash -c "rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl start_app"
- 拉取haproxy镜像
docker run -d --name rabbitmq-haproxy -p 1080:80 -p 5677:5677 -p 8001:8001 --net=rabbitmqnet -v `pwd`:/usr/local/etc/haproxy:ro haproxy:latest
- haproxy的配置文件
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 5000ms
timeout server 5000ms
listen rabbitmq_cluster
bind 0.0.0.0:5677
option tcplog
mode tcp
balance leastconn
server rabbit1 rabbitmq1:5672 check inter 2s rise 2 fall 3
server rabbit2 rabbitmq2:5672 check inter 2s rise 2 fall 3
server rabbit3 rabbitmq3:5672 check inter 2s rise 2 fall 3
listen http_front
bind 0.0.0.0:80
stats uri /haproxy?stats
listen rabbitmq_admin
bind 0.0.0.0:8001
server rabbit1 rabbitmq1:15672
server rabbit2 rabbitmq2:15672
server rabbit3 rabbitmq3:15672
- 启动haproxy后,可以通过haproxy来访问rabbitmq集群:http://external-ip:8001
- 获取haproxy的状态:http://external-ip:1080/haproxy?stats
- 镜像集群配置
docker exec rabbitmq3 bash -c "rabbitmqctl set_policy ha-all \"^\" '{\"ha-mode\":\"all\"}'"
路由匹配
| 对象名称 |
|
| borker |
相当于mq server |
| channel |
通道或者频道 |
| exchange |
交换机 |
| queue |
队列 |
| vhost |
虚拟主机(项目队列隔离使用) |
| 规则 |
说明 |
| direct |
精准推送 |
| fanout |
广播。推送到绑定到此交换机下的所有队列 |
| topic |
组播。比如上面我绑定的关键字是sms_send,那么他可以推送到*.sms_send的所有队列 |
| headers |
这个目前不知道是如何推送的 |
创建交换机和队列的时候各个常用参数说明
name: $queue // should be unique in fanout exchange. [队列名称]
passive: false // don't check if a queue with the same name exists [是否检测同名队列]
durable: false // the queue will not survive server restarts [是否开启队列持久化]
exclusive: false // the queue might be accessed by other channels [队列是否可以被其他队列访问]
auto_delete: true //the queue will be deleted once the channel is closed. [通道关闭后是否删除队列]
name: $exchange [交换机名称]
type: direct [路由类型]
passive: false []
durable: true [交换机是否开启持久化]
auto_delete: false //the exchange won't be deleted once the channel is closed.