6. RabbitMQ集群

6.1 集群形式

RabbiMQ 是用 Erlang 开发的, 集群非常方便, 因为 Erlang 天生就是一门分布式语言, 但其本身并不支持负载均衡。

RabbitMQ 集群中节点包括内存节点(RAM)、 磁盘节点(Disk, 消息持久化)集群中至少有一个 Disk 节点。

6.1.1 普通模式(默认)

对于普通模式, 集群中各节点有相同的队列结构, 但消息只会存在于集群中的一个节点。 对于消费者来说, 若消息进入 A 节点的 Queue 中, 当从 B 节点拉取时, RabbitMQ 会将消息从 A 中取出, 并经过 B 发送给消费者。

应用场景: 该模式各适合于消息无需持久化的场合, 如日志队列。 当队列非持久化, 且创建该队列的节点宕机, 客户端才可以重连集群其他节点, 并重新创建队列。 若为持久化,只能等故障节点恢复

6.1.2 镜像模式

与普通模式不同之处是消息实体会主动在镜像节点间同步, 而不是在取数据时临时拉取, 高可用; 该模式下, mirror queue 有一套选举算法, 即 1 个 master、 n 个 slaver, 生产者、 消费者的请求都会转至 master

应用场景: 可靠性要求较高场合, 如下单、 库存队列。
缺点: 若镜像队列过多, 且消息体量大, 集群内部网络带宽将会被此种同步通讯所消耗
(1) 镜像集群也是基于普通集群, 即只有先搭建普通集群, 然后才能设置镜像队列。
(2) 若消费过程中, master 挂掉, 则选举新 master, 若未来得及确认, 则可能会重复消费

6.2 搭建集群(普通模式)

6.2.1 首先创建容器映射目录

#创建rabbitmq用于存放rabbitmq集群映射信息
mkdir /mydata/rabbitmq
#分别创建各集群映射目录
cd rabbitmq/
mkdir rabbitmq01 rabbitmq02 rabbitmq03

6.2.2 启动集群镜像容器

rabbitmq01

docker run -d --hostname rabbitmq01 --name rabbitmq01 -v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='zr' rabbitmq:3.8.2-management

rabbitmq02

docker run -d --hostname rabbitmq02 --name rabbitmq02 -v/mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq -p 15674:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE='zr' --link rabbitmq01:rabbitmq01 rabbitmq:3.8.2-management

rabbitmq03

docker run -d --hostname rabbitmq03 --name rabbitmq03 -v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq -p 15675:15672 -p 5675:5672 -e RABBITMQ_ERLANG_COOKIE='zr' --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:3.8.2-management

注意事项:

–hostname 设置容器的主机名

RABBITMQ_ERLANG_COOKIE 节点认证作用, 部署集成时 需要同步该值

RABBITMQ_ERLANG_COOKIE 为rabbitmq多节点之间通信所用到的cookie,rabbitmq集群就是利用这一特性实现的

启动成功后

http://192.168.157.128:15673/#/

http://192.168.157.128:15674/#/

http://192.168.157.128:15675/#/

账号:guest

密码:guest

登录查看一下,目前都是单节点

6.2.3 节点加入集群

设置rabbitmq01为主节点

docker exec -it rabbitmq01 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
Exit

如果出现以下情况说明rabbitmq版本太高了,新拉一个镜像3.8.2(老师对应的),当然也可以按照高版本的配置

docker pull rabbitmq:3.8.2

将rabbitmq02加入rabbitmq01

docker exec -it rabbitmq02 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

将rabbitmq02加入rabbitmq01

docker exec -it rabbitmq03 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

最后能看到其他节点信息也就成功了(普通模式)

6.2.4 普通模式集群测试

说明一下端口15673为rabbitmq01 ,15674为rabbitmq02,15675为rabbitmq03

在rabbitmq01新建test队列

在rabbitmq01新建test交换机,并绑定关系

同时发现rabbitmq02,rabbitmq03中也创建了相同的交换机,队列,绑定关系

向rabbitmq01的交换机发送消息

在rabbitmq02 rabbitmq03中也能拿到消息

在一个节点中消费了该消息,其他节点中将不会存在该消息

6.3 实现镜像集群

在普通模式集群的条件下才能搭建镜像集群,并且需要选择一个主节点,此处我们选择rabbitmq01为主节点

#进入rabbitmq01容器
docker exec -it rabbitmq01 bash

首先查看此时的策略什么,发现为空,默认普通模式

rabbitmqctl list_policies -p /

增加镜像模式策略

策略模式 all 即复制到所有节点, 包含新增节点,

策略正则表达式为 “^” 表示所有匹配所有队列名称。

“^hello”表示只匹配名为 hello 开始的队列

rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

查看此时的策略

管理页面查看

再次向rabbitma01的test交换机发送信息,正常情况与普通模式一致

当我向rabbitma01发送消息后,宕机了,普通模式由于本质是其他节点比如rabbitma02去拿rabbitma01的消息再转交给我,所以当rabbitma01宕机后就拿不到消息了.

镜像模式由于是同步的,当rabbitma01宕机后客户端是直接可以向其他节点拿到消息的

(个人理解普通模式就是代理,源头断了也就什么都没有了;镜像模式就是复制cv,一个地方断掉了,但是还可以从其他地方还能拿到)

RabbitMQ集群相关推荐

  1. hbase1.1.1 连接集群_除了HAProxy,RabbitMQ集群还可以这样用

    全网最简单的安装手册 // 安装erlang wget https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm. ...

  2. Docker:搭建RabbitMQ集群

    RabbitMQ原理介绍(一) RabbitMQ安装使用(二) RabbitMQ添加新用户并支持远程访问(三) RabbitMQ管理命令rabbitmqctl详解(四) RabbitMQ两种集群模式配 ...

  3. CentOS7安装RabbitMQ集群

    实验环境 RabbitMQ 集群 server1.example.com    IP: 10.10.10.11    Node: disk server2.example.com    IP: 10. ...

  4. Ubuntu安装rabbitMQ及单机版rabbitMQ集群配置

    安装过程 1.sudo vim /etc/apt/sources.list 打开sources.list添加下面的内容在结尾处 deb http://www.rabbitmq.com/debian/ ...

  5. RabbitMQ—集群原理

    RabbitMQ本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的erlang.cookie来实现).因此,RabbitMQ天然支持集群,但不支持负载均衡 ...

  6. RabbitMq集群使用Nginx做负载均衡

    2019独角兽企业重金招聘Python工程师标准>>> 1.配置rabbitmq集群(可以参考前一篇RabbitMq之部署集群) 2.Nginx做负载均衡 注意:Nginx1.90版 ...

  7. RabbitMQ集群、镜像部署配置

    2019独角兽企业重金招聘Python工程师标准>>> 1   RABBITMQ简介及安装 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端, ...

  8. Rabbitmq集群高可用部署详细

    清风万里的季节,周末本该和亲人朋友一起消遣这烂漫的花花草草,或是懒洋洋的晒个太阳听听风声鸟鸣.无奈工作使然,理想使然,我回到啦公司,敲起啦键盘,撸起啦代码,程序狗的世界一片黯然,一片黯然,愿天下所有努 ...

  9. 搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接

    我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高可用的东西出来,这不本篇就跟大家说 一下cluster的概念,rabbitmq是erl ...

  10. rabbitmq 集群 ha负载 Consumer raised exception, processing can restart if the connection factory

    情况是酱紫滴 线上有一个rabbitmq 集群,一台磁盘模式的 两台内存模式的. 使用erlang 做cookie 做同步.haproxy做负载 在连接一会后 程序抛出异常 Consumer rais ...

最新文章

  1. php 派生类 数据库连接 单例模式 xhprof实测 高效连接
  2. Python常用函数与技巧总结(三)
  3. 江西理工大学计算机管理技术期末复习(wangzhendong)网络管理与维护
  4. C# 子窗口修改主窗口的控件
  5. tomcat不能多次startup.sh,异常时直接,分析logs目录下的日志。
  6. 奶牛的交叉路(jzoj 1756)
  7. 【2016年第1期】农业大数据研究生培养模式探索
  8. 使用python编写自己的进程调试工具
  9. 骑马与砍杀服务器修复,骑马与砍杀21.3.1公共版和热修说明 修复联机模式
  10. java的基本循环结构_Java基础之(九):循环结构
  11. kibana报错Request Timeout after 30000ms故障解决
  12. Modbus的CRC校验算法
  13. cadence SPB17.4 - export placement file to openpnp
  14. window10家庭版安裝docker遇到的問題【已解決】
  15. C++生日聚会(BFS)
  16. 使用手机调试Android软件
  17. 《从零构建前后分离的web项目》:前端完善 - 手把手教你快速构建网站布局
  18. 使用Java+SSM(Spring+SpringMVC+Mybatis)如何开发个性化音乐推荐系统 在线音乐推荐网站 基于用户、项目的协同过滤推荐算法实现MusicRecommendSystemWeb
  19. OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo
  20. 基于PHP和mysql的简单学生成绩管理系统

热门文章

  1. Consul的介绍、安装与使用
  2. 程序员接私活月入2万?分享10个接私活的网站!
  3. 基于快手、抖音等平台的短视频营销问题及建议
  4. 第四章:神奇的变身器-转义字符,痴月熊学python
  5. 京东实习生招聘题目解析(三)
  6. jQuery.i18n.properties 中文说明文档
  7. JavaScript打印三角形
  8. S27赛季即将来袭 教你用Java做游戏王者荣耀
  9. 微信免密支付php代码实现,微信刷卡支付接入模式及免密流程
  10. JS向下向上取整等数字处理