一、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 环境下集群的实现的更多相关文章

  1. 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...

  2. 进击的Python【第十一章】:消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queu ...

  3. RabbitMQ,Windows环境下安装搭建

    切入正题:RabbitMQ的Windows环境下安装搭建 一.首先安装otp_win64_20.1.exe,,, 二.然后安装,rabbitmq-server-3.6.12.exe, 安装完成后,在服 ...

  4. RabbitMQ消息队列系列教程(二)Windows下安装和部署RabbitMQ

    摘要 本篇经验将和大家介绍Windows下安装和部署RabbitMQ消息队列服务器,希望对大家的工作和学习有所帮助! 目录 一.Erlang语言环境的搭建 二.RabbitMQ服务环境的搭建 三.Ra ...

  5. RabbitMQ分布式消息队列服务器(一、Windows下安装和部署)

    RabbitMQ消息队列服务器在Windows下的安装和部署-> 一.Erlang语言环境的搭建 RabbitMQ开源消息队列服务是使用Erlang语言开发的,因此我们要使用他就必须先进行Erl ...

  6. C# Queue与RabbitMQ的爱恨情仇(文末附源码):Q与MQ消息队列简单应用(二)

    上一章我们讲了队列( Queue),这一章我们讲Message Queue消息队列,简称MQ. 定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开 ...

  7. RabbitMQ在Windows环境下的安装与使用

    Windows下安装RabbitMQ 环境配置 部署环境 部署环境:windows server 2008 r2 enterprise 官方安装部署文档:http://www.rabbitmq.com ...

  8. (转)RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...

  9. 消息队列的使用 RabbitMQ

    RabbitMQ 是一款开源且比较流行的消息中间件.但用起来还是比较麻烦,有人封装了一层, 这就是 EasyNetQ . 一.安装 1.安装 Erlang: http://www.erlang.org ...

随机推荐

  1. 【前端单元测试入门04】Karma

    Karma 官方介绍 A simple tool that allows you to execute JavaScript code in multiple real browsers. 即一个允许 ...

  2. S/4 HANA中的ACDOCT和FAGLFLEXT

    最近的几个需求让我对ACDOCT和FAGLFLEXT这两个财务相关表(准确地说是视图)产生了一些了解,同时也发现某些开发同行和业务顾问并没有认识到这些东西.因此打算从技术角度来说明一下这两个视图在S4 ...

  3. 如何在MD(d)和MT(d)工程间正确分配和释放动态内存

    MD(d)和MT(d) MD(d)和MT(d)是windows下VC开发的两个编译选项,表示程序的运行时库编译选项. /MT是"multithread, static version&quo ...

  4. Java并发系列[9]----ConcurrentHashMap源码分析

    我们知道哈希表是一种非常高效的数据结构,设计优良的哈希函数可以使其上的增删改查操作达到O(1)级别.Java为我们提供了一个现成的哈希结构,那就是HashMap类,在前面的文章中我曾经介绍过HashM ...

  5. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  6. PHP-CGI,FASTcgi,php-fpm,之间的关系?

    刚开始对这个问题我也挺纠结的,看了<HTTP权威指南>后,感觉清晰了不少.首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者.   ...

  7. JavaScript 哈希表(散列表)应用

    查找的效率与比较次数密切相关.基于比较的程序,运算效率是比较低的.比如平时可以通过indexOf查找一个数据.但这是一个基于比较的一个实现.如果是淘宝那样有上亿个商品,那么用indeOf 来查数据就会 ...

  8. Java基础学习(二)

    软件设计原则: 为了提高软件的开发效率,降低软件开发成本,一个优良的软件系统应该具有以下特点: 1,可重用性:遵循DRY原则,减少软件中的重复代码. 2,可拓展性:当软件需要升级增加新的功能,能够在现 ...

  9. JavaEE HttpServlet 解析

    上一篇 文章中有提到,GenericServlet 是对 Servlet 的一个通用实现,并提供了一个抽象的 service() 方法.而我们的互联网是使用 Http 协议来通信的,那针对这个&quo ...

  10. 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障

    3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...