使用docker搭建RabbitMQ集群

docker运行RabbitMQ容器

docker使用参考:Docker、Docker compose实战

docker run -d --hostname rabbit01 --name myrabbit01 -p 5672:5672 -p 15672:15672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=886291 rabbitmq:management

docker run -d --hostname rabbit02 --name myrabbit02 -p 5673:5672 --link myrabbit01:rabbit01 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

docker run -d  --hostname rabbit03 --name myrabbit03 -p 5674:5672 --link myrabbit01:rabbit01 --link myrabbit02:rabbit02 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

参数说明

  • -d:以后台进程运行
  • –hostname rabbit01:RabbitMQ主机名称
  • –name:容器名称
  • -p:端口映射(宿主机端口:容器内端口),5672:amqp访问端口,15672:http访问端口

注意点
1.使用:http://宿主ip:15672 访问,用户名密码使用默认:guest/guest。
2.多个容器之间使用“–link”连接,此属性不能少;
3.Erlang Cookie值必须相同,也就是RABBITMQ_ERLANG_COOKIE参数的值必须相同,原因见下文“配置相同Erlang Cookie”部分;

使用镜像搭建集群,docker-compose.xml配置见下面的github具体配置.

加入RabbitMQ节点到集群

启动了3个节点,1个磁盘节点和2个内存节点。在RabbitMQ集群里,必须至少有一个磁盘节点存在。

  • RAM Node:内存节点,将所有的队列,交换机, 绑定,用户 权限与vhost的元数据存储在内存中,可以让队列和交换机声明更加的便捷。
  • Disk Node:将元数据存储在磁盘中,单节点系统,只运行 磁盘类型的节点,防止重启RabbitMQ时,丢失系统的配置信息。
#设置节点1,加入到集群:
docker exec -it myrabbit01 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
#执行完之后分别在每台机器上查看节点状态
rabbitmqctl cluster_status
exit

#设置节点2,加入到集群:
docker exec -it myrabbit02 bash
rabbitmqctl stop_app
rabbitmqctl reset
# --ram指的是作为内存节点,不配置的--ram的话默认为磁盘节点
rabbitmqctl join_cluster --ram rabbit@rabbit01
rabbitmqctl start_app
#执行完之后分别在每台机器上查看节点状态
rabbitmqctl cluster_status
exit

#设置节点3,加入到集群:
docker exec -it myrabbit03 bash
rabbitmqctl stop_app
rabbitmqctl reset
# --ram指的是作为内存节点,不配置的--ram的话默认为磁盘节点
rabbitmqctl join_cluster --ram rabbit@rabbit01
rabbitmqctl start_app
#执行完之后分别在每台机器上查看节点状态
rabbitmqctl cluster_status
exit
参数“--ram”表示设置为内存节点,忽略此参数默认为磁盘节点。

配置相同Erlang Cookie

RabbitMQ是用Erlang实现的,Erlang Cookie相当于不同节点之间相互通讯的秘钥,Erlang节点通过交换Erlang Cookie获得认证。

添加镜像策略

基于普通模式集群,在策略里面添加镜像策略即可。把需要的队列做成镜像队列,属于HA方案。该模式解决了普通模式中的问题,根本区别在于消息实体会主动在镜像节点间同步,而不是在客户端拉取数据时临时拉取。当然弊端就是降低系统性能,大量消息写入,集群内的网路带宽会被大大消耗。

#进入jt_rabbitmq01的容器内
docker exec -it jt_rabbitmq01 bash
#执行下面命令
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

docker-compose

docker-compose.yml

  • rabbitmq1
version: "3"
services:
  rabbitmq1:
    image: rabbitmq:3.8.3-management
    container_name: rabbitmq1
    restart: always
    privileged: true
    environment:
      - RABBITMQ_ERLANG_COOKIE=rabbitcookie
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=886291
    ports:
      - "5672:5672"
      - "4369:4369"
      - "1883:1883"
      - "15672:15672"
      - "25672:25672"
    volumes:
      - /jianda/rabbitmq1:/var/lib/rabbitmq:z
  • rabbitmq2
version: "3"
services:
  rabbitmq2:
    image: rabbitmq:3.8.3-management
    container_name: rabbitmq2
    restart: always
    privileged: true
    extra_hosts:
      - "rabbitmq1:10.10.9.155"
    environment:
      - CLUSTERED=true
      - CLUSTER_WITH=rabbitmq1
      - RAM_NODE=true
      - TZ=Asia/Shanghai
      - RABBITMQ_ERLANG_COOKIE=rabbitcookie
    hostname: rabbitmq2
    ports:
      - "5672:5672"
      - "4369:4369"
      - "1883:1883"
      - "15672:15672"
      - "25672:25672"
    volumes:
      - /jianda/rabbitmq2:/var/lib/rabbitmq:z
  • rabbitmq3
version: "3"
services:
  rabbitmq3:
    image: rabbitmq:3.8.3-management
    container_name: rabbitmq3
    restart: always
    privileged: true
    extra_hosts: 
      - "rabbitmq1:10.10.9.155"
	  - "rabbitmq2:10.10.9.156"
    environment:
      - CLUSTERED=true
   	  - CLUSTER_WITH=rabbitmq1
   	  - RAM_NODE=true
      - TZ=Asia/Shanghai
      - RABBITMQ_ERLANG_COOKIE=rabbitcookie
    hostname: rabbitmq3
    external_links: 
      - rabbitmq1:172.***.***.27
    ports:
      - "5672:5672"
      - "4369:4369"
      - "1883:1883"
      - "15672:15672"
      - "25672:25672"
    volumes:
      - /zimo/rabbitmq3:/var/lib/rabbitmq:z
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值