您的位置:首页 > 其它

RabbitMQ集群搭建

2017-12-12 18:35 253 查看

一. 搭建MQ

这里选用三台主机,主机名分别是name1, name2 , name3

搭建教程请参考:Linux Rabbit搭建教程

二. 设置cookie

RabbitMQ集群是通过erlang通信的,要保证每个节点的cookie是相同的。

读取其中一个节点的cookie, 并复制到其他节点(节点之间通过cookie确定相互是否可通信)

erlang.cookie是什么

erlang.cookie是erlang实现分布式的必要文件,erlang分布式的每个节点上要保持相同的.erlang.cookie文件,同时保证文件的权限是400。

.erlang.cookie存放路径

官方在介绍集群的文档中提到过.erlang.cookie一般会存在这两个地址:第一个是$home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。

如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在home目录下,也就是home/.erlang.cookie。

如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下。

注意:.erlang.cookie是隐藏文件,需要ll -a 才能查看到

三. 设置host

配置各节点的hosts文件,使得每个节点都包含各个节点的映射信息

vim /etc/hosts


xxx.xxx.xxx.xxx name1
xxx.xxx.xxx.xxx name2
xxx.xxx.xxx.xxx name3


四. 启动

使用 -detached 参数运行各节点

rabbitmq-server -detached


查看集群状态,此时还没有集群节点

rabbitmqctl cluster_status


五. 建立集群

以name1为主节点,在name2上:

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@name1
rabbitmqctl start_app


rabbitmqctl reset 是重置的意思,清空数据,绑定的集群等

name3和name2操作一样

rabbitmqctl cluster_status


输出

Cluster status of node rabbit@localhost
[{nodes,[{disc,['rabbit@name1',rabbit@name2]}]},
{running_nodes,['rabbit@name1',rabbit@name2]},
{cluster_name,<<"rabbit@name1">>},
{partitions,[]},
{alarms,[{'rabbit@name1',[]},{rabbit@name2,[]}]}]


以上以两个节点为例

六. 测试

访问任意节点的http://**:15672 来查看集群信息:

图略

以上以两个节点为例

七. 那些坑

[root@rabbitmqsalver2 /]# rabbitmqctl join_cluster --ram rabbit@rabbitmqmaster
Clustering node rabbit@rabbitmqsalver2 with rabbit@rabbitmqmaster ...
Error: unable to connect to nodes [rabbit@rabbitmqmaster]: nodedown

DIAGNOSTICS
===========

attempted to contact: [rabbit@name2]

rabbit@rabbitmqmaster:
* connected to epmd (port 4369) on name2
* epmd reports node 'rabbit' running on port 25672
* TCP connection succeeded but Erlang distribution failed

* Authentication failed (rejected by the remote node), please check the Erlang cookie

current node details:
- node name: 'rabbitmq-cli-88@name2'
- home dir: /root
- cookie hash: 55WeQTsiv71JcEDq/JcE9Q==


错误原因:

- 1. 各个节点cookie不一致

- 2. .erlang.cookie 文件的权限需要保证是400

-
chmod 400 .erlang.cookie


- 3. hosts文件中需要设置所有的节点映射

- (且千万不要重复映射localhost,默认的就好)

总之有太多的坑了,踩踩就习惯了~

八. 其他

rabbit@name2作为内存节点加入到rabbit@name1的集群中

rabbitmqctl join_cluster --ram rabbit@name1


不加–ram标志,默认就是磁盘节点模式

改变将节点类型从内存改为磁盘

可以使用rabbitmqctl change_cluster_node_type命令来改变节点类型

name2$ rabbitmqctl stop
name2$ rabbitmqctl change_cluster_node_type disc
name2$ rabbitmqctl start

name3$ rabbitmqctl stop
name3$ rabbitmqctl change_cluster_node_type ram
name3$ rabbitmqctl start


无论何时,集群中至少要有一个磁盘节点处在运行中,以防止数据丢失。在很多情况下,RabbitMQ将会阻止创建一个仅仅有内存节点的集群,但是它不会阻止你停止或者重置所有磁盘节点,这将导致一个仅仅有内存节点的集群出现。这样做是不可取的,这会很容易丢失数据。

解散集群

当节点想要脱离集群时,需要显示地从集群中将其移除。我们首先移除rabbit@name3,需要通过如下操作才能将其从集群中移除:

name3$ rabbitmqctl stop_app
name3$ rabbitmqctl reset
name3$ rabbitmqctl start_app
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: