消息队列的使用 RabbitMQ (二): Windows 环境下集群的实现
一、RabbitMQ 集群的基本概念
一个 RabbitMQ 中间件(broker) 由一个或多个 erlang 节点组成,节点之间共享 用户名、虚拟目录、队列消息、运行参数 等, 这个 节点的集合被称为集群。
举例说明, A、B、C 三个节点同在一个集群中, 发布端向 A 节点发送消息, 消费者可在 B 或 C 接收到消息。消息被消费后被删除。这是最基础的集群模式,不涉及到消息的镜像(high availabilit)。
不足之处就是当接收消息的节点挂掉后, 其他节点无法取到该节点中未被消费的消息。若做消息持久化, 则在重新启动该节点后,未消费信息可被获取。 若未做消息持久化,则消息丢失。
二、集群的配置
1、配置 host
假设现有 A、B 两台机器,其配置如下
A
IP: 178.101.200.160
节点名: rabbit-A
B
IP:178.101.200.161
节点名: rabbit-B
上面所说的节点名,可在 rabbitmq mangement 界面中查看,也可以在命令行中查看。
进入RabbitMQ Management 管理界面,右下角 rabbit@3vjap-ysd-0 中的 3vjap-ysd-0 即为当前节点名。

下面开始配置 hosts:
在 A、B 的 hosts 文件中,绑定 IP 与 节点名, 如下:
178.101.20.160 rabbit-A
178.101.20.161 rabbit-B
2、配置环境变量文件 rabbitmq-env.conf
环境变量文件,定义了 rabbitmq 的日志文件、数据存储位置。
在目录 C:\Users\Administrator\AppData\Roaming\RabbitMQ 下创建 rabbitmq-env.conf 文件。
A 中 rabbitmq-env.conf 文件内容如下:
NODENAME=rabbit@rabbit-A
NODE_IP_ADDRESS=178.101.20.160
NODE_PORT=5672
RABBITMQ_MNESIA_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\db
RABBITMQ_LOG_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\log
B 中 rabbitmq-env.conf 文件内容如下:
NODENAME=rabbit@rabbit-B
NODE_IP_ADDRESS=178.101.20.161
NODE_PORT=5672
RABBITMQ_MNESIA_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\db
RABBITMQ_LOG_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\log
3、统一 .erlang.cookie 文件
erlang.cookie是erlang实现分布式的必要文件,erlang分布式的每个节点上要保持相同的.erlang.cookie文件。只有这个文件一致的节点,才能加入到集群中。
该文件一般存放在两个地方:
%WINDIR% (c:\Windows\.erlang.cookie) 此处在我的电脑上是: C:\Windows\System32\config\systemprofile\.erlang.cookie
%HOMEDRIVE%%HOMEPATH% (C:\Users\%USERNAME%\.erlang.cookie )
将所有位置的 cookie 文件都替换为机器 A 下的 cookie 文件(注意,此处说的是所有位置,两台机器有四个 cookie 文件,这个四个位置的 cookie 文件都必须相同)。
4、命令行中添加节点
在机器 A 中 :
1)、以管理员身份开启 cmd
2)、进入工具目录 cd c:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.6\sbin

3)、重置 RabbitMQ
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app
在机器 B 中:
1)、以管理员身份开启 cmd
2)、进入工具目录
cd c:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.\sbin
3)、添加 A 节点
rabbitmqctl stop_app
rabbitmqctl reset
rabbtimqctl join_cluster rabbit@rabbit-A
rabbitmqctl start_app
注意,此处在机器 A 中添加 B 节点与 B 中添加 A 节点是同一个效果。
这样就完成了集群的配置,现在可以在RabbitMQ Management 看到了。
下面是配置了三个节点之后的集群图:

相关的两个命令:
查看集群状态 : rabbitmqctl cluster_status
删除添加到集群中的队列:rabbitmqctl forget_cluster_node rabbit@rabbit-A
三、集群状态下发布消息优化
1、可用 DNS 负载均衡功能。申请一个域名,对应机器 A、B 的 IP 地址, 每次发布消息,可利用 dns 解析的特性自动实现负载均衡。
2、easynetq 随机选择域名
var bus = RabbitHutch.CreateBus("host=myfirsthost,mysecondhost", x => x.Register<IClusterHostSelectionStrategy<ConnectionFactoryInfo>, RandomClusterHostSelectionStrategy<ConnectionFactoryInfo>>());
四、消息镜像(高可用性)
未完待续。
参考:
http://www.rabbitmq.com/clustering.html
https://blog.csdn.net/u010029983/article/details/45337365
https://www.cnblogs.com/hegx/p/6097147.html
消息队列的使用 RabbitMQ (二): Windows 环境下集群的实现的更多相关文章
- 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...
- 进击的Python【第十一章】:消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queu ...
- RabbitMQ,Windows环境下安装搭建
切入正题:RabbitMQ的Windows环境下安装搭建 一.首先安装otp_win64_20.1.exe,,, 二.然后安装,rabbitmq-server-3.6.12.exe, 安装完成后,在服 ...
- RabbitMQ消息队列系列教程(二)Windows下安装和部署RabbitMQ
摘要 本篇经验将和大家介绍Windows下安装和部署RabbitMQ消息队列服务器,希望对大家的工作和学习有所帮助! 目录 一.Erlang语言环境的搭建 二.RabbitMQ服务环境的搭建 三.Ra ...
- RabbitMQ分布式消息队列服务器(一、Windows下安装和部署)
RabbitMQ消息队列服务器在Windows下的安装和部署-> 一.Erlang语言环境的搭建 RabbitMQ开源消息队列服务是使用Erlang语言开发的,因此我们要使用他就必须先进行Erl ...
- C# Queue与RabbitMQ的爱恨情仇(文末附源码):Q与MQ消息队列简单应用(二)
上一章我们讲了队列( Queue),这一章我们讲Message Queue消息队列,简称MQ. 定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开 ...
- RabbitMQ在Windows环境下的安装与使用
Windows下安装RabbitMQ 环境配置 部署环境 部署环境:windows server 2008 r2 enterprise 官方安装部署文档:http://www.rabbitmq.com ...
- (转)RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)
在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...
- 消息队列的使用 RabbitMQ
RabbitMQ 是一款开源且比较流行的消息中间件.但用起来还是比较麻烦,有人封装了一层, 这就是 EasyNetQ . 一.安装 1.安装 Erlang: http://www.erlang.org ...
随机推荐
- Python创建容器和集合之源码分析
_collections_abc.py文件中提供了许多抽象基类,这些类将集合分解成许多互相独立的属性集 __all__ = ["Awaitable", "Coroutin ...
- unity3D加密如何做到防编译?
先介绍对unity3D程序进行加密的几种方式. Unity3D是一个基于Mono框架的跨平台游戏开发引擎,Unity3D所使用的Mono属于Mono开源项目的分支 在Unity3D中,代码会编译到As ...
- VISUALSVN: UNABLE TO CONNECT TO A REPOSITORY AT URL 无法连接主机的解决办法
场景:我的系统是win7,安装的 VisualSVN Server 作为svn 服务器,昨天是好的,我手渐,使用鲁大师优化了系统,今天提交,更新的时候,直接提示:Unable to connect t ...
- CCF-CSP 201709-4通信网络
问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只能单向传递信息,即一条从部门a到部门b的通路只能由a向b传递信息.信息可以通过中转的方式进行传递,即如果a能将信息 ...
- 大数运算的算法设计和C++实现
1.背景 工作中遇到过需要进行极大数据的存储和运算的场景,当时使用Python解决了这个问题,在Python中,整数没有位数限制,使用起来很方便.但是当程序主体使用C/C++实现时,就比较麻烦.所以考 ...
- 笔记:Spring Boot 项目构建与解析
构建 Maven 项目 通过官方的 Spring Initializr 工具来产生基础项目,访问 http://start.spring.io/ ,如下图所示,该页面提供了以Maven构建Spring ...
- Redis数据过期策略
1.Redis中key的的过期时间 通过EXPIRE key seconds命令来设置数据的过期时间.返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间.在key上设置了过期时间后ke ...
- DirectSound---捕获音频、Qml/C++ 集成交互
DirectSound的音频捕获原理和播放原理差不多,内部在一个缓冲区上循环写入捕获到的数据,并且提供notify通知功能. 1. 音频捕获 因为捕获流程和播放流程类似,我们就不在这里赘述了,只给出简 ...
- 设计模式NO.3
设计模式NO.3 本次博客内容为第三次设计模式的练习.根据老师的要求完成下列题目: 题目1 某商品管理系统的商品名称存储在一个字符串数组中,现需要自定义一个双向迭代器(MyIterator)实现对该商 ...
- 第一部分 linux系统命令
一.linux系统命令 pwd 当前目录位置 / 根目录 cd (change direcory) cd ..返回上一层目录 ls 显示当前目录下文件 ls -l 显示目录下详细文件信息 ls -lh ...