Docker环境搭建RabbitMq集群详解
在docker环境下搭建rabbitmq集群
环境
Centos8
docker 26.0
rabbitmq docker pull 命令拉取镜像
创建docker-compose.yml配置
使用dockers-compose 来启动三个rabbitmq节点,确保没有其他节点运行中
version: '3'services:rabbit1:image: rabbitmq:3.12-management # 镜像名和版本hostname: rabbit1 # 这个是容器主机名,相当于我们物理机主机名称 在分布式下会用container_name: rabbit1 # 这个是容器名 environment:RABBITMQ_ERLANG_COOKIE: 'rabbit-cluster-cookie' # 集群用到的cookieRABBITMQ_NODENAME: rabbit@rabbit1 # 这是集群每个节点的名字ports:- 15672:15672 # 管理端web 端口- 5672:5672 # 服务端口networks:rabbitmq_net: # 关联网桥aliases: # ip 别名- rabbit1rabbit2:image: rabbitmq:3.12-managementhostname: rabbit2container_name: rabbit2environment:RABBITMQ_ERLANG_COOKIE: 'rabbit-cluster-cookie' #Erlang cookie 必须一致,才能加入集群RABBITMQ_NODENAME: rabbit@rabbit2networks:rabbitmq_net:aliases:- rabbit2depends_on:- rabbit1rabbit3:image: rabbitmq:3.12-managementhostname: rabbit3container_name: rabbit3environment:RABBITMQ_ERLANG_COOKIE: 'rabbit-cluster-cookie'RABBITMQ_NODENAME: rabbit@rabbit3networks:rabbitmq_net:aliases:- rabbit3depends_on:- rabbit1networks:rabbitmq_net:
启动顺序最好是 rabbit1 → rabbit2 → rabbit3
创建好文件,执行启动命令:
docker compose up -d # 默认读取当前目录下docker-compose.yml 名字保持一致
手动组建集群
把节点1 当作主节点,另外两个节点加入集群中,实际上集群中三台机器不分主次,没有主次节点的概念,都是平等的
步骤
进入节点1
docker exec -it rabbit1 bashrabbitmqctl start_app
进入节点2
docker exec -it rabbit2 bashrabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app
进入节点3
docker exec -it rabbit3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app
这里集群就创建完毕
检查集群状态
随机进入一台节点
docker exec -it rabbit3 bash
rabbitmqctl cluster_status
看看3个节点是不是正常运行
怎么指定不同的集群模式?
这里要详细解释下rabbitmq集群,和我们以前的集群模式不一样,比如redis,集群模式主从模式是节点层次来讲的,但是rabbitmq的集群模式是队列层次的,每种队列他的主从同步方式、复制方式、选举方式都是根据队列设置的集群类型来的,在声明队列的时候指定。比如rabbitmqadmin declare queue name=order_queue durable=true arguments='{"x-queue-type":"quorum"}'
这里指定quorum类型,这个队列会随机选一个节点作为主,其他两个从来同步,其他队列也是如此。
选举也是根据你当前队列的集群类型来决定是哪种选举方式,镜像队列使用Erlang内部算法选举,quorum采用raft模式选举
`
模式 | 指定方式 |
---|---|
默认普通模式 | 什么都不加(x-queue-type 不设置) |
Classic 镜像队列 | 设置 policy(3.8 起废弃,3.12 删除) |
Quorum 队列 | 设置 x-queue-type=quorum 属性 |
集群运行验证
浏览器访问:http://localhost:15672
默认账号:guest / guest
查看集群状态、队列分布、消息同步情况
第一次用guest登录报错
guest只能用localhost登录,没权限远程登录,然后赋权,进入随便一个节点容器
# 登录其中一个容器(假设叫 rabbit1)
docker exec -it rabbit1 bash# 添加新用户
rabbitmqctl add_user admin 123456# 给用户赋予管理员角色
rabbitmqctl set_user_tags admin administrator# 给用户赋权
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
创建队列测试
1、在rabbit1节点创建类型为quorum队列
新建队列指定参数
x-queue-type=quorum
可以看到1节点挂了两个队列
rabbit1中查看队列信息
rabbitmqctl list_queues name leader slave_pids state
可以看到两个队列 leader都是1节点
现在关闭节点1
进入节点2查看队列信息