zoukankan      html  css  js  c++  java
  • 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进行调用。

    img

    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
    

    一个节点没开启插件后如下图

    全开启如下图

  • 相关阅读:
    C#结构
    R语言快速入门
    C#_枚举类型
    C#_数组
    C#传递参数
    C#_字符串的操作
    python-函数之命名空间作用域
    python-迭代器和生成器
    python-文件操作
    python
  • 原文地址:https://www.cnblogs.com/pansn/p/14212539.html
Copyright © 2011-2022 走看看