Rabbitmq消息队列
二、Rabbitmq插件的用户配置管理
2.1 用户管理
用户管理包括增加用户、删除用户、查看用户列表、修改用户秘密、设置用户权限、角色等
1、新增用户
rabbitmqctl add_user Username Password
例如
rabbitmqctl add_user admin admin123
2、删除用户
rabbitmqctl delete_user Username
例如
rabbitmqctl delete_user admin
3、修改用户密码
rabbitmqctl oldPassword Username newPassword
4、查询用户列表
rabbitmqctl list_users
2.2 角色管理
1、用户角色
用户角色可分为五类,超级管理员, 监控者, 策略制定者, 普通管理者以及其他。
超级管理员(administrator)
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
监控者(monitoring)
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
策略制定者(policymaker)
可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
普通管理者(management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
其他
无法登陆管理控制台,通常就是普通的生产者和消费者。
2、设置角色命令
# rabbitmqctl set_user_tags User Tag
User为用户名, Tag为角色名(对应于上面的administrator,monitoring,policymaker,management,或其他自定义名称
也可以给同一用户设置多个角色,例如
# rabbitmqctl set_user_tags admin monitoring policymaker
2.3 权限管理
用户权限指的是用户对exchange,queue的操作权限,包括配置权限,读写权限。配置权限会影响到exchange,queue的声明和删除。读写权限影响到从queue里取消息,
向exchange发送消息以及queue和exchange的绑定(bind)操作
常见问题处理
1、erlang安装缺乏依赖
[root@rabbitmq-node2 opt]# rpm -ivh esl-erlang_23.0.1-1~centos~7_amd64.rpm
warning: esl-erlang_23.0.1-1~centos~7_amd64.rpm: Header V4 RSA/SHA256 Signature, key ID a14f4fca: NOKEY
error: Failed dependencies:
libodbc.so.2()(64bit) is needed by esl-erlang-23.0.1-1.x86_64
解决
yum -y install unixODBC
三、RabbitMQ集群-镜像模式搭建
3.1 镜像集群介绍
非常经典的 mirror 镜像模式,保证 100% 数据不丢失。在实际工作中也是用得最多的,并且实现非常的简单,一般互联网大厂都会构建这种镜像集群模式。
把需要的队列做成镜像队列,存在与多个节点属于 RabbitMQ 的 HA 方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。
镜像队列基本上就是一个特殊的BackingQueue,它内部包裹了一个普通的BackingQueue做本地消息持久化处理,在此基础上增加了将消息和ack复制到所有镜像的功能。所有对mirror_queue_master的操作,会通过组播GM(下面会讲到)的方式同步到各slave节点。GM负责消息的广播,mirror_queue_slave负责回调处理,而master上的回调处理是由coordinator负责完成。mirror_queue_slave中包含了普通的BackingQueue进行消息的存储,master节点中BackingQueue包含在mirror_queue_master中由AMQQueue进行调用。
3.2 环境准备
软件介质
软件 | 版本 | 备注 |
---|---|---|
rabbitmq | 3.8.8 | 需要安装对应的erlang版本 |
erlang | 23.x | rabbitmq对应erlang版本 |
主机资源
主机名 | 操作系统 | IP | 备注 |
---|---|---|---|
rabbitmq-node1 | centos7.9 | 172.21.140.31 | 磁盘节点,管理节点 |
rabbitmq-node2 | centos7.9 | 172.21.140.32 | 内存节点 |
rabbitmq-node3 | centos7.9 | 172.21.140.33 | 内存节点 |
hosts配置
# cat /etc/hosts
172.21.140.33 rabbitmq-node3
172.21.140.32 rabbitmq-node2
172.21.140.31 rabbitmq-node1
3.3 erlang安装
#获取rpm包
wget https://packages.erlang-solutions.com/erlang/rpm/centos/7/x86_64/esl-erlang_23.0.1-1~centos~7_amd64.rpm
#解决libodbcy依赖
yum -y install unixODBC
# 安装erlang软件包源
sudo rpm -Uivh esl-erlang_23.0.1-1~centos~7_amd64.rpm
# 安装erlang环境
sudo yum install erlang -y
3.4 rabbitmq安装
#!/bin/bash
# 下载介质源
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.8/rabbitmq-server-3.8.8-1.el7.noarch.rpm
# 安装介质源
yum install -y rabbitmq-server-3.8.8-1.el7.noarch.rpm
# 打开开启动
systemctl enable rabbitmq-server
# 启动服务
systemctl start rabbitmq-server
# 查看服务状态
systemctl status rabbitmq-server
#验证
[root@rabbitmq-node3 opt]# systemctl status rabbitmq-server.service
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2020-12-30 16:12:01 CST; 15min ago
Main PID: 2426 (beam.smp)
Status: "Initialized"
CGroup: /system.slice/rabbitmq-server.service
├─2426 /usr/lib/erlang/erts-11.0.1/bin/beam.smp -W w -K true -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -- -r...
├─2529 erl_child_setup 32768
├─2552 /usr/lib/erlang/erts-11.0.1/bin/epmd -daemon
├─2573 inet_gethost 4
└─2574 inet_gethost 4
3.5 创建集群
3.5.1 配置集群基础环境
1、同步cookie
Rabbitmq 的集群是依赖于 erlang 的集群来工作的,所以必须先构建起 erlang 的 集群环境,而 Erlang 的集群中各节点是通过一个 magic cookie 来实现的,这个 cookie 存放在 /var/lib/rabbitmq/.erlang.cookie
文件中,文件是 400 的 权限,所以必须保证各节点 cookie 一致,否则节点之间就无法通信。
[root@rabbitmq-node1 src]# systemctl stop rabbitmq-server
[root@rabbitmq-node2 src]# systemctl stop rabbitmq-server
[root@rabbitmq-node3 src]# systemctl stop rabbitmq-server
[root@rabbitmq-node1 src]# ll -a /var/lib/rabbitmq/
total 8
drwxr-xr-x 3 rabbitmq rabbitmq 42 Dec 30 16:13 .
drwxr-xr-x. 25 root root 4096 Dec 30 15:17 ..
-r-------- 1 rabbitmq rabbitmq 20 Dec 30 00:00 .erlang.cookie
drwxr-x--- 4 rabbitmq rabbitmq 122 Dec 30 16:29 mnesia
#发送到其他服务器上
[root@rabbitmq-node1 src]# scp /var/lib/rabbitmq/.erlang.cookie 172.21.140.32:/var/lib/rabbitmq/
root@172.21.140.32's password:
.erlang.cookie 100% 20 33.9KB/s 00:00
[root@rabbitmq-node1 src]# scp /var/lib/rabbitmq/.erlang.cookie 172.21.140.33:/var/lib/rabbitmq/
root@172.21.140.33's password:
.erlang.cookie 100% 20
2、查看集群状态
[root@rabbitmq-node1 src]# rabbitmqctl cluster_status
+Cluster status of node rabbit@rabbitmq-node1 ...
Basics
Cluster name: rabbit@rabbitmq-node1
Disk Nodes
rabbit@rabbitmq-node1
Running Nodes
rabbit@rabbitmq-node1
Versions
rabbit@rabbitmq-node1: RabbitMQ 3.8.8 on Erlang 21.3.8.18
Maintenance status
Node: rabbit@rabbitmq-node1, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@rabbitmq-node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq-node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled
3.5.2 将节点加入集群中
将 rabbimqt-node2 作为内存节点加入 rabbitmq-node1 成为集群, 执行以下命令:
#在rabbit-node2节点操作
[root@rabbitmq-node2 opt]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbitmq-node2 ...
#清楚元数据
[root@rabbitmq-node2 opt]# rabbitmqctl reset
Resetting node rabbit@rabbitmq-node2 ...
#加入集群,以node1为集群目标
[root@rabbitmq-node2 opt]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-node1
Clustering node rabbit@rabbitmq-node2 with rabbit@rabbitmq-node1
#启动app
[root@rabbitmq-node2 opt]# rabbitmqctl start_app
Starting node rabbit@rabbitmq-node2 ...
# rabbit-node3节点以同样方式加入即可
验证
[root@rabbitmq-node1 src]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq-node1 ...
Basics
Cluster name: rabbit@rabbitmq-node1
Disk Nodes
rabbit@rabbitmq-node1
RAM Nodes
rabbit@rabbitmq-node2
rabbit@rabbitmq-node3
Running Nodes
rabbit@rabbitmq-node1
rabbit@rabbitmq-node2
rabbit@rabbitmq-node3
Versions
rabbit@rabbitmq-node1: RabbitMQ 3.8.8 on Erlang 21.3.8.18
rabbit@rabbitmq-node2: RabbitMQ 3.8.8 on Erlang 23.0.1
rabbit@rabbitmq-node3: RabbitMQ 3.8.8 on Erlang 23.0.1
Maintenance status
Node: rabbit@rabbitmq-node1, status: not under maintenance
Node: rabbit@rabbitmq-node2, status: not under maintenance
Node: rabbit@rabbitmq-node3, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@rabbitmq-node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq-node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq-node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq-node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq-node3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq-node3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled
3.6 将集群设置为镜像模式
在我们使用 rabbitmq 作为消息服务时,在服务负载不是很大的情况下,一般我们只需要一个 rabbitmq 节点便能为我们提供服务,可这难免会发生单点故障,要解决这个问题,我们便需要配置 rabbitmq 的集群和镜像
镜像模式参数
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: exchanges或queue的匹配模式(正则表达式)
Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
all:表示在集群中所有的节点上进行镜像
exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params:ha-mode模式需要用到的参数
ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual。automatic:新增加节点自动同步全量数据。manual: 新增节点只同步新增数据,全量数据需要手工同步。
Priority:可选参数,policy的优先级
设置示例
[root@rabbitmq-node1 src]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
# 对队列名称以“queue_”开头的所有队列进行镜像,并在集群的两个节点上完成进行,policy的设置命令为:
[root@rabbitmq-node1 src]# rabbitmqctl set_policy --priority 0 --apply-to queues mirror_queue "^queue_" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
Setting policy "mirror_queue" for pattern "^queue_" to "{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}" with priority "0" for vhost "/" ...
[root@rabbitmq-node1 src]#
3.7 WEB界面查看集群
各个服务器启用 web 管理界面,不启用 web 插件的 rabbitmq 服务器,会在 web 节点提示节点 统计信息不可用(Node statistics not available)
[root@rabbitmq-node3 ]# rabbitmq-plugins enable rabbitmq_management
一个节点没开启插件后如下图
全开启如下图