RabbitMQ是一款在全球范围内使用非常广泛的开源消息队列中间件。它轻量级,易部署,并支持多种协议。它基于erlang开发,天生拥有高并发的能力。
一.RabbitMQ相关术语
1.生产者
生产消息的进程或服务
2.消费者
接收消息的进程或服务
3.队列
RabbitMQ是消息队列中间件,而真正存储信息数据的就是队列,队列可以有很多。
4.交换器
类似于网络设备交换机,它可以根据不同的关键字,将消息发送到不同的队列
5.虚拟主机
虚拟主机类似于Apache的虚拟主机,如果没有虚拟机,当RabbitMQ中的数据越来越庞大,队列越来越多,随之而来的是令人头痛的管理问题,比如队列,交换器命名冲突,它们相互影响等等。虚拟主机能解决这些问题,而不需要我们部署多个RabbitMQ来负责不同的业务。
虚拟主机提供了资源的逻辑分组和分隔,每一个虚拟主机本质上是mini版的RabbitMQ服务器,它们有自己的连接,队列,绑定,交换器,更重要的是有用自己的权限机制,这有点类似服务器好运行在服务器上的虚拟机一样。
二.Rabbitmq常用命令
1.虚拟机管理
列出所有虚拟机——rabbitmqctl list_vhosts
创建虚拟主机——rabbitmqctl add_vhost 主机名
删除虚拟主机——rabbitmqctl delete_vhost 主机名
2.用户管理
列出用户——rabbitmqctl list_users
创建用户——rabbitmqctl add_user 用户名 密码
更改用户密码——rabbitmqctl change_password 用户名 新密码
删除用户——rabbitmqctl delete_user 用户名
清除用户密码——rabbitmqctl clear_password 用户名
3.tags角色介绍
(1)超级管理员(administrator):guest
可登录管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
(2)监控者(monitoring)
可登录管理控制台(启用 managem plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
(3)策略制定者(policymaker)
可登录管理控制台(启用management plugin的情况下),同时可以对policy进行管理。但无法查看节点的相关信息。
(4)普通管理者(management)
仅可登录管理控制台(启动management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
(5)其他
无法登录管理控制台,通常就是普通的生产者和消费者
赋予用户角色——rabbitmqctl set_user_tags 用户名 角色
给特定虚拟机的用户赋权——rabbitmqctl set_permissions -p 虚拟主机名 用户名 权限
例如:[root@localhost ~]# rabbitmqctl set_permissions -p fll user1 '.*' '.*' '.*'
针对fll虚拟主机给user1用户设置所有的配置、读写queue和exchange的权限。默认是没有任何权限的。
说明:用户权限指的是用户对exchange(交换器),queue(队列)的操作权限,包括配置权限,读写权限。配置权限会影响到exchange,queue的声明和删除。读写权限影响到从queue里取消息,向exchange发送消息以及queue和exchange的绑定(bind)操作。例如: 将queue绑定到某exchange上,需要具有queue的可写权限,以及exchange的可读权限;向exchange发送消息需要具有exchange的可写权限;从queue里取数据需要具有queue的可读权限。
rabbitmqctl list_user_permissions <username>
#列出某用户的权限,即该用户对哪个虚拟主机有权限
rabbitmqctl list_permissions -p <vhostname>
#列出指定虚拟主机下所有用户的权限,即哪些用户对该虚拟主机有权限
rabbitmqctl clear_permissions -p <vhostname> <user>
#清除某用户在指定虚拟机上的授权
4.插件管理
查看插件列表——rabbit-plugins list
安装插件——rabbit-plugins enable 插件名
卸载插件——rabbit-plugins disable 插件名
5.限制
设置虚拟主机的最大连接数
rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": 256}'
不允许客户端连接虚拟主机
rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": 0}'
不限制连接数
rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": -1}'
限制虚拟主机里最大的队列数
abbitmqctl set_vhost_limits -p vhost_name '{"max-queues": 1024}'
不限制队列数
rabbitmqctl set_vhost_limits -p vhost_name '{"max-queues": -1}'
6.其他
列出所有的交换器
rabbitmqctl list_exchanges
列出所有的绑定,即把exchange和queue按照路由规则绑定起来
rabbitmqctl list_bindings
分别查看当前系统种存在的Exchange和Exchange上绑定的Queue信息。
rabbitmqctl list_queues
查看运行信息
rabbitmqctl status
三.RabbitMQ集群
RabbitMQ本身是基于Erlang编写的,Erlang天生支持分布式(通过同步Erlang集群各节点的cookie来实现),因此不需要像Kafka那样通过ZooKeeper来实现分布式集群。
1.元数据
RabbitMQ内部有各种基础构件,包括队列、交换器、绑定、虚拟主机等,他们组成了AMQP协议消息通信的基础,而这些构件以元数据的形式存在
2.内存节点与磁盘节点
在集群中的每个节点,要么是内存节点,要么是磁盘节点,如果是内存节点,会将所有的元数据信息仅存储到内存中,而磁盘节点则不仅会将所有元数据存储到内存上, 还会将其持久化到磁盘。所以在搭建集群的时候,为了保证数据的安全性和性能,最好是两种节点都要有
四.部署RabbitMQ集群
1.规划
主机名 | Ip | 节点类型 |
centos01 | 192.168.10.101 | 磁盘节点 |
Centos02 | 192.168.10.102 | 内存节点 |
Centos03 | 192.168.10.103 | 内存节点 |
2.基础环境及配置
(1)修改三台主机的主机名
hostnamectl set-hostname mq01 hostnamectl set-hostname mq02 hostnamectl set-hostname mq03
(2)编辑三台机器的hosts文件
192.168.10.101 mq01 192.168.10.102 mq02 192.168.10.103 mq03
(3)关闭防火墙和selinux
setenforce 0 systemctl stop firewalld systemctl disable firewalld
(4)安装erlang
因为RabbitMQ服务器是用erlang语言编写的,linux自身的yum仓库中并没有erlang,所以要引入外部仓库,这里以阿里仓库为例:
rm -rf /etc/yum.repos.d/* curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo yum clean all
仓库引入完成后,就可以用yum命令下载erlang和rabbitmq-server了
yum install -y erlang rabbirmq-server
安装完成后就可以启动这三台机器了
[root@localhost ~]# systemctl start rabbitmq-server [root@localhost ~]# systemctl enable rabbitmq-server [root@localhost ~]# ps aux |grep rabbit ## 查看rabbit进程 [root@localhost ~]# netstat -lntp ## 查看监听端口
(5)为三台机器安装management插件
rabbitmq-plugins enable rabbitmq-management
插件安装完成后要重启服务,RabbitMQ 需要重新加载配置并加载新安装的插件。
(6)同步Cookie
在mq01上将mq01的cookie文件同步到mq02和mq03;然后重启三台主机
scp /var/lib/rabbitmq/.erlang.cookie root@mq02:/var/lib/rabbitmq/ scp /var/lib/rabbitmq/.erlang.cookie root@mq03:/var/lib/rabbitmq/
在RabbitMQ集群中,.erlang.cookie
文件是非常重要的,它包含了用于节点之间认证和通信的加密密钥。当你将 .erlang.cookie
文件从 mq01
同步到 mq02
和 mq03
后,这些节点必须重新启动,以确保它们能够使用新的 .erlang.cookie
文件进行正确的认证和通信。具体原因包括:
认证和安全性: RabbitMQ 使用
.erlang.cookie
文件来验证节点之间的身份。如果节点间的.erlang.cookie
文件不一致,节点可能会拒绝彼此的连接或通信。重新启动节点可以确保它们加载新的.erlang.cookie
文件,避免这种问题。状态和连接问题: 在RabbitMQ集群中,节点之间的连接和状态是基于安全认证的。如果
.erlang.cookie
文件不一致,节点可能无法正确建立连接或保持集群状态的一致性。重新启动节点有助于确保它们在同步后能够重新建立正确的连接和状态。应用配置和重启策略: 在大多数情况下,RabbitMQ 要求在更改关键配置(如
.erlang.cookie
文件)后重新启动节点。这种重启策略确保了配置的变更能够正确应用到运行时环境中。
(8)分配节点
centos01为磁盘节点,centos02和centos03为内存节点
centos02和centos03上都执行:
停止rabbitmq
[root@localhost ~]# rabbitmqctl stop_app
备注:表示终止RabbitMQ的应用,但是Erlang节点还在运行。在管理RabbitMQ应用时需要停止rabbitmq,但是又要使用erlang对rabbitmq进行管理。
将centos02作为内存节点连接到centos01
[root@localhost ~]# rabbitmqctl join_cluster --ram rabbit@mq01
开启rabbitmq
[root@localhost ~]# rabbitmqctl start_app
查看集群状态
[root@localhost ~]# rabbitmqctl cluster_status