Rabbitmq 相关介绍之单机集群配置

一、说明:

说到集群,大家应该都不陌生,为了提高性能需要配置集群,而在有的时候,我们需要在测试环境先测试然后灰度上线,所以这里介绍在一台服务器上配置rabbitmq集群

二、rabbitmq集群模式

1、普通模式:rabbitmq默认的集群模式

RabbitMQ集群中节点包括内存节点、磁盘节点。内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘上。如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。那么内存节点的性能只能体现在资源管理上,比如增加或删除队列(queue),虚拟主机(vrtual hosts),交换机(exchange)等,发送和接受message速度同磁盘节点一样。一个集群至少要有一个磁盘节点。一个rabbitmq集群中可以共享user,vhost,exchange等,所有的数据和状态都是必须在所有节点上复制的,对于queue根据集群模式不同,应该有不同的表现。在集群模式下只要有任何一个节点能够工作,RabbitMQ集群对外就能提供服务。

默认的集群模式,queue创建之后,如果没有其它policy,则queue就会按照普通模式集群。对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构,但队列的元数据仅保存有一份,即创建该队列的rabbitmq节点(A节点),当A节点宕机,你可以去其B节点查看,./rabbitmqctl list_queues发现该队列已经丢失,但声明的exchange还存在。

当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer,所以consumer应平均连接每一个节点,从中取消息。该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。如果做了队列持久化或消息持久化,那么得等A节点恢复,然后才可被消费,并且在A节点恢复之前其它节点不能再创建A节点已经创建过的持久队列;如果没有持久化的话,消息就会失丢。这种模式更适合非持久化队列,只有该队列是非持久的,客户端才能重新连接到集群里的其他节点,并重新创建队列。假如该队列是持久化的,那么唯一办法是将故障节点恢复起来。

为什么RabbitMQ不将队列复制到集群里每个节点呢?这与它的集群的设计本意相冲突,集群的设计目的就是增加更多节点时,能线性的增加性能(CPU、内存)和容量(内存、磁盘)。当然RabbitMQ新版本集群也支持队列复制(有个选项可以配置)。比如在有五个节点的集群里,可以指定某个队列的内容在2个节点上进行存储,从而在性能与高可用性之间取得一个平衡(应该就是指镜像模式)。

2、镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案

该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置policy,然后客户端创建队列的时候,rabbitmq集群根据“队列名称”自动设置是普通集群模式或镜像队列。具体如下:

队列通过策略来使能镜像。策略能在任何时刻改变,rabbitmq队列也近可能的将队列随着策略变化而变化;非镜像队列和镜像队列之间是有区别的,前者缺乏额外的镜像基础设施,没有任何slave,因此会运行得更快。

为了使队列称为镜像队列,你将会创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下面表格说明这些key的选项,如下图:

以上概念参考地址:http://www.ywnds.com/?p=4741

三、普通集群模式安装配置

官方文档https://www.rabbitmq.com/clustering.html

1、环境
CentOS 6.7    IP 172.16.100.94   x86_64
2、软件包版本:
erlang-20.0.4-1.el6.x86_64.rpm
rabbitmq-server-3.6.12-1.el6.noarch.rpm
3、安装
#rpm -ivh  erlang-20.0.4-1.el6.x86_64.rpm
#yum install socat  -y   # rabbitmq-server依赖次软件包
#rpm -ivh rabbitmq-server-3.6.12-1.el6.noarch.rpm
4、启动3个进程(模拟3台不同的node)
#RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit1 /etc/init.d/rabbitmq-server start 
#RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit2 /etc/init.d/rabbitmq-server start 
#RABBITMQ_NODE_PORT=5674 RABBITMQ_NODENAME=rabbit3 /etc/init.d/rabbitmq-server start 
查看启动情况
#netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name     
tcp        0      0 0.0.0.0:25672               0.0.0.0:*                   LISTEN      25527/beam.smp      
tcp        0      0 0.0.0.0:25673               0.0.0.0:*                   LISTEN      26425/beam.smp            
tcp        0      0 0.0.0.0:25674               0.0.0.0:*                   LISTEN      27310/beam.smp      
tcp        0      0 0.0.0.0:4369                0.0.0.0:*                   LISTEN      25191/epmd                 
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1778/sshd                          
tcp        0      0 :::5672                     :::*                        LISTEN      25527/beam.smp      
tcp        0      0 :::5673                     :::*                        LISTEN      26425/beam.smp      
tcp        0      0 :::5674                     :::*                        LISTEN      27310/beam.smp               
tcp        0      0 :::4369                     :::*                        LISTEN      25191/epmd          
tcp        0      0 :::22                       :::*                        LISTEN      1778/sshd  
5、结束进程命令
#rabbitmqctl -n rabbit1 stop
#rabbitmqctl -n rabbit2 stop
#rabbitmqctl -n rabbit3 stop
6、查看状态:
#rabbitmqctl -n rabbit1 cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected]]}]},
 {running_nodes,[[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{[email protected],[]}]}]
#rabbitmqctl -n rabbit2 cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected]]}]},
 {running_nodes,[[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{[email protected],[]}]}]
#rabbitmqctl -n rabbit3 cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected]]}]},
 {running_nodes,[[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{[email protected],[]}]}]
7、开始配置
停掉rabbit2节点的应用
#rabbitmqctl -n rabbit2 stop_app
Stopping rabbit application on node [email protected]
将rabbit2节点加入到[email protected]
#rabbitmqctl -n rabbit2 join_cluster [email protected]
Clustering node [email protected] with [email protected]
启动rabbit2应用节点
#rabbitmqctl -n rabbit2 start_app
Starting node [email protected]st
查看集群状态
#rabbitmqctl -n rabbit1 cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected],[email protected]]}]},
 {running_nodes,[[email protected],[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{[email protected],[]},{[email protected],[]}]}]
 
#rabbitmqctl -n rabbit2 cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected],[email protected]]}]},
 {running_nodes,[[email protected],[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{[email protected],[]},{[email protected],[]}]}]
可以看到不管是以哪一个节点的身份去查,集群中都有节点rabbit1和rabbit2
#############################################3
现在加入rabbit3
首先停掉rebbit3节点的应用
# rabbitmqctl -n rabbit3 stop_app
Stopping rabbit application on node [email protected]

# rabbitmqctl -n rabbit3 join_cluster [email protected]
Clustering node [email protected] with [email protected]
启动
# rabbitmqctl -n rabbit3 start_app
Starting node [email protected]
查看集群状态
#rabbitmqctl -n rabbit1 cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected],[email protected],[email protected]]}]},
 {running_nodes,[[email protected],[email protected],[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{[email protected],[]},
          {[email protected],[]},
          {[email protected],[]}]}]
注:已经加入群集的节点可以随时停止,并且宕机对集群来说也是没事的,在这两种情况下,集群的其
余部分继续运行不受影响,并且节点在重新启动时会自动“赶上”其他集群节点。

四、对集群进行测试:

我们假设关闭rabbit1和rabbit3,在每一个步骤检查集群状态
1、关闭rabbit1节点
#rabbitmqctl -n rabbit1 stop             
Stopping and halting node [email protected]
2、查看集群状态
# rabbitmqctl -n rabbit2 cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected],[email protected],[email protected]]}]},
 {running_nodes,[[email protected],[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{[email protected],[]},{[email protected],[]}]}]    
可以看到rabbit1节点已经不再running_noeds中了,但是依然在disc列表!
#rabbitmqctl -n rabbit3 cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected],[email protected],[email protected]]}]},
 {running_nodes,[[email protected],[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{[email protected],[]},{[email protected],[]}]}]
############################################################
# rabbitmqctl -n rabbit3 stop    #关闭rabbit3 节点
Stopping and halting node [email protected]
3、查看集群状态
# rabbitmqctl -n rabbit2 cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected],[email protected],[email protected]]}]},
 {running_nodes,[[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{[email protected]lhost,[]}]}]
4、现在开启关闭的节点rabbit1 和rabbit3 
#RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit1 /etc/init.d/rabbitmq-server start
#RABBITMQ_NODE_PORT=5674 RABBITMQ_NODENAME=rabbit3 /etc/init.d/rabbitmq-server start

5、再查看集群状态
#rabbitmqctl -n rabbit1 cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected],[email protected],[email protected]]}]},
 {running_nodes,[[email protected],[email protected],[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{[email protected],[]},
          {[email protected],[]},
          {[email protected],[]}]}]
可以看到3个节点都已经是running状态了。
一些注意事项:
当整个群集被关闭时,最后一个节点必须是要联机的第一个节点。如果没有发生这种情况,节点将等待
30秒钟,最后一个disc节点重新联机,之后会失败。如果最后一个要脱机的节点无法恢复,则可以使用
forget_cluster_node命令将其从集群中删除。如果所有群集节点都以同时和不受控制的方式停止
(例如断电),你可以留下一种情况,所有的节点都认为一些其他节点在它们之后停止,在这种情况下
您可以在一个节点上使用force_boot命令,使其再次可引导。
6、为rabbit1节点添加用户名
#rabbitmqctl -n rabbit1 add_user admin admin123
#rabbitmqctl -n rabbit1 set_user_tags admin administrator
#rabbitmqctl -n rabbit1 set_permissions -p / admin  ".*" ".*" ".*"
7、开启web管理界面
#rabbitmq-plugins -n rabbit1 enable rabbitmq_management   #会开启15672端口
在浏览器访问  输入第6步设置的用户名和密码,界面如下:

注:rabbit2和rabbit3之所以是黄色状态,红色小箭头也解释了。因为我们是在一台服务器模拟的3个节点,rabbitmq_management界面启动之后,端口是15672,只启动了一个,再启动rabbit2的时候,提示端口被占用,目前不知道如何为管理界面指定不同的端口,后面会继续研究……

时间: 2024-11-05 15:37:17

Rabbitmq 相关介绍之单机集群配置的相关文章

Rabbitmq 相关介绍之单机镜像模式集群配置

一.镜像模式集群简介 如果RabbitMQ集群只有一个broker节点,那么该节点的失效将导致整个服务临时性的不可用,并且可能会导致message的丢失(尤其是在非持久化message存储于非持久化queue中的时候).当然可以将所有的publish的message都设置为持久化的,并且使用持久化的queue,但是这样仍然无法避免由于缓存导致的问题:因为message在发送之后和被写入磁盘并执行fsync之间存在一个虽然短暂但是会产生问题的时间窗.通过publisher的confirm机制能够确

RabbitMQ(消息队列)集群配置与使用篇

介绍 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过 队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求.其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等. MQ特点 MQ是消费-生产者模型的一个典型

hadoop 3.1.1 单机集群配置/启动问题时的问题处理

一.修改配置文件(hadoop目录/etc/hadoop/配置文件) 1.修改hadoop-env.sh,指定JAVA_HOME 修改完毕后 2.修改core-site.xml 1 <configuration> 2 <!-- 指定hdfs namenode的缺省路径,可以是ip,也可以是主机名 --> 3 <property> 4 <name>fs.tmp.dir</name> 5 <value>/hadoop/tmp</va

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

原文:RabbitMQ入门教程(十四):RabbitMQ单机集群搭建 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78723467 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 集群简介 理解集群先理解一下元数据 队列元数据:队列的名称和声明队列时设置的属性(是否持久化.是否自动删除.队列所属的节点)

RabbitMQ集群配置

RabbitMQ的集群节点包括内存节点.磁盘节点.顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘.如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘. 普通模式: 对于queue来说,message data只存在于集群中的一个节点上,而message metadata则存在于集群中的所有节点.当message进入A节点的queue后,consumer从B节点拉去时,rabbitmq会临时在A.B之间进行消息传输,把A中的message data取出

CentOS+rabbitMQ集群配置

1.实验环境 rabbitmq-node1.com192.168.1.112 rabbitmq-node2.com192.168.1.113 rabbitmq-node3.com192.168.1.128 2.配置前检查同步时间 #ntpdate pool.ntp.org 3.注意一定要修改hosts #cat /etc/hosts 192.168.1.112   rabbitmq-node1.com rabbitmq-node1 192.168.1.113   rabbitmq-node2.c

LVS集群配置之LVS介绍

首先,先来介绍下LVS集群 LVS集群组成 前端:负载均衡层 –       由一台或多台负载调度器构成 中间:服务器群组层 –       由一组实际运行应用服务的服务器组成 底端:数据共享存储层 –       提供共享存储空间的存储区域 LVS术语 Director Server:调度服务器,将负载分发到Real Server的服务器 Real Server:真实服务器,真正提供应用服务的服务器 VIP:虚拟IP地址,公布给用户访问的IP地址 RIP:真实IP地址,集群节点上使用的IP地址

RabbitMq 集群配置

1. RabbitMQ 所需的附属安装包 1.1  openGL安装 执行命令: [[email protected] local]# yum install mesa-libGL-devel mesa-libGLU-devel freeglut-devel gcc glibc-devel make ncurses-devel openssl-devel autoconf xmlto libtool automake -y  1.2  erlang 安装   下载 erlang  http://

Ubuntu 下 rabbitmq集群配置

1,执行在host文件中配置主名字 192.168.1.21 <span style="font-family: Arial, Helvetica, sans-serif;">platform-api1</span> 192.168.1.22 <span style="font-family: Arial, Helvetica, sans-serif;">platform-api2</span> 2,分别启动21,22