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进行调用。

Rabbitmq消息队列

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

Rabbitmq消息队列

上一篇:rabbitmq安装


下一篇:RabbitMQ管理