一、背景
单节点的RabbitMQ不可靠,如果单节点挂掉,则会导致消息队列不可用。此处我们搭建一个3个节点的RabbitMQ集群,用于解决这个问题。
二、RabbitMQ Cluster
2.1、集群类型
默认情况下的RabbitMQ集群只是元数据(metadata)是同步的,队列中的消息是不同步的,这样也是不安全的,需要配置成镜像队列,让数据也冗余到别的节点中,这样才能保证一个节点挂掉,还可以对外提供服务。
元数据
:指的是队列信息、交换机信息、绑定信息等。
2.2、节点名的重要性
在集群中,节点名必须要唯一,集群中是通过节点名来进行联系的。

2.3、erlang cookie 的重要性
集erlang cookie
,因此集群中的erlang cookie的值必须要一致。
不同的操作系统这个文件的位置是不一样的。

.erlang.cookie
的文件权限一般给600
就可以了,不要给太高或太低,否则集群可能无法启动。

2.4、集群节点类型
RabbitMQ集群分为磁盘节点
和内存节点
。
1、磁盘节点所有的数据都是存在磁盘上
2、内存节点的数据是存在内存中,但不是所有的数据都是存在内存中的,比如:消息只会存在索引等。
3、在一个集群中至少需要一个磁盘(disc)节点
2.5、集群中加入版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作! 节点
新加入的集群的节点必须是一个全新的节点,不可以带有数据,如果存在则需要在加入集群的节点上执行rabbitmqctl reset
。
三、部署 RabbitMQ 集群
主机名 | ip地址 | 节点类型 | 用户名 | 密码 | management port | amqp port |
---|---|---|---|---|---|---|
centos01 | 192.168.56.101 | 磁盘节点(disc) | admin | admin | 15672 | 5672 |
centos02 | 192.168.56.102 | 磁盘节点(disc) | admin | admin | 15672 | 5672 |
centos03 | 192.168.56.103 | 内存节点(ram) | admin | admin | 15672 | 5672 |
3.1、配置主机名
在3台服务器上都需要这样操作
vim /etc/hosts
192.168.56.101 centos01
192.168.56.102 centos02
192.168.56.103 centos03
3.2、同步 erlang cookie
如果cookie文件不存在,则可以启动一个RabbitMQ节点,然后在复制过去,在复制的过程中,需要保证 RabbitMQ节点最好都不要启动。
在centos01服务器上操作
scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/.erlang.cookie
3.3、创建集群
- centos01 服务器上操作
rabbitmq-server -detached
可以查看/var/log/rabbitmq/rabbit\@centos01.log
这个日志文件看是否启动成功。
- 放行集群通讯端口等
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=4369/tcp --permanent
firewall-cmd --zone=public --add-port=25672/tcp --permanent
- centos02 加入 centos01
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster [email protected]
rabbitmqctl start_app
- centos03 加入 centos02
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster [email protected] --ram
rabbitmqctl start_app
3.4、查看集群是否构建完成

3.5、将centos03集群移除
- 将需要被移除的节点停止
rabbitmqctl stop
- 在另外启动的节点上执行
rabbitmqctl forget_cluster_node [email protected]
- 重新加入集群中
在启动的时候可能
"Node [email protected] thinks it's clustered with node [email protected], but [email protected] disagrees"

这个时候我们需要删除rm -rvf /var/lib/rabbitmq/mnesia/
这个目录,然后在次执行加入集群的命令即可。
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster [email protected] --ram
rabbitmqctl start_app
四、配置镜像版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作! 集群
4.1、普通集群
经过上方步骤构成的集群是一个普通的集群,只是队列中的元数据共享,而队列中的数据是具体保存到某个节点上的。

这样够不成高可用,如果这个节点挂掉的话,则这个队列的数据还是不可以消费的,也无法往这个队列中发送数据。那么如果解决这个问题呢,答案是
4.2、镜像队列集群
在默认的虚拟主机(/
)所有的队列都配置成镜像队列。(ha-all
只是取的名字)
rabbitmqctl set_policy --vhost / ha-all "^" '{"ha-mode":"all"}'

创建完镜像队列后发现,队列在所有的节点上都存在
五、RabbitMQ 常用命令
1)用户管理
=====================================================================================================
新增一个用户
# rabbitmqctl add_user Username Password
删除一个用户
# rabbitmqctl delete_user Username
修改用户的密码
# rabbitmqctl change_password Username Newpassword
查看当前用户列表
# rabbitmqctl list_users
比如:修改guest用户密码、新增或删除一个用户
查看当前用户列表
# rabbitmqctl list_users
Listing users ...
user tags
guest [administrator]
修改guest用户密码为 [email protected]
# rabbitmqctl change_password guest [email protected]
Changing password for user "guest" ..
新增一个用户,用户名为kevin,密码为 [email protected]
# rabbitmqctl add_user kevin [email protected]
Adding user "kevin" ...
查看当前用户列表
# rabbitmqctl list_users
Listing users ...
user tags
guest [administrator]
kevin []
设置kevin用户角色为administrator
# rabbitmqctl set_user_tags kevin administrator
Setting tags for user "kevin" to [administrator] ...
查看当前用户列表
# rabbitmqctl list_users
Listing users ...
user tags
guest [administrator]
kevin [administrator]
修改kevin用户角色为monitoring、policymaker
# rabbitmqctl set_user_tags kevin monitoring policymaker
Setting tags for user "kevin" to [monitoring, policymaker] ...
查看当前用户列表
# rabbitmqctl list_users
Listing users ...
user tags
guest [administrator]
kevin [monitoring, policymaker]
删除kevin用户
# rabbitmqctl delete_user kevin
Deleting user "kevin" ...
查看当前用户列表
# rabbitmqctl list_users
Listing users ...
user tags
guest [administrator]
2)用户角色
=====================================================================================================
用户角色分类
用户角色可分为五类:超级管理员、监控者、策略制定者、普通管理者以及其他。
超级管理员 (administrator)
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
监控者 (monitoring)
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
策略制定者 (policymaker)
可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息
普通管理者 (management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
其他
无法登陆管理控制台,通常就是普通的生产者和消费者。
相关操作命令:
设置用户角色的命令为:
# rabbitmqctl set_user_tags User Tag
其中:
User为用户名
Tag为角色名 (对应于上面的administrator,monitoring,policymaker,management,或其他自定义名称)。
也可以给同一用户设置多个角色,例如:
# rabbitmqctl set_user_tags kevin monitoring policymaker
3)用户权限
=====================================================================================================
用户权限指的是用户对exchange,queue的操作权限,包括配置权限,读写权限。
配置权限会影响到exchange,queue的声明和删除。
读写权限影响到从queue里取消息,向exchange发送消息以及queue和exchange的绑定(bind)操作。
例如:
将queue绑定到某exchange上,需要具有queue的可写权限,以及exchange的可读权限;
向exchange发送消息需要具有exchange的可写权限;
从queue里取数据需要具有queue的可读权限。
相关操作命令:
设置用户权限
# rabbitmqctl set_permissions -p VHostPath User ConfP WriteP ReadP
查看(指定hostpath)所有用户的权限信息
# rabbitmqctl list_permissions [-p VHostPath]
查看指定用户的权限信息
# rabbitmqctl list_user_permissions User
清除用户的权限信息
# rabbitmqctl clear_permissions [-p VHostPath] User
设置节点类型
RabbitMQ节点类型分为内存节点和硬盘节点。
如果你想更换节点类型可以通过命令修改:
# rabbitmqctl stop_app
# rabbitmqctl change_cluster_node_type dist
# rabbitmqctl change_cluster_node_type ram
# rabbitmqctl start_app
参考文献
https://www.rabbitmq.com/clustering.html
https://www.rabbitmq.com/ha.html
https://www.cnblogs.com/kevingrace/p/14412360.html