拜读了网上很多前辈的文章,对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 1160] 队列安排

    Luogu 1160 队列安排 链表H2O H2O H2O模板. 太久不写链表,忘干净了,竟调了半个晚上. 保留备用. #include <cstdio> #include <cst ...

  2. Spring mvc 增加静态资源配置后访问不了注解配置的controller

    spring mvc 增加静态资源访问配置. 例如: <!-- 静态资源映射 --> <mvc:resources location="/static/" map ...

  3. Java程序运行时的几个区域

    Java运行时涉及到的区域 几个基本概念: 1.Java对象     2.Java方法    3.一个编译好的类,以class文件的形式出现 4.Java的本地方法   5.线程私有和线程共有   一 ...

  4. Vuejs - 深入浅出响应式系统

    Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 Javascript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接,不过理解其工作原理同样非常重要,这样 ...

  5. 25、如何实现redis集群?

    由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用.Redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以到100GB.200GB的规模,但是单实例模式限制了Redis没法 ...

  6. SQL SERVER 创建远程数据库链接 mysql oracle sqlserver

    遇到的坑 在连接Oracle时,因为服务器为10g 32位版本,然后在本地安装了32为10g客户端,然后一直报错[7302.7303],后来下载了12c 64位版本,安装成功后,问题解决 原因:mss ...

  7. hdu 3790 最短路径问题(双重权值,dijkstra算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...

  8. base--AuditResult

    //参考base-4.0.2.jar public class AuditResult implements TimeReferable, Serializable //参考api-1.0.0.jar ...

  9. Linux进程调度与源码分析(三)——do_fork()的实现原理

    用户层的fork(),vfork(),clone()API函数在执行时,会触发系统调用完成从用户态陷入到内核态的过程,而上述函数的系统调用,最终实现都是通过内核函数do_fork()完成,本篇着重分析 ...

  10. Bookmarks_www2

    Bookmarks Bookmarks alexis- (Alex Incogito) - Repositories · GitHub GitHub - aetcnc-Arduino_DeltaHMI ...