RabbitMQ入门教程(十四):RabbitMQ单机集群搭建

原文:RabbitMQ入门教程(十四):RabbitMQ单机集群搭建

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/vbirdbest/article/details/78723467

分享一个朋友的人工智能教程。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。

集群简介

理解集群先理解一下元数据

  • 队列元数据:队列的名称和声明队列时设置的属性(是否持久化、是否自动删除、队列所属的节点)
  • 交换机元数据:交换机的名称、类型、属性(是否持久化等)
  • 绑定元数据:一张简单的表格展示了如何将消息路由到队列。包含的列有 交换机名称、交换机类型、路由键、队列名称等
  • vhost元数据:为vhost内队列、交换机和绑定提供命名空间和安全属性

一个队列的完整内容包括队列的元数据和队列的内容

绑定表类似于下图

单节点RabbitMQ

Rabbit集群的四种方式:单主集群、普通集群、镜像集群、主从集群

Erlang的集群是通过Erlang cookie(.erlang.cookie文件)的方式来允许互相通信

  • 单机集群:就是在一台物理机器上启动多个节点,每个节点作为作为集群的一部分。此种方式只适合在学习的时候玩一下,或者在验证在生产环境中出现特殊情况的现象,在实际情况下不会使用单机集群,因为如果服务器宕机了整个服务器将完全不能再使用。
  • 普通集群:这里指的每台物理机器作为一个节点,此种模式消息只存在其中一个节点上,集群中的其他节点仅有相同的元数据(即队列元数据),当拥有消息的节点宕机了,那么其他节点就无法获取故障节点中尚未消费的消息,如果故障节点使用了持久化,那只能等故障节点恢复后才能从该节点上的队列进行消费,如果没有持久化,那么所有消息将丢失。例如消费者A连接到节点1,但是队列内容并不在节点1上,可以通过消费者所消费的队列找到该队里所在的节点,然后从该节点上获取消息,返回给消费者。

  • 镜像集群:与普通集群不同,镜像集群会把对垒结构和消息都同步到每个节点。该模式的好处就是随便连接到哪个节点都能获取到消息,坏处是,当队列数量很多,消息也很多的时候,集群内部的网络带宽将会被这种同步通讯大量的消耗掉,此种模式用于可靠性要求较高的场合中。
  • 主从集群warren: 是指一对主备独立服务器,并设置一台负载均衡器来处理故障转移,使用HAproxy设置备用服务器很简单,使用backup来标记一下,只有当主服务器不可用时才使用备用服务器。
// 每5秒对服务器进行健康检查,后台服务器失败3次之后被认为不可用,也就是15秒后消费者会连接到备用服务器
server rabbit   127.0.0.1:5672 check inter 5000 rise 2 fall 3
server rabbit1  127.0.0.1:5673 backup check inter 5000 rise 2 fall 3 


  • 1
  • 2
  • 3



内存节点RAM和磁盘节点disk

  • 内存节点:将所有的队列、交换机、绑定、用户、权限、vhost的元数据都存储在内存中 。内存节点更快
  • 磁盘节点:将数据存放在磁盘上。磁盘节点需要保存集群的配置信息

单节点系统只允许磁盘节点,否则每次重启所有数据将会丢失。 一个集群至少有一个节点是磁盘节点,其他节点可以都是内存节点,当节点加入或者离开集群时都要将变更通知到至少一个磁盘节点。实际使用时至少要两个磁盘节点,原因是如果只有一个磁盘节点,恰巧磁盘节点崩溃了,那么RabbitMQ将不能创建队列、创建交换机、创建绑定、添加用户、更改权限、添加或删除节点等操作,可以正常的发布和消费消息。 在实际使用经常将集群的配置放到磁盘节点上来保存。


单机集群搭建详细步骤


第一步:为每个节点配置节点名称和端口号

  • 配置第一个节点
// 启动第一个节点,节点名称为[email protected]
// MacOSX是我的机器名,这里可以改成自己的机器名或者用localhost
RABBITMQ_NODE_PORT=5672 [email protected] rabbitmq-server


  • 1
  • 2
  • 3

  • 配置第二个节点
// 启动第二个节点, 节点名称为[email protected],这里使用-detached后台模式启动
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}] -rabbitmq_stomp tcp_listeners [61614] -rabbitmq_mqtt  tcp_listeners [1884]" RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached


  • 1
  • 2

  • 配置第三个节点
// 启动第三个节点,节点名称为[email protected]
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}] -rabbitmq_stomp tcp_listeners [61615] -rabbitmq_mqtt tcp_listeners [1885]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached


  • 1
  • 2

  • 所有节点启动成功后可以登录RabbitMQ Management看一下

第二步:将rabbit1加入到rabbit中

// 加入集群时可以指定是磁盘模式还是内存模式,默认是disk,可以通过--ram来指定
rabbitmqctl -n [email protected] stop_app
rabbitmqctl -n [email protected] reset
rabbitmqctl -n [email protected] join_cluster [email protected]
rabbitmqctl -n [email protected] start_app


  • 1
  • 2
  • 3
  • 4
  • 5

// 查看指定节点的状态
rabbitmqctl status -n rabbit1


  • 1
  • 2

第三步:将rabbit2加入到rabbit中

rabbitmqctl -n [email protected] stop_app
rabbitmqctl -n [email protected] reset
rabbitmqctl -n [email protected] join_cluster [email protected] --ram
rabbitmqctl -n [email protected] start_app

// 查看集群的状态
rabbitmqctl cluster_status -n [email protected]


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

参考文章: http://www.zhimengzhe.com/mac/333192.html



HAProxy负载均衡

1. 安装

brew install haproxy 

// 查看haproxy版本
haproxy -version


  • 1
  • 2
  • 3
  • 4

2. 配置haproxy.cfg

在usr/local/Cellar/haproxy/目录下创建haproxy.cfg文件,并进行配置( 如果要使用warren方式,要配置成主备模式只需要在备用服务器上使用backup标记一下即可)

global
	log 127.0.0.1 local0 info #[日志输出配置,所有日志都记录在本机,通过local0输出]
	maxconn 4096 #默认最大连接数,需考虑ulimit-n限制

defaults	# 默认负载均衡配置
	log global
	mode tcp #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
	option tcplog
	option dontlognull  	#不记录健康检查日志信息
	retries 3 				#三次连接失败就认为是服务器不可用,也可以通过后面设置
	option abortonclose 	#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
	maxconn 2000 			#默认的最大连接数
	timeout connect 5000ms  #连接超时
	timeout client 12000ms  #客户端超时
	timeout server 12000ms  #服务器超时

listen rabbitmq_local_cluster
	mode tcp
	bind 127.0.0.1:5670  # 前端IP, 供消费者和生产者使用
	balance roundrobin 	 # 负载均衡方式, 轮询方式
	server rabbit   127.0.0.1:5672 check inter 5000 rise 2 fall 3
	server rabbit1  127.0.0.1:5673 check inter 5000 rise 2 fall 3
	server rabbit2  127.0.0.1:5674 check inter 5000 rise 2 fall 3

# 数据统计页面
listen private_monitoring
	mode http
	bind 127.0.0.1:8100
	option httplog
	stats enable
	stats uri /stats
	stats refresh 5s


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

3. 启动HAProxy

/usr/local/Cellar/haproxy/1.8.1/bin/haproxy -f /usr/local/Cellar/haproxy/haproxy.cfg


  • 1

4. 访问数据统计页面http://localhost:8100/stats

public class Consumer1 {
    @Test
    public void testBasicConsumer1() throws Exception{
        ConnectionFactory factory = new ConnectionFactory();
        factory.setVirtualHost("/");
        // ip和port为HAProxy的地址和端口
        factory.setHost("127.0.0.1");
        factory.setPort(5670);
        factory.setUsername("guest");
        factory.setPassword("guest");

        Connection connection = factory.newConnection();
        final Channel channel = connection.createChannel();
        String EXCHANGE_NAME = "exchange.direct";
        String QUEUE_NAME = "queue_name";
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "key");

        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println(message);

            }
        };

        channel.basicConsume(QUEUE_NAME, true, consumer);
        Thread.sleep(100000);
    }
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

常见错误

在集群中,在使用rabbitmqctl命令时经常会报错,在使用rabbitmqctl命令时,首先会启动erlang集群,而erlang集群需要保证.erlang.cookie内容保持一致,此时如果cookie不一致,会导致rabbitmqctl命令报错;rabbitmqctl还会启动erlang的mnesia数据库,而数据在启动时会查找一个和主机名相同的schema, 所以要保证这个schema的名字和当前主机名字保持一致,如果不一致mnesia数据库就启动不起来,就会导致rabbitmqctl报错,所以解决rabbitmqctl报错可以从两方面入手,一是cookie值是否相同,二是主机名是否和mnesia的schema是否相同。

  • Error: unable to connect to node [email protected]: nodedown
  • ERROR: node with name “rabbit” already running on “localhost”

首先检查cookie值是否相同:首先确认一下报错时会显示cookie hash:xxxxx的值是否和~/.erlang.cookie文件中的内容是否一致,如果不一致将报错提示的cookie hash值覆盖掉~/.erlang.cookie的内容,注意.erlang.cookie可能没有修改权限,需要先修改一下文件的权限chmod 777 .erlang.cookie (我就是用这种方式解决的)。

检查主机名是否和mnesia中的schema的名字是否一致,注意查看/usr/local/var/log/rabbitmq/[email protected]<.log 这个日志文件,日志中会打印启动的一些参数,如mnesia的目录位置,我的位置是/usr/local/var/lib/rabbitmq/mnesia/[email protected],如果不一致,将自己机器的主机名改成mnesia中的名字,好像直接删除mnesia中子目录的所有文件也能解决问题, 在rabbitmq-env.conf中发现了一个配置节点名字的配置[email protected] , 在使用rabbitmqctl命令时经常报主机名称不匹配,估计和这有很大的关系。在单机模式下建立集群,建议别使用主机名了,使用localhost代替主机名,估计会减少问题的发生。

rabbitmq启动日志

=INFO REPORT==== 5-Dec-2017::18:13:24 ===
node           : [email protected]
home dir       : /Users/mengday
config file(s) : /usr/local/etc/rabbitmq/rabbitmq.config
cookie hash    : 00v11sjZSBSIWTJU/BkuFg==
log            : /usr/local/var/log/rabbitmq/[email protected]
sasl log       : /usr/local/var/log/rabbitmq/[email protected]
database dir   : /usr/local/var/lib/rabbitmq/mnesia/[email protected]


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
[email protected]:
  * connected to epmd (port 4369) on localhost
  * epmd reports node ‘rabbit‘ running on port 25672
  * TCP connection succeeded but Erlang distribution failed

  * Hostname mismatch: node "[email protected]" believes its host is different. Please ensure that hostnames resolve the same way locally and on "[email protected]"


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其他网上找到的答案有人说重启一下就好了,可以试一下,并不好使

// 方式一
rabbitmq-server stop
rabbitmq-server start


  • 1
  • 2
  • 3
// 方式二
ps ax | grep rabbit
kill -9 PID


  • 1
  • 2
  • 3
  • {error,“Cookie file /Users/mengday/.erlang.cookie must be accessible by owner only”}

该错是由于.erlang.cookie权限的原因造成的,需要修改权限chmod 400 .erlang.cookie


分享一个朋友的人工智能教程。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。

我的微信公众号:

原文地址:https://www.cnblogs.com/lonelyxmas/p/11865818.html

时间: 2024-11-10 08:24:31

RabbitMQ入门教程(十四):RabbitMQ单机集群搭建的相关文章

RabbitMQ入门教程(十五):普通集群和镜像集群

原文:RabbitMQ入门教程(十五):普通集群和镜像集群 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78740346 分享一个朋友的人工智能教程(请以"右键"->"在新标签页中打开连接"的方式访问).比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 普通集群 推荐一篇优秀的文章: RabbitM

RabbitMQ入门教程(十六):RabbitMQ与Spring集成

原文:RabbitMQ入门教程(十六):RabbitMQ与Spring集成 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78805591 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 简介 集成示例基本目录结构 一:引入相关依赖 引入Spring核心的依赖和spring-rabbit依赖,注意sprin

RabbitMQ入门教程(十):队列声明queueDeclare

原文:RabbitMQ入门教程(十):队列声明queueDeclare 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78670550 分享一个朋友的人工智能教程(请以"右键"->"在新标签页中打开连接"的方式访问).比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 简介 本节主要讨论队列声明的各个参

无废话ExtJs 入门教程十四[文本编辑器:Editor]

无废话ExtJs 入门教程十四[文本编辑器:Editor] extjs技术交流,欢迎加群(201926085) ExtJs自带的编辑器没有图片上传的功能,大部分时候能够满足我们的需要. 但有时候这个功能还是需要的.我在这里对keeditor进行了整合. 首先要下载keeditor和上传时需要引用的LitJson.dll.由于ke的版本不同,我这里提供的下载文件只适用于当前整合代码,供参考. 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML

Hadoop学习之路(四)Hadoop集群搭建和简单应用

概念了解 主从结构:在一个集群中,会有部分节点充当主服务器的角色,其他服务器都是从服务器的角色,当前这种架构模式叫做主从结构. 主从结构分类: 1.一主多从 2.多主多从 Hadoop中的HDFS和YARN都是主从结构,主从结构中的主节点和从节点有多重概念方式: 1.主节点 从节点 2.master slave 3.管理者 工作者 4.leader follower Hadoop集群中各个角色的名称: 服务 主节点 从节点 HDFS NameNode DataNode YARN Resource

高可用mongodb集群的学习记录(四mongodb分片集群搭建)

无论oracle还是mysql数据库都有分区的概念,即同一张表物理上不在同一台机器上,有效缓解了表都集中存在一台机器的压力.当然,mongodb也有类似的机制,即是分片.具体理论知识大家可以参考网上文档,我这里只记录下具体操作步骤 参考网络上一个图.我选用的是2个副本集+1个仲裁.实际上我这里分片集群需要3个mongos,3个config server,数据分片3个shard server,对应着还有3个副本,3个仲裁节点,总共需要15个实例.因为我资源确实紧张,又不想影响实验效果.冥思苦想了一

Hadoop全分布式集群搭建(详细)

一.准备物理集群.1.物理集群搭建方式.采用搭建3台虚拟机的方式来部署3个节点的物理集群.2.虚拟机准备.准备一个已近建好的虚拟机进行克隆.(建议为没进行过任何操作的)在要选择克隆的虚拟机上右击鼠标,管理,克隆.在弹出对话框中进行以下操作.(1).下一步.(2).选择虚拟机中的当前状态,下一步. (3).选择创建完整克隆,下一步.(4).输入虚拟机名称,下一步.(5).克隆完成.(6).按照上述步骤再创建一个虚拟机名称为slave02的.3.虚拟机网络配置.由于slave01和slave02虚拟

RabbitMQ入门教程(四):工作队列(Work Queues)

原文:RabbitMQ入门教程(四):工作队列(Work Queues) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78596426 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 工作队列 使用工作队列实现任务分发的功能,一个队列的优点就是很容易处理并行化的工作能力,但是如果我们积累了大量的工作,我们

RabbitMQ入门教程(十一):消息属性Properties

原文:RabbitMQ入门教程(十一):消息属性Properties 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78698364 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 简介 发送消息可以为消息指定一些参数 Delivery mode: 是否持久化,1 - Non-persistent,2 -