RabbitMQ的使用(二)- RabbitMQ服务在单机中做集群
作者:markjiang7m2
原文地址:https://www.cnblogs.com/markjiang7m2/p/12837151.html
官网地址:http://letyouknow.net
在上一篇RabbitMQ的使用(一)- RabbitMQ服务安装 中总结的是在Windows服务器上安装服务,对于一个高可用部署方案,必须要做集群。我自己在用的就是一台Windows系统机器,如果做集群的话,运行几个虚拟机或者跑几个Docker就可以很简单地实现了,但是我看了下官文关于集群的配置,是支持直接在当前系统中开多个服务配置集群的,所以就有了这一篇折腾文章了。
官文配置集群链接https://www.rabbitmq.com/clustering.html
Windows系统单机做RabbitMQ集群
单机启动多个RabbitMQ服务
其实在单机做集群的适用场景可能是在于开发环境和测试环境,而使用单机跟多机做集群之间的差别是在于如何在单机上启动多个RabbitMQ服务,只要把服务安装好了,后面的步骤跟多机就是一样的。
官网关于单机做集群的指引在这里https://www.rabbitmq.com/clustering.html#single-machine,但是以Linux系统为例的,Windows系统还不能直接使用例子上面的命令。
如例子中创建RabbitMQ服务的指令:
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached
在Windows系统的DOS命令就需要分为多个指令:
set RABBITMQ_NODE_PORT=5672
set RABBITMQ_NODENAME=rabbit
rabbitmq-server -detached
我还启用了RabbitMQ管理界面,所以我的完整指令:
set RABBITMQ_NODE_PORT=5673
set RABBITMQ_NODENAME=rabbit1
set RABBITMQ_CONFIG_FILE=D:\Mark\Tempfiles\rabbitmq.conf
set RABBITMQ_SERVER_START_ARGS=-rabbitmq_management listener [{port,15673}]
rabbitmq-server -detached
启动效果如下:
然后以相同的方式再启动多一个节点rabbit2。
单机添加多个节点到同一个集群中
在上一篇文章中安装RabbitMQ服务时,就已经默认了端口为5672的RabbitMQ服务。这一次,我就以这个服务为主节点,将节点rabbit1,rabbit2添加到这个集群中。
在添加到集群之前,我们来看一下原有的集群配置,配置文件在C:\Users\%UserName%\AppData\Roaming\RabbitMQ\db\%nodename%-mnesia
目录下,文件名为cluster_nodes.config
。可以看到现在三个节点的配置都是类似的,{[%nodename%],[%nodename%]}.
,意为每个节点都在自己独立的集群中。
根据官文的指引,要添加到同一个集群,执行下面的指令即可:
rabbitmqctl -n rabbit1 stop_app
rabbitmqctl -n rabbit1 join_cluster rabbit@%hostname%
rabbitmqctl -n rabbit1 start_app
效果如下:
此时可以发现http://localhost:15672/#/
和http://localhost:15673/#/
显示是一样的了,包括集群名称。
以相同的方式将rabbit2加入到该集群中。
这个时候我们再看集群配置文件cluster_nodes.config
,已经包含了三个节点,格式如下:
{[%node1name%,%node2name%,%nodename%],[%node1name%,%node2name%,%nodename%]]}.
从集群中移除节点
简单的集群就已经做完了。那如果想要将其中一个节点从集群中移除,需要什么指令呢?
下面是我从集群中移除节点rabbit2
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit1 forget_cluster_node rabbit2@%hostname%
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit2 start_app
rabbitmqctl -n rabbit2 reset
这一步是不可少的,如果移除节点后,直接启动节点会报错。
此时再看管理界面,也会发现rabbit2被移除了,列表中只有两个节点。
还有一点需要注意的是Erlang cookie。每个节点都必须保持一致,可以将主节点的home dir目录下的cookie值复制到其它节点中。
home dir目录可以在RabbitMQ日志中找到,一般默认值为:C:\Windows\System32\config\systemprofile。cookie文件名为:.erlang.cookie
。
其它节点的Erlang cookie需要被覆盖的有两个地方,home dir目录和user目录下的.erlang.cookie
文件,user目录为C:\Users\%username%
。这个覆盖操作一般都是针对多机集群的,因为我这里用的是单机做集群,所有节点的home dir和user目录都是一样的,所以我这里不需要覆盖。
RabbitMQ HA高可用镜像队列
官文地址:https://www.rabbitmq.com/ha.html
上面就建立起了有三个节点的RabbitMQ集群。默认情况下,RabbitMQ集群中队列的内容位于单个节点(声明该队列的节点)上。这与交换机和绑定相反,交换机和绑定始终可以被视为在所有节点上,这就会导致了当队列的内容存在于A节点,当A节点宕机了,B节点仍然存在A节点中的队列,但无法获取A节点队列的内容。此时,我们可以选择使队列跨多个节点进行镜像。
我们可以通过策略配置镜像参数。一个策略按名称匹配一个或多个队列(使用正则表达式模式),并且包含一个定义(可选参数的映射),该定义被添加到匹配队列的全部属性中。
我这里使用的虚拟主机为markhost
,然后在Admin-> Policies-> Add/update a policy 创建一个策略,如下:
这里有两个地方比较注意的地方。
Pattern : ^mark1
此处意为当命名以mark1
开头的队列进行镜像。ha-mode: all
此处意为对所有节点都进行镜像,这里的参数设置参考官文说明https://www.rabbitmq.com/ha.html#mirroring-arguments
创建两个队列,分别命名为mark_queue
和mark1_queue
mark1_queue
队列中,Node为rabbit@xxx
表示该队列是属于rabbit
节点的,+2
的标志表示有两个镜像节点,Features含有mark_Pli1
,表示该队列符合mark_Pli1
策略。
mark_queue
队列因为不符合策略,所以并没有镜像节点。
现在我尝试将rabbit
节点停止了,运行指令rabbitmqctl -n rabbit stop_app
,再看队列情况。
会发现mark1_queue
队列已经自动转移到rabbit2
节点中,而且依然正常运行,而mark_queue
队列的状态则被标记为down
,这是因为做了镜像的队列内容存在于所有节点中,当所属节点宕机了,会继续通过其它节点正常发布和消费,而没有做镜像的队列只有当所属节点恢复正常后才能正常被发布和消费。
至于需要用多少节点做镜像,像我例子中的做法将所有节点都做镜像,这个是最保守的做法,最大程度保证数据不丢失,但在实际情况下需要考虑额外的压力,如网络I/O,磁盘I/O等,因为做镜像节点越多,所占用的带宽就越多,磁盘I/O同理。根据官文建议,如果集群有3个节点,可以选择2个节点做镜像,5个节点可以选择3个节点镜像,当然也不是所有数据都需要做镜像,特别对于那些只是瞬态或者对时间敏感的数据,是不需要镜像的,所以需要设置合理的策略。
集群服务延伸
其实也许有朋友会发现使用rabbitmq-server
指令创建的服务,并非在Windows服务中创建的,而是当前Windows用户使用erl.exe
创建的一个进程,因此一旦当前用户退出了系统,RabbitMQ节点也就退出了服务,所以上面创建服务的指令可以使用rabbitmq-service
。
set RABBITMQ_NODE_PORT=5673
set RABBITMQ_NODENAME=rabbit1
set RABBITMQ_SERVICENAME=rabbit1
set RABBITMQ_CONFIG_FILE=D:\Mark\Tempfiles\rabbitmq.conf
set RABBITMQ_SERVER_START_ARGS=-rabbitmq_management listener [{port,15673}]
rabbitmq-service install
rabbitmq-service start
这样就可以创建一个名为rabbit1
的Windows后台服务,该服务归属于SYSTEM,因此即使当前用户注销了,服务仍然可用。
再延伸一下
如果系统重启了,这样创建的服务会无法正常启动,这是因为我们上面的指令set
是临时更改环境变量的,当服务重新启动的时候,这些环境变量会恢复到原有值。
就这个情况,我们可以创建一个批处理文件,包含指令:
set RABBITMQ_NODE_PORT=5673
set RABBITMQ_NODENAME=rabbit1
set RABBITMQ_SERVICENAME=rabbit1
set RABBITMQ_CONFIG_FILE=D:\Mark\Tempfiles\rabbitmq.conf
set RABBITMQ_SERVER_START_ARGS=-rabbitmq_management listener [{port,15673}]
rabbitmq-service start
然后将这个批处理文件添加到任务计划程序中,选择触发器为计算机启动时
。这样即使系统重启了,也会正常启动RabbitMQ的所有节点,保证集群正常运行。
总结
本文就记录了我在windows系统中使用单机做RabbitMQ集群,也简单地做了一个高可用集群方案,单机集群方案更多地只是会出现在开发测试环境,实际生产环境还是会每台机器部署一个服务的,但因为对于多机集群,配置步骤也相差不大,所以对于实际生产环境的部署,本文也是有一定参考价值的,希望可以能对各位有一定的帮助。
RabbitMQ的使用(二)- RabbitMQ服务在单机中做集群的更多相关文章
-
Redis安装(单机及各类集群,阿里云)
Redis安装(单机及各类集群,阿里云) 前言 上周,我朋友突然悄悄咪咪地指着手机上的一篇博客说,这是你的博客吧.我看了一眼,是之前发布的<Rabbit安装(单机及集群,阿里云>.我朋友很 ...
-
【web】 亿级Web系统搭建——单机到分布式集群
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架 ...
-
[转]亿级Web系统搭建:单机到分布式集群
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...
-
亿级Web系统搭建:单机到分布式集群【转】
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...
-
Centos7安装Nacos单机模式以及集群模式(包含nignx安装以及实现集群)的相关配置
Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. Nacos支持三种部署模式 单机模式 - 用于测试 ...
-
亿级Web系统搭建:单机到分布式集群
亿级Web系统搭建:单机到分布式集群 当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压 ...
-
Mosquitto搭建Android推送服务(三)Mosquitto集群搭建
文章钢要: 1.进行双服务器搭建 2.进行多服务器搭建 一.Mosquitto的分布式集群部署 如果需要做并发量很大的时候就需要考虑做集群处理,但是我在查找资料的时候发现并不多,所以整理了一下,搭建简 ...
-
Zookeeper 集群搭建--单机伪分布式集群
一. zk集群,主从节点,心跳机制(选举模式) 二.Zookeeper集群搭建注意点 1.配置数据文件 myid 1/2/3 对应 server.1/2/3 2.通过./zkCli.sh -serve ...
-
RabbitMQ-rabbitmqctl多机多节点和单机多节点集群搭建(五)
准备 1.准备3台物理机 我这里通过本地机和2台虚拟模拟我是mac通过(Parallel Desktop 实现) 2.按照签名的liux安装步骤在3台机器都安装rabiitMq 3.将任意一节点的co ...
随机推荐
-
微软发布VSBT,无需安装Visual Studio即可实现项目编译
安装了Visual Studio的那些使用微软平台的开发者通常能够非常容易地操作自己的项目:打开解决方案,修改内容,设置好所有必须的文件以及配置后编译项目.但是在构建服务器或者持续交付系统等没有安装V ...
-
一眼看懂深浅拷贝(clone)-C#
这是使用的是序列化的方式实现深拷贝 [Serializable] class Person:ICloneable { /// <summary> /// 字符串在clone 中类似于值类型 ...
-
HTML 表单
HTML 表单包含表单元素. <form> 元素定义 HTML 表单 表单元素指的是不同类型的 input 元素.复选框.单选按钮.提交按钮等等. HTML 表单用于搜集不同类型的用户输入 ...
-
Animation &; Property Animation 使用
本篇主要讲Animation 和 Property Animation的使用,最后会讲QQ管家桌面火箭作为例子: 在Android中开发动效有两套框架可以使用,分别为 Animation 和 Prop ...
-
filter在CSS中的效果
滤镜说明: Alpha:设置透明层次 blur:创建高速度移动效果,即模糊效果 Chroma:制作专用颜色透明 DropShadow:创建对象的固定影子 FlipH:创建水平镜像图片 FlipV:创建 ...
-
使用 JUnit 进行单元测试 - 教程
tanyuanji@126.com 版本历史 JUnit 该教程主要讲解 JUnit 4.x 版本的使用,以及如何在Eclipse IDE 中如何使用JUnit 目录 tanyuanji@126. ...
-
搞懂Linux下的几种文件类型
在Linux系统下,有七类文件类型: 普通文件(-) 目录(d) 软链接(字符链接L) 套接字文件(S) 字符设备(S) 块设备(B) 管道文件(命名管道P) 普通文件.目录.软链接无需多解释. 管道 ...
-
Git_GitHub详解
Git和Github详细教程 一 概述 说到Git和Github,前几天我们知道微软以75亿美元收购全球最大的代码托管和写作平台GitHub,而GitHub是全球最大的代码仓库,很多开发人员都将代码 ...
-
[luogu4462][异或序列]
传送门 突然发现自己没整理过异或的知识,正好借这个题整理一下. 关于异或 (1)异或就是在二进制下,两数各个位置上的数,相同为0,不同为1,所得到的数,比如说4^7,4的二进制是100,7的二进制是1 ...
-
vscode 的tab与空格设置
为了python 的pep8 标准,把tab键输入从\t的制表符 转为4个空格. 1在vscode下边栏点击 “空格” 在上面选项里设置 使用空格缩进, 以及可以 将缩进转换为空格 2在“文件-> ...