[关闭]
@x-power 2019-09-18T08:11:16.000000Z 字数 2431 阅读 790

RabbitMQ的高可用集群部署

消息队列 实战


1. RabbitMQ部署的三种模式


1.1 单一模式

单机情况下不做集群, 仅仅运行一个RabbitMQ.

  1. # docker-compose.yml
  2. version: '3.1'
  3. services:
  4. rabbitmq:
  5. restart: always
  6. image: rabbitmq:management
  7. container_name: rabbitmq
  8. ports:
  9. - 5672:5672
  10. - 15672:15672
  11. environment:
  12. TZ: Asia/Shanghai
  13. RABBITMQ_DEFAULT_USER: admin
  14. RABBITMQ_DEFAULT_PASS: 123456
  15. volumes:
  16. - ./data:/var/lib/rabbitmq

1.2 普通模式

默认模式,以两个节点(rabbits01,rabbits02)为例来说明. 对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02), rabbit01rabbit02两个节点仅有相同的元数据,即队列的结构. 当消息进入rabbit01节点的Queue后,consumerrabbit02消费的时候,RabbitMQ会临时在rabbit01,rabbit02之间进行消息传输, 把A中的消息实体取出并经过B发送给consumer. 所以consumer应该尽量链接每一个节点, 从中取出消息. 即对于同一个逻辑队列, 要在多个节点建立物理Queue. 否则无论consumer链接rabbit01还是rabbit02,出口总在rabbit01这样就会产生瓶颈, 当rabbit01节点故障之后 , rabbit02 无法取到rabbit01节点中还未消费的消息实体. 如果做了消息持久化, 那么得等rabbit01节点恢复才可以被消费, 如果没有持久化的话 就会出现消息丢失的情况.

  1. version: '3.1'
  2. services:
  3. myrabbit01:
  4. restart: always
  5. image: rabbitmq:management
  6. container_name: myrabbit01
  7. ports:
  8. - 5672:5672
  9. - 15672:15672
  10. environment:
  11. TZ: Asia/Shanghai
  12. RABBITMQ_DEFAULT_USER: admin
  13. RABBITMQ_DEFAULT_PASS: 123456
  14. RABBITMQ_ERLANG_COOKIE: rabbitcookie
  15. volumes:
  16. - ./data:/var/lib/rabbitmq
  17. hostname:
  18. rabbit01
  19. network_mode: bridge
  1. version: '3.1'
  2. services:
  3. myrabbit02:
  4. restart: always
  5. image: rabbitmq:management
  6. container_name: myrabbit02
  7. ports:
  8. - 5673:5672
  9. - 15673:15672
  10. environment:
  11. TZ: Asia/Shanghai
  12. RABBITMQ_DEFAULT_USER: admin
  13. RABBITMQ_DEFAULT_PASS: 123456
  14. RABBITMQ_ERLANG_COOKIE: rabbitcookie
  15. volumes:
  16. - ./data:/var/lib/rabbitmq
  17. extra_hosts:
  18. - rabbit01 myrabbit01:172.17.0.2
  19. hostname:
  20. rabbit02
  21. network_mode: bridge
  1. # 添加 集群
  2. docker exec -it myrabbit02 bash
  3. rabbitmqctl stop_app
  4. rabbitmqctl reset
  5. rabbitmqctl join_cluster --ram rabbit@rabbit01
  6. rabbitmqctl start_app
  7. exit
  1. spring:
  2. application:
  3. name: spring-boot-amqp
  4. rabbitmq:
  5. username: admin
  6. password: 123456
  7. addresses: 192.168.219.151:5673,192.168.219.151:5672

1.3 镜像模式

把需要的队列做成镜像队列, 这样不管连接那个节点, 都可以顺利的存取数据, 解决了普通模式的问题.
缺点也很明显, 这样在不同的节点内复制数据会明显的降低系统性能, 集群内的网络带宽会被大大的消耗掉.

镜像模式首先要依赖policy模块, 这个模块是怎么用的呢?

  1. rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

参数意思: ha-all-为策略名称. ^,^zlh为匹配名称为zlhexchange或者Queue.
ha-mode: 为匹配类型, 他分为三种模式: all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如["3rabbit@F","rabbit@G"]这样指定为FG2台机器。)。


总结

现在的各种云还是比较稳定的, 使用普通模式其实就已经够用了.

参考资料: 张龙豪-豪哥, 王磊-磊兄


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注