一. 搭建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