Rabbitmq cluster on centos7

来自linux中国网wiki
跳到导航 跳到搜索

Note

Note: 另外一个docker

Rabbitmq cluster on docker-compose

前提是rabbitmq安装

Centos7安装Rabbitmq

介绍

运行模式大概有3种:

单一模式:非集群模式,单台。

普通模式:RabbitMQ默认的集群模式。

对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。

所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。

该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。

如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化会丢失消息。

镜像模式:Queue同时存在多个节点,可通过改模式实现HA高可用 该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。

该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。


rabbitmq-server-3.7.7-1.el7

配置hosts文件

echo '192.168.0.202 mq01
192.168.0.202 mq02' >>/etc/hosts

hostnamectl --static  set-hostname mq01
hostnamectl --static  set-hostname mq02

#注意 这个格式是不对的 不能并列 只能有一个 
#192.168.0.201 master  zoo1
192.168.0.202   mq01
192.168.0.203   mq02

三台主机上安装的 RabbitMQ 都保证都可以正常启动,才可以进行以下操作

停止RabbitMQ 服务

systemctl stop rabbitmq-server 


拷贝erlang.cookie

#要先启动 不然没有cookie 文件 
systemctl start rabbitmq-server

 [root@node1 ~]cat /var/lib/rabbitmq/.erlang.cookie 
RDZZRBEWSOOIYHOABHTI
将cookie中的内容复制到mq02的cookie文件中。


这里将 node1 的该文件复制到 node2、node3,由于这个文件权限是 400为方便传输,先修改权限,非必须操作,所以需要先修改 node2、node3 中的该文件权限为 777
#这操作太low 
scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/

 chmod  400    /var/lib/rabbitmq/.erlang.cookie
  chown -R rabbitmq:rabbitmq  /var/lib/rabbitmq/.erlang.cookie

注意事项
cookie在所有节点上必须完全一样,同步时一定要注意。
erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败


启动rabbitmq服务

systemctl  restart   rabbitmq-server # on all  node 

在node2 mq02上停止rabbitmq应用程序,并重置(重置只是清除节点的配置,如果没有配置过,则可以省略),然后加入node1集群

[root@mq02 rabbitmq]# rabbitmqctl stop_app Stopping node rabbit@mq02 ...

reset节点 [root@mq02 rabbitmq]# rabbitmqctl reset Resetting node rabbit@mq02 ...


加入集群

[root@mq02 ~]# rabbitmqctl join_cluster rabbit@mq01 
Clustering node rabbit@mq02 with rabbit@mq01 ...

启动rabbitmq应用
[root@mq02 ~]# rabbitmqctl start_app
Starting node rabbit@mq02 ...


查看集群状态

node2上查看集群状态
rabbitmqctl cluster_status

[root@mq02 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq02 ...
[{nodes,[{disc,[rabbit@mq01,rabbit@mq02]}]},
 {running_nodes,[rabbit@mq01,rabbit@mq02]},
 {cluster_name,<<"rabbit@mq01">>},
 {partitions,[]},
 {alarms,[{rabbit@mq01,[]},{rabbit@mq02,[]}]}]


node1上查看集群状态
[root@mq01 ~]#  rabbitmqctl cluster_status
Cluster status of node rabbit@mq01 ...
[{nodes,[{disc,[rabbit@mq01,rabbit@mq02]}]},
 {running_nodes,[rabbit@mq02,rabbit@mq01]},
 {cluster_name,<<"rabbit@mq01">>},
 {partitions,[]},
 {alarms,[{rabbit@mq02,[]},{rabbit@mq01,[]}]}]

更改节点类型

节点有两种类型:磁盘节点和内存节点,集群中必须至少有一个磁盘节点,否则队列元数据无法写入到集群中,当磁盘节点宕掉时,集群将无法写入新的队列元数据信息。


从上面集群状态可以看出,mq01和mq02 均为磁盘节点,可以通过命令

还有很多好的 如下 URL

http://blog.51cto.com/zengestudy/1885054

运行各节点 rabbitmqctl stop

rabbitmq-server -detached 

other

组成集群
[root@mq01 ~] rabbitmqctl stop_app

[root@mq02 ~]# rabbitmqctl stop_app            # 停止rabbitmq服务
n[root@mq02 ~]# rabbitmqctl join_cluster rabbit@mq01    # node2和node1构成集群, node2必须能通过node1的主机名ping通
[root@mq02 ~]# rabbitmqctl start_app            # 开启rabbitmq服务



 
 查看日志
less /var/log/rabbitmq/[email protected] 
 
在node2 mq02上停止rabbitmq应用程序,并重置(重置只是清除节点的配置,如果没有配置过,则可以省略),然后加入node1集群
[root@mq02 rabbitmq]# rabbitmqctl stop_app #
Stopping node rabbit@mq02 ...

reset节点

[root@mq02 rabbitmq]# rabbitmqctl reset
Resetting node rabbit@mq02 ... 

trouble shooting

rabbitmqctl reset

23:49:15.657 [error] Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces


see also

good-RabbitMQ集群创建

CentOs7.3 搭建 RabbitMQ 3.6 Cluster 集群服务与使用

RabbitMQ集群搭建

RabbitMQ 源码 集群安装

RabbitMQ集群和高可用配置

RabbitMQ启动脚本

消息队列之 RabbitMQ

Rabbitmq集群高可用部署详细good

RabbitMQ HA集群搭建

高可用 RabbitMQ 集群自动化部署解决方案

RabbitMQ两种集群模式配置管理(五)

Rabbitmq集群搭建笔记

rabbitmq集群搭建(多机)



Rabbitmq镜像集群部署

docker 不要的了

RabbitMQ:Docker环境下搭建rabbitmq集群


docker搭建rabbitmq集群 has elk reis zk elk etc

Docker:搭建RabbitMQ集群