拜读了网上很多前辈的文章,对RabbitMQ的集群有了一点点认识.

好多文章都说到,RabbitMQ的集群分为普通集群和镜像集群,有的还加了两种:单机集群和主从集群.

我看来看去,看了半天,怎么感觉,其实RabbitMQ的集群实际就一种:普通集群.

至于单机集群,无非是在一台机器上模拟普通集群,

镜像集群,不过是RabbitMQ的HA方案而已,因为这种集群方式在部署的时候,其实是通过配置参数,让队列可以"真正的"在多个节点上存储.(而普通集群,队列实际只会存储在一个节点).

主从集群,则是在镜像集群的基础上,加一层负载均衡而已.

个人愚见,也许不对.

一.原理

RabbitMQ的集群的设计目的是在增加更多节点时,能线性的增加性能(CPU,内存)和容量(内存,磁盘).同时,一个节点宕机了,其他节点依然可以提供 RabbitMQ 的服务.

所以,队列的完整数据只会保存在创建它的那个节点上,其他节点只会保存该队列的元数据和一个指向这个队列的指针而已.

一个队列的完整数据包括队列的元数据和队列的内容:

RabbitMQ一共有4种类型的元数据,并且,RabbitMQ集群会始终同步这4种元数据.

  • 队列元数据:队列的名称和声明队列时设置的属性(是否持久化、是否自动删除、队列所属的节点)
  • 交换机元数据:交换机的名称、类型、属性(是否持久化等)
  • 绑定元数据:一张简单的表格展示了如何将消息路由到队列.包含的列有 交换机名称、交换机类型、路由键、队列名称等
  • vhost元数据:为vhost内队列、交换机和绑定提供命名空间和安全属性

因此,当用户访问其中任何一个RabbitMQ节点时,通过rabbitmqctl查询到的queue,user,exchange,vhost等信息都是相同的.

下图是一个有3个节点的集群,可以看到,消息保存在节点1.

当消费者从节点2获取消息时,RabbitMQ 会把节点1的消息取出来,传递到节点2,再发送给消费者.这种方式的最大问题在于,如果节点1宕机了,那么节点2和节点3就无法获取到节点1中还未消费的消息了.

如果做了队列持久化及消息持久化,那么必须等到节点1恢复后,才能被消费,并且在节点1恢复之前,其它节点不能再创建节点1已经创建过的队列;

如果队列没有持久化,消息就会失丢.

因此,这种默认的集群模式更适合非持久化队列,只有该队列是非持久话的,客户端才能重新连接到集群里的其他节点,并重新创建该队列.假如该队列是持久化的,那么只能将故障节点恢复起来.否则,永远无法创建同名的队列.

为了证明上面说的话,我们通过搭建一个单机集群,来模拟这个场景 .

二.搭建单机集群

1.配置Hosts节点

127.0.0.1 node1
127.0.0.1 node2

2.复制两份 RabbitMQ ,分别取名"-1","-2"

这里我们约定 "-1" 是 node1 的 RabbitMQ,"-2"是 node2 的 RabbitMQ.

3.修改 node1 的 rabbitmq-env.bat 文件

文件路径 : rabbitmq_server-3.7.10-1\sbin\rabbitmq-env.bat

在 16 行加如下配置:

set RABBITMQ_CONFIG_FILE=!RABBITMQ_HOME!\etc\rabbitmq-node1
set RABBITMQ_BASE=!RABBITMQ_BASE!\rabbitmq-cluster
set RABBITMQ_NODENAME=rabbit1@node1
set RABBITMQ_NODE_PORT=

再上个图,清楚些.

注意第19行, 是 rabbit1@node1 ,不是 rabbit@node1 ,单机集群,@前面一定要不一样,否则会"痛不欲生"...

4.修改 node1 的 rabbitmq-node1.config 文件

首先进入 rabbitmq_server-3.7.10-1\etc 文件夹,安装的时候会有一个官方示例文件 : rabbitmq.config.example

复制一份,改个名 : rabbitmq-node1.config

在 542 行加如下配置:

   {listener,[{port,},
{ip,"127.0.0.1"},
{ssl,false}]}

注意,我的 RabbitMQ 版本是 3.7.10 ,版本不一样,行数不一样,截个图,就是在这几行注释下面 :

5.启动 node1

1)关闭启动的 RabbitMQ

由于电脑上已经以window服务的方式启动了RabbitMQ,为了方便演示单机集群的搭建,所以我们需要将它关闭掉.

rabbitmq-service stop

,

2)启动 node 1 的 RabbitMQ

进入 node1 的 sbin 文件夹,也就是 rabbitmq_server-3.7.10-1\sbin 文件夹,然后我们以后台应用的方式启动.

rabbitmq-server -detached

验证一下:

在浏览器地址栏输入 http://localhost:15672/#/

如果没有启动管理后台插件,需要先启动它 : rabbitmq-plugins enable rabbitmq_management (由于之前已经启动过了,所以我这里就不需要再启动了)

默认的账号密码都是 guest

在管理后台可以看到,node1 已经成功启动了.

6.修改 node2 的配置文件

按照第3,4步的方式修改,只是把管理后台的端口由 15672 改成 15673,当然,文件名要改成 rabbitmq-node2.config

   {listener,[{port,},
{ip,"127.0.0.1"},
{ssl,false}]}

rabbitmq-env.bat 文件修改如下,红色标注,特别注意 rabbit2@node2

set RABBITMQ_CONFIG_FILE=!RABBITMQ_HOME!\etc\rabbitmq-node2
set RABBITMQ_BASE=!RABBITMQ_BASE!\rabbitmq-cluster
set RABBITMQ_NODENAME=rabbit2@node2
set RABBITMQ_NODE_PORT=

7.启动 node2

参考第5步的第2小步启动.

验证一下:

在浏览器地址栏输入 http://localhost:15673/#/

没毛病!

8.将 node2 加入集群

1)关闭 node2

rabbitmqctl stop_app

2)将 node2 加入到 node1

rabbitmqctl join_cluster rabbit1@node1

3)启动 node2

先停止 rabbitmqctl stop

在启动 rabbitmq-server -detached

4)打开 15672 和 15673 管理后台验证:

三.节点操作

增加

1. rabbitmq-server -detached   --- .erlang.cooike的权限,400 属主rabbitmq
2. rabbitmqctl stop_app
3. rabbitmqctl join_cluster --ram rabbit@rabbitmq1
4. rabbitmqctl start_app
5. rabbitmqctl cluster_status
 

删除

1. rabbitmq-server -detached 正常运行的节点省略此步.
2. rabbitmqctl stop_app
3. rabbitmqctl reset 
 

硬删除

直接删掉集群中的某个节点
rabbitmqctl forget_cluster_node   node_name

参考:

https://www.cnblogs.com/nulige/p/8874893.html

https://blog.csdn.net/vbirdbest/article/details/78723467

https://blog.csdn.net/fgf00/article/details/79558498

RabbitMQ (十三) 集群+单机搭建(window)的更多相关文章

  1. Redis 5.0.7 讲解,单机、集群模式搭建

    Redis 5.0.7 讲解,单机.集群模式搭建 一.Redis 介绍 不管你是从事 Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业 ...

  2. RabbitMQ之集群搭建

    1.RabbitMQ集群模式RabbitMQ集群中节点包括内存节点(RAM).磁盘节点(Disk,消息持久化),集群中至少有一个Disk节点. 2.普通模式(默认)        对于普通模式,集群中 ...

  3. redis在Windows下以后台服务一键搭建集群(单机--伪集群)

    redis在Windows下以后台服务一键搭建集群(单机--伪集群) 一.概述 此教程介绍如何在windows系统中同一台机器上布置redis伪集群,同时要以后台服务的模式运行.布置以脚本的形式,一键 ...

  4. ZooKeeper 系列(二)—— Zookeeper单机环境和集群环境搭建

    一.单机环境搭建         1.1 下载         1.2 解压         1.3 配置环境变量         1.4 修改配置         1.5 启动         1. ...

  5. ZooKeeper —— 单机环境和集群环境搭建

    一.单机环境搭建 1.1 下载 下载对应版本Zookeeper,这里我下载的版本3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # w ...

  6. ZooKeeper学习之路(二)—— Zookeeper单机环境和集群环境搭建

    一.单机环境搭建 1.1 下载 下载对应版本Zookeeper,这里我下载的版本3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # w ...

  7. ZooKeeper系列(二)—— Zookeeper 单机环境和集群环境搭建

    一.单机环境搭建 1.1 下载 下载对应版本 Zookeeper,这里我下载的版本 3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # ...

  8. RabbitMQ 3.9.7 镜像模式集群的搭建

    1. 概述 老话说的好:做人脚踏实地,一步一个脚印,便定能战胜一切困难,最终取得成功!!! 言归正传,之前我们聊了 RabbitMQ 单点服务的安装,今天我们来聊聊 RabbitMQ 3.9.7 镜像 ...

  9. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十三)kafka+spark streaming打包好的程序提交时提示虚拟内存不足(Container is running beyond virtual memory limits. Current usage: 119.5 MB of 1 GB physical memory used; 2.2 GB of 2.1 G)

    异常问题:Container is running beyond virtual memory limits. Current usage: 119.5 MB of 1 GB physical mem ...

随机推荐

  1. 【Luogu】P3933 Chtholly Nota Seniorious

    [题意]将n*m矩阵分成两个区域,要求满足一定条件,求两区域内部极差较大值最小.n,m<=2000 [算法]二分 [题解]极差的数值满足单调性,所以考虑二分极差. 对于给定的极差,将所有数值排序 ...

  2. GitLab 迁移与升级

    参考: [ 博客园 BigBao ] 环境说明: OS: CentOS 7.x gitlab-ce 初始版本: 8.8.5 gitlab-ce 升级到版本: 11.2.3 升级方式: rpm 安装升级 ...

  3. Java连接Oracle数据库的三种连接方式

    背景: 这两天在学习Oracle数据库,这里就总结下自己上课所学的知识,同时记录下来,方便整理当天所学下的知识,也同时方便日后自己查询. SQL语句的话,这里我就不多讲了,感觉和其他的数据库(MySQ ...

  4. 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛) F.猴子排序的期望

    题目链接:https://www.nowcoder.com/acm/contest/116/F 题目描述 我们知道有一种神奇的排序方法叫做猴子排序,就是把待排序的数字写在卡片上,然后让猴子把卡片扔在空 ...

  5. 玩一下易语言 "和"字有多种读音,注定了它的重要性!!

    变量名 类型 静态 数组 备注 拼音 文本型   0   测试的汉字 文本型       有几种发音 整数型       i 整数型       测试用的汉字 = “和” 有几种发音 = 取发音数目 ...

  6. 多github帐号的SSH key切换

    我有两个github帐号,一个是个人所用,一个是为公司项目所用.如果是单用户(single-user),很方便,默认拿id_rsa与你的github服务器的公钥对比:如果是多用户(multi-user ...

  7. Java多线程学习(三)volatile关键字

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79680693 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  8. linux下暴力破解工具hydra【转】

    一.简介 Number one of the biggest security holes are passwords, as every password security study shows. ...

  9. .gitignore 文件添加或更新后规则无效的解决方案

    项目已经提交之后,突然想忽略某个文件或目录 A,于是在 .gitignore 里添加了忽略规则.但是提交(commit)之后,发现一旦修改了 A,git 同样会检测到 A 的变化(changes) , ...

  10. Linux(Unix)密码策略问题导致root密码不能修改

    Linux(Unix)密码策略问题导致root密码不能修改 发布时间:  2016-01-19 浏览次数:  1034 下载次数:  5 用户修改了密码配置文件,导致root账户修改密码时报如下错误: ...