RabbitMQ集群搭建

rabbitmq集群是通过erlang的分布式特性进行rabbitmq集群,各个rabbitmq的服务为相应的节点,每个节点都提供给客户端连接,进行消息的发送与接收。

环境:CentOS 6.8 64位

服务器:192.168.179.128 wangwq01

192.168.179.129 wangwq02

192.168.179.130 wangwq03

1. 主机域名解析

rabbitmq各节点之间通信使用域名,所以集群成员中所有主机名都要可解析,这里使用修改hosts文件来实现解析。

2. 集群的几种实现方法及特性

    1)手动使用rabbitmqctl创建

    2)通过配置文件来列举出集群的节点

    3)使用rabbitmq-autocluster来实现(此为一个插件)

    4)使用rabbitmq-cluster来实现(这也是个插件)

集群可以动态构建与修改,即可以动态添加也可以动态脱离。集群中的节点可以随时关闭和启动,也可以允许个别节点出现故障,只要在整个集群中有正常节点即可。

节点可以是磁盘节点,也可以是内存节点,两者之间可以互换使用,一般情况都是磁盘节点,特殊情况下使用内存节点可用于提高队列、交换器或绑定的性能。

3. 设置cookie文件

rabbitmq集群的节点间是使用cookie来确认通信的,所以集群中的每个节点都必须有相同的erlang.cookie,同时保证文件权限是400且所属用户和组都一致

每个rabbitmq启动时,erlang会自动创建一个cookie文件,为了使每个节点的cookie保持一致,可以先让其中一个节点来创建,然后将这个文件拷贝到其他节点的相应位置。默认cookie文件位于/var/lib/rabbitmq/.erlang.cookie

例:192.168.179.130创建了cookie文件,在192.168.179.129上

cd /var/lib/rabbitmq/

如果已经有了该文件,则删除:

rm -rf .erlang.cookie
scp [email protected]:/var/lib/rabbitmq/.erlang.cookie ./

查看文件所属用户和组以及权限是否满足要求,不满足则修改,否则会报错:

Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces

chown rabbitmq:rabbitmq .erlang.cookie
chmod 400 .erlang.cookie

4. 启动单个节点

运行命令:

rabbitmq-server -detached

可能会出错:ERROR: node with name "rabbit" already running on "hostname"

这是因为已经有一个运行的rabbitmq进程,停止即可:

ps aux|grep rabbitmq
kill -15 PID

然后再次运行启动命令。

这三个独立的节点可以通过如下命令来验证:

rabbitmqctl cluster_status

会看到:

Cluster status of node [email protected] ...

[{nodes,[{disc,[[email protected]]}]},

{running_nodes,[[email protected]]},

{cluster_name,<<"[email protected]">>},

{partitions,[]},

{alarms,[{[email protected],[]}]}]


5. 创建集群

要把单独的节点构建到一个集群中,可以暂定其中一个节点为集群中的第一个节点。然后依次将别的节点加入到集群中(只要是已经成为集群中的节点,其他节点就可以通过该节点加入)。举如下例子:

可以暂定[email protected]为集群的第一个节点,先将[email protected]加入到[email protected]的集群中,加入之前必须先停止rabbit02的rabbitmq应用程序,加入之后再启动,然后[email protected]可以通过[email protected]加入,也可通过[email protected]加入集群。

在[email protected]上:

rabbitmqctl stop_app
rabbitmqctl join_cluster [email protected]
rabbitmqctl start_app

加入过程中可能会遇到错误,如:Error: unable to connect to nodes [[email protected]]: nodedown  这是因为端口未开通导致无法连接到主机,可能是iptables没有设置或者设置不当。

注:加入集群时有两种不同的节点类型:磁盘节点和内存节点。一个集群中至少要有一个磁盘节点,当有节点加入或者离开时,必须要将变更通知到至少一个磁盘节点。如果集群中只有一个磁盘节点或者只剩一个磁盘节点可用,这个磁盘节点崩溃之后,集群扔可保持运行,但无法进行其他操作(增删改查),直到节点恢复。所以集群中最好设置两个或以上的磁盘节点。

默认创建的为磁盘节点,创建内存节点只需要加一个参数[--ram]:

rabbitmqctl join_cluster --ram [email protected]

改变节点类型,如将内存节点更改为磁盘节点:

rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc
rabbitmqctl start_app

如果是开启iptables的,添加如上端口的规则:

vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4369 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 25672 -j ACCEPT
:wq保存退出
/etc/init.d/iptables restart

这样[email protected]加加入到集群中了,可以通过cluster_status命令查看:

rabbitmqctl 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],[]}]}]

在[email protected]上也可查看到相同的信息。

然后将[email protected]加入到集群,这时它既可以选择通过[email protected]来加入,也可以选择[email protected]来加入,因为01和02都是集群的成员了。

在[email protected]上:

rabbitmqctl stop_app
rabbitmqctl join_cluster [email protected]
rabbitmqctl start_app

在三个节点上分别使用cluster_status命令查看,可看到三个节点都在集群里了。

修改集群的名字:

rabbitmqctl set_cluster_name new_mqname

6. 重启集群节点

加入到集群中的节点,任何时候都允许停止,剩余的节点不受影响继续工作,重新启动停止的节点会再次自动工作

如:停止[email protected]

在rabbit01上:

rabbitmqctl stop

然后在集群的某个节点中查看:

rabbitmqctl 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],[]}]}]

可看到运行的节点中少了[email protected],再次启动rabbit01

rabbitmq-server -detached
rabbitmqctl cluster_status

Cluster status of node [email protected] rabbit01 ...

[{nodes,[{disc,[[email protected] rabbit01,[email protected] rabbit02,[email protected] rabbit03]}]},

{running_nodes,[[email protected] rabbit02,[email protected] rabbit03,[email protected] rabbit01]},

{cluster_name,<<"[email protected]">>},

{partitions,[]},

{alarms,[{[email protected] rabbit02,[]},{[email protected] rabbit03,[]},{[email protected] rabbit01,[]}]}]

注意:

1. 当整个集群关闭时,最后一个关闭的节点必须要在下次第一个启动,否则,节点会等待最后一个磁盘节点30s来确认重新连接,连接不到就会失败。如果最后一个关闭的节点无法恢复,可以使用以下命令从集群中删除:

rabbitmqctl forget_cluster_node

2. 如果所有节点都在同一时间关闭(如断电的情况),这会让所有节点都认为其他节点在自己之后,这种情况时,可以在其中的一个节点上执行以下命令使其成为可启动的:

rabbitmqctl force_boot

7. 脱离集群

要删除集群中的节点,首先要停止rabbitmq应用程序,然后重设节点,完成之后再次启动。删除后的节点又会变为独立的节点。

例:将[email protected]从节点中删除

a. 在本节点删除

在rabbit03上:

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

然后在节点上执行cluster_status命令来确认是否成功

在rabbit01上:

rabbitmqctl 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],[]}]}]

在rabbit03上查看:

rabbitmqctl cluster_status

Cluster status of node [email protected] ...

[{nodes,[{disc,[[email protected]]}]},

{running_nodes,[[email protected]]},

{cluster_name,<<"[email protected]">>},

{partitions,[]},

{alarms,[{[email protected],[]}]}]

b. 远程删除

如在rabbit02上删除rabbit03(依然要先停止应用程序)

在rabbit03上停止:

rabbitmqctl stop_app

在rabbit02上删除:

rabbitmqctl forget_cluster_node [email protected]

这时集群中已经将rabbit03删除了,但是rabbit03本身还不知道,依然认为自己是集群中的一员,所以启动时会报错:

Error description:

{error,{inconsistent_cluster,"Node [email protected] thinks it‘s clustered with node [email protected], but [email protected] disagrees"}}

想要让rabbit03再次成为单独可使用的节点,需要进行重置。

在rabbit03上:

rabbitmqctl reset

然后再次启动:

rabbitmqctl start_app
时间: 2024-10-09 12:13:31

RabbitMQ集群搭建的相关文章

RabbitMq 集群搭建

? ? 实验环境: 操作系统为 Centos 7.2 IP hostName 192.168.190.132 node132 192.168.190.139 node139 192.168.190.140 node140 ? ? RabbitMQ相关端口 ? ? 4369 (epmd) 5672, 5671 (AMQP 0-9-1 and 1.0 without and with TLS) 25672. This port used by Erlang distribution for inte

rabbitmq集群搭建(centos6.5)

一:rabbitmq的安装: 参考:http://www.blogjava.net/hellxoul/archive/2014/06/25/415135.html http://blog.haohtml.com/archives/15249 说明:修改机器名字后再安装(为后面集群做准备) vi /etc/sysconfig/network 修改名字 vi /etc/hosts 修改地址映射表,如192.168.1.112   rabbitmq-node1.com rabbitmq-node1 #

rabbitmq集群搭建方法简介(测试机linux centos)【转】

本文将介绍四台机器搭建rabbitmq集群: rabbitmq IP和主机名(每台机器已安装RabbitMQ 3.5.6, Erlang 18.1) 192.168.87.73 localhost73 192.168.87.74 localhost74 192.168.87.75 localhost75 192.168.87.76 localhost76 将上述IP和主机名添加到hosts文件( vim /etc/hosts) Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先

rabbitmq 集群搭建 单机多实例版

rabbitmq 是一个开源的AMQP实现,用ERLANG编写,由于erlang天生支持分布式高并发的语言,这也是rabbitmq被许多开发者所喜爱. AMQP概念,这里不做介绍,可以google一下,概念很重要,概念很重要,概念很重要,重要的事说三遍. 下面开始集群搭建,rabbitmq集群分为单机,伪集群(单机多实例),集群(多机多实例),很多开发者想自己搭建一个集群,来测试一些mq特性. 本文主要介绍伪集群方式,也就是在一台虚拟机上,搭建rabbitmq多实例,然后建立集群连接.而正规集群

02: rabbitmq - 集群搭建

RabbitMQ-集群 回到正题,为什么搭建rabbitmq集群?rabbitmq集群有那些模式?如何搭建Rabbitmq集群?rabbitmq镜像高可用策略有那些? 设计集群的目的 允许消费者和生产者在 RabbitMQ 节点崩溃的情况下继续运行. 通过增加更多的节点来扩展消息通信的吞吐量. rabbitmq有3种模式  ------   但集群模式是2种 详细如下: 单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已.(上一遍就是单一模式) 普通模式:默认模式,以两个节点(ra

RabbitMQ的安装及集群搭建方法

RabbitMQ安装 1 安装erlang 下载地址:http://www.erlang.org/downloads 博主这里采用的是otp_src_19.1.tar.gz (200MB+) [[email protected] util]# tar zxvf otp_src_19.1.tar.gz [[email protected] util]# cd otp_src_19.1 [[email protected] otp_src_19.1]# ./configure --prefix=/o

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://

rabbitmq安装、集群搭建

rabbitmq的安装: CentOS上面部署: 首先修改hosts文件 修改hosts文件vi /etc/hosts1.1.1.1 hostname 2.2.2.2 hostname 3.3.3.3 hostname erlang的安装环境:rpm -i http://mirror.bjtu.edu.cn/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpmyum install erlang安装rabbitMQ(RPM链接可以从http://www

rabbitmq单点及集群搭建 与简单使用

单点搭建rabbitmq 安装epel源yum install -y epel-release.noarchyum clean all && yum makecache fast && yum repolist enabled安装依赖包yum install -y erlang xmlto wget 安装 wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.3/rabbitmq-server-3.5.3-1.