作者: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的使用(二) RabbitMQ服务在单机中做集群相关推荐

  1. seata的部署与微服务集成(包含多集群异地容灾配置)

    seata的部署与微服务集成 一.部署Seata的tc-server 1.下载与安装 2.配置文件详细讲解 3.创建数据库表 4.启动 二.微服务集成seata 1.引入依赖 2.修改配置文件 3.启 ...

  2. Linux中级实战专题篇:rabbitmq(消息中间件p2p模式和pub模式,消息队列rabbitmq详解,单机安装,集群部署以及配置实战)

    一.消息中间件相关概念 1.简介 消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台相关 的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息 队列模型,可以在分布 ...

  3. RHCS+Conga+iSCSI+CLVM+GFS实现Web服务的共享存储HA集群

    一.RHCS架构规划: 所有服务器系统均为CentOS6.4_x86_64 在架构RHCS集群的诸多设定中如rpm包安装.配置文件修改等都需要在三个节点上同时进行:为了便于实现此过程,配置一台step ...

  4. 分布式和微服务区别_分布式、集群、微服务到底有啥区别?

    点击上方"不太厉害的程序猿",选择"置顶或者星标" 你关注的就是我关心的! 来源说明:部分信息来源于csdn 概念: 集群是个物理形态,分布式是个工作方式. 1 ...

  5. 阿里二面:Redis有几种集群方案?我答了4种

    背景 在服务开发中,单机都会存在单点故障的问题,及服务部署在一台服务器上,一旦服务器宕机服务就不可用,所以为了让服务高可用,分布式服务就出现了,将同一服务部署到多台机器上,即使其中几台服务器宕机,只要 ...

  6. .Net Core微服务入门——Ocelot和Consul集群高可用

    .Net Core微服务入门--Ocelot和Consul集群高可用 上一章 我们ocelot网关顺利的接入了consul集群,并且访问成功. 但是,我们也遇到了问题,把 192.168.8.25 上 ...

  7. 简单体验K8S的Saas服务-青云KubeSphereCloud轻量集群服务

    简单体验K8S的Saas服务-青云KubeSphereCloud轻量集群服务 背景 之前有写过几篇KubeSphere的使用笔记: 使用kubekey的all-in-one安装K8S1.24及Kube ...

  8. RabbitMq(十六)单机多实例集群搭建步骤介绍

    在单机环境搭建rabbitmq多节点集群步骤如下: 首先保证当前安装的rabbitmq程序是正常安装,并正常启动过的,首先需要先停掉rabbitmq节点,保证服务未在运行中(可以激主机重启一下,或通过 ...

  9. RabbitMQ 从入门到精通 消息应答 持久化 交换机 队列 发布确认 集群 等

    RabbitMQ消息队列 RabbitMQ 的概念 RabbitMQ 是一个消息中间件:它接受并转发消息.你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快 ...

最新文章

  1. Java 8 - 01 优雅编程 lambda 以及 @FunctionalInterface注解一点通
  2. 机器人学习--路径规划算法
  3. Sublime 插件安装、卸载、更新
  4. 入门RabbitMQ核心概念
  5. linux配置iscsi无账号密码,linux4 如何配置iscsi启动器
  6. 手机充电器5V=1A和5V=2A的区别是什么?能通用吗?
  7. 事物的级别_实战分析:事务的隔离级别和传播属性
  8. 2019.1.15 作业
  9. Dubbo Remoting模块详解
  10. 服务器系统装驱动精灵,云服务器安装驱动精灵
  11. 司空见惯 - 英雄扫雷鼠
  12. 签名申请问题(100%成功)
  13. python城市经纬度网格_Python3爬虫 利用百度地图api得到城市经纬度
  14. 网页端哔哩哔哩4倍速播放视频 哔哩哔哩3倍
  15. 异次元个人发卡系统_开源发卡系统
  16. 魔法宝石(动态规划)
  17. android模拟点击滑动,android模拟点击,长按和滑动
  18. 怎么学好计算机专业?
  19. 如何快速提取音频,无需下载app,简单便捷,快收藏
  20. 在 OneNote 2010中输入复杂的数学公式

热门文章

  1. 后端拼接html能做判断吗,怎么判断是前端bug还是后端bug?
  2. SVN服务器更换地址解决方法
  3. ros 运行rviz时出现 QXcbConnection: XCB error: 148 错误 解决方法
  4. 自定义View -- 刻度尺
  5. 一步步学习ASP.NET MVC3 (10)——@Ajax,JavaScriptResult(1)
  6. 项目开发中遇到的小问题及小规范
  7. 使用diskpart命令为windows7创建分区
  8. 云计算与SaaS的关系 :新计算时代将来临
  9. 计算机知识产权结合,计算机知识产权.doc
  10. Subversion 1.5 安装配置指南