Linux Note / Middleware / 运维笔记

RabbitMQ 镜像队列集群

Einic Yeo · 12月5日 · 2021年 · ·

一、背景

单节点的RabbitMQ不可靠,如果单节点挂掉,则会导致消息队列不可用。此处我们搭建一个3个节点的RabbitMQ集群,用于解决这个问题。版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!

二、RabbitMQ Cluster

2.1、集群类型

默认情况下的RabbitMQ集群只是元数据(metadata)是同步的,队列中的消息是不同步的,这样也是不安全的,需要配置成镜像队列,让数据也冗余到别的节点中,这样才能保证一个节点挂掉,还可以对外提供服务。

元数据:指的是队列信息、交换机信息、绑定信息等。

2.2、节点名的重要性

在集群中,节点名必须要唯一,集群中是通过节点名来进行联系的。

2.3、erlang cookie 的重要性

集群版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!节点中是通过什么来认证的,从而让集群节点可以互相通讯,靠的就是 erlang cookie,因此集群中的erlang cookie的值必须要一致。

erlang cookie 文件的位置

不同的操作系统这个文件的位置是不一样的。

erlang cookie 文件的权限

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

2.4、集群节点类型

RabbitMQ集群分为磁盘节点内存节点
1、磁盘节点所有的数据都是存在磁盘上
2、内存节点的数据是存在内存中,但不是所有的数据都是存在内存中的,比如:消息只会存在索引等。
3、在一个集群中至少需要一个磁盘(disc)节点

2.5、集群中加入节点

新加入的集群的节点必须是一个全新的节点,不可以带有数据,如果存在则需要在加入集群的节点上执行rabbitmqctl reset

三、部署 RabbitMQ 集群

主机名ip地址节点类型用户名密码management portamqp port
centos01192.168.56.101磁盘节点(disc)adminadmin156725672
centos02192.168.56.102磁盘节点(disc)adminadmin156725672
centos03192.168.56.103内存节点(ram)adminadmin156725672

  

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服务器上操作

版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!
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 rabbit@centos01
rabbitmqctl start_app
  • centos03 加入 centos02
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@centos02 --ram
rabbitmqctl start_app

3.4、查看集群是否构建完成

3.5、将centos03集群移除

  • 将需要被移除的节点停止
rabbitmqctl stop
  • 在另外启动的节点上执行
rabbitmqctl forget_cluster_node rabbit@centos03
  • 重新加入集群中

在启动的时候可能报如下错误

"Node rabbit@centos03 thinks it's clustered with node rabbit@centos02, but rabbit@centos02 disagrees"

这个时候我们需要删除rm -rvf /var/lib/rabbitmq/mnesia/这个目录,然后在次执行加入集群的命令即可。

rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@centos02 --ram
rabbitmqctl start_app

四、配置镜像集群

4.1、普通集群

经过上方步骤构成的集群是一个普通的集群,只是队列中的元数据共享,而队列中的数据是具体保存到某个节点上的。

这样够不成高可用,如果这个节点挂掉的话,则这个队列的数据还是版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!不可以消费的,也无法往这个队列中发送数据。那么如果解决这个问题呢,答案是使用镜像队列集群。

4.2、镜像队列集群

在默认的虚拟主机(/)所有的队列都配置版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!成镜像队列。(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用户密码为 guest@123
# rabbitmqctl change_password guest guest@123
Changing password for user "guest" ..
 
新增一个用户,用户名为kevin,密码为 kevin@123
# rabbitmqctl add_user kevin kevin@123
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

0 条回应