TOC

RabbitMQ部署

    RabbitMQ的程序包是epel源中的rabbitmq-server,所以需要实现配置好epel源,RabbitMQ有很多常见,插件可以使用rabbitmq-plugins来管理,常见的插件有rabbitmq_management监听于15672端口,列出插件可以使用rabbitmq-plugins {enable|disable|list},这样一来RabbitMQ就有多个端口,15672是管理端口,5672是RabbitMQ客户端端口,25672则是集群通信端口;
# 部署rabbitmq
[root@node01 ~]# yum install -y rabbitmq-server
[root@node01 ~]# systemctl start rabbitmq-server.service
[root@node01 ~]# netstat -ntlp|grep 5672
tcp        0      0 0.0.0.0:25672           0.0.0.0:*               LISTEN      6857/beam.smp       
tcp6       0      0 :::5672                 :::*                    LISTEN      6857/beam.smp
# 启用管理端
[root@node01 ~]# rabbitmq-plugins enable rabbitmq_management
[root@node01 ~]# systemctl restart rabbitmq-server.service
[root@node01 ~]# netstat -ntlp|grep 5672
tcp        0      0 0.0.0.0:25672           0.0.0.0:*               LISTEN      7116/beam.smp       
tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN      7116/beam.smp       
tcp6       0      0 :::5672                 :::*                    LISTEN      7116/beam.smp       

配置方式

    RabbitMQ的配置方式有三种,虽然然有多种配置,但是大多数都有默认值;
环境变量:主要用来定义配置文件路径,网络参数等信息;
配置文件:主要用于定义服务器各组件的访问权限、资源限制、插件以及集群资源配置;
    auth_mechanisms:指定认证机制,是使用默认的明文认证机制还是使用AMQP的认证机制;
    default_user:连接    rabbitmq的默认用户;
    default_pass:连接rabbitmq的默认密码;
    default_permission:连接rabbitmq的默认权限;
    disk_free_limit:rabbitmq也需要将用户的消息存储到磁盘,所以这个参数值主要定义磁盘的最少预留空间;
    heartbeat:borker与客户端之间的持久连接的心跳检测,默认为580毫秒;
    hipe_compile:定义rabbitmq是否使用默认的erlang编译器,还是使用高性能的erlang编译器,高性能编译器性能将提升百分之二十左右,默认true;
    log_levels:日志级别,none、error、warning、info;
    tcp_listenders:监听的地址和端口,默认为5672;
    ssl_listenders:加密安全通信监听的地址和端口,默认也是5672;
    vm_memory_high_watermark:内存高水位标记,这个参数主要定义内存的空闲空间,以免将系统的资源全部用完;
运行时参数:主要用来修改集群运行时参数设定,使用rabbitmqctl来设定;
    set_parameter:设定参数;
    claer_parameter:清空参数;
    set_policy:设定策略;
    clear_policy:清除策略;

管理命令

    RabbitMQ有很多管理命令,主要有几项用户管理、RabbitMQ程序管理、虚拟主机管理、权限管理等;
服务管理
启动:rabbitmq-server –detached
关闭:rabbitmqctl stop
若单机有多个实例,则在rabbitmqctlh后加–n 指定名称
插件管理
开启某个插件:rabbitmq-plugins enable xxx
关闭某个插件:rabbitmq-plugins disable xxx
注意:重启服务器后生效。
用户管理
    用户管理主要是对RabbitMQ用户做增删改查操作,此外RabbitMQ有几个用户角色,none、management、policymaker、monitonring、adminstrator;
none:不能访问management plugin;
management:用户可以通过AMQP做的任何事外加,列出自己可以通过AMQP登入的virtual hosts,查看自己的virtual hosts中的queues, exchanges 和 bindings,查看和关闭自己的channels 和 connections,查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动;
policymaker:management可以做的任何事外加,查看、创建和删除自己的virtual hosts所属的policies和parameters;
monitonring:management可以做的任何事外加,列出所有virtual hosts,包括他们不能登录的virtual hosts,查看其他用户的connections和channels,查看节点级别的数据如clustering和memory使用情况,查看真正的关于所有virtual hosts的全局的统计信息;
adminstrator:policymaker和monitoring可以做的任何事外加,创建和删除virtual hosts,查看、创建和删除users,查看创建和删除permissions,关闭其他用户的connections;
语法
add_user <username> <password>:添加用户;
delete_user <username>:删除用户;
change_password <username> <newpassword>:修改密码;
clear_password <username>:清空用户密码;
set_user_tags <username> <tag> ...:设定用户的tag,tag就类似于组的意思;
list_users:查看已存在的所有用户;
实例
# 创建用户
[root@node01 ~]# rabbitmqctl add_user cce caichangen
# 查看用户
[root@node01 ~]# rabbitmqctl list_users
cce     []  # 默认的tag为空
# 设定tag
[root@node01 ~]# rabbitmqctl set_user_tags cce administrator
[root@node01 ~]# rabbitmqctl list_users
cce     [administrator]
---
# 创建一个专有用户,用来监控rabbitmq
[root@node01 ~]# rabbitmqctl add_user  user_monitoring  passwd_monitor
[root@node01 ~]# rabbitmqctl set_user_tags user_monitoring monitoring
[root@node01 ~]# rabbitmqctl list_users
user_monitoring [monitoring]
虚拟主机/权限管理管理
    RabbitMQ默认以成树状结构的虚拟主机来进行队列区分,类似我们的Kubernets里面的Namespace做隔离,一个vhost本质就是一个隔离的mini版的RabbitMQ服务器,一个vhost内部拥有自己的exchange、binding、queue和权限控制,vhost通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密地运行数据,vhost是AMQP概念的基础,必须在连接时进行指定,RabbitMQ包含了默认vhost:“/;
    默认用户guest具有“/”上的全部权限,仅能有localhost访问RabbitMQ包括Plugin,建议删除或更改密码。可通过将配置文件中loopback_users置孔来取消其本地访问的限制;
    用户仅能对其所能访问的virtual hosts中的资源进行操作。这里的资源指的是virtual hosts中的exchanges、queues等,操作包括对资源进行配置、写、读。配置权限可创建、删除、资源并修改资源的行为,写权限可向资源发送消息,读权限从资源获取消息,其中,<conf> <write> <read>的位置分别用正则表达式来匹配特定的资源,如'^(amq\.gen.*|amq\.default)$'可以匹配server生成的和默认的exchange,'^$'不匹配任何资源;
    exchange和queue的declare与delete分别需要exchange和queue上的配置权限;
    exchange的bind与unbind需要exchange的读写权限;
    queue的bind与unbind需要queue写权限exchange的读权限;
    发消息(publish)需exchange的写权限;
    获取或清除(get、consume、purge)消息需queue的读权限;
语法
add_vhost <vhostpath>:添加一个虚拟主机;
delete_vhost <vhostpath>:删除一个虚拟主机;
list_vhosts [<vhostinfoitem> ...]:列出所有虚拟主机;
set_permissions [-p <vhostpath>] <user> <conf> <write> <read>:给虚拟主机分片权限,一个正则表达式match哪些配置资源能够被该用户访问。Write一个正则表达式match哪些配置资源能够被该用户读。Read一个正则表达式match哪些配置资源能够被该用户访问;
clear_permissions [-p <vhostpath>] <username>:清空指定用户对该虚拟主机的权限;
list_permissions [-p <vhostpath>]:列出拥有虚拟主机的权限的所有用户;
list_user_permissions <username>:查看指定用户权限;
实例
# 创建虚拟主机
[root@node01 ~]# rabbitmqctl add_vhost /eureka
[root@node01 ~]# rabbitmqctl list_vhosts                
/
/eureka
# 让cce用户对eureka这个虚拟主机具有完全访问权
[root@node01 ~]# rabbitmqctl set_permissions -p /eureka cce ".*" ".*" ".*"
# 查看cce用户权限
[root@node01 ~]# rabbitmqctl list_user_permissions cce
/eureka .*      .*      .*
# 查看具有/eureka虚拟主机权限的用户
[root@node01 ~]# rabbitmqctl list_permissions -p /eureka
cce     .*      .*      .*
组件查看命令
    可以直接在命令行使用rabbitmq自己提供的命令行工具直接实时差看组件的状态;
list_queues [-p <vhostpath>] [<queueinfoitem> ...]:查看队列;
list_exchanges [-p <vhostpath>] [<exchangeinfoitem> ...]:查看交换器;
list_bindings [-p <vhostpath>] [<bindinginfoitem> ...]:查看绑定;
list_connections [<connectioninfoitem> ...]:查看链接;
list_channels [<channelinfoitem> ...]:查看channel;
list_consumers [-p <vhostpath>]:查看消费者;
其他命令
status:查看borker当前状态;
environment:查看当前rabbitmq的环境变量及其设定的值;
close_connection:关闭指定连接;
trace_on:启动追踪功能,最一个vhost的访问执行详细追踪;
set_vm_memory_high_watermark:修改内存的高水位标记;
API地址
RabbitMQ内置了一个返回JSON数据的API可供开发者进行定制开发:http://172.16.1.1:15672/api/

RabbitMQ集群管理

    MQ在一个分布式环境当中,它所承担的角色几乎是连接所有服务的中间节点,因此这个组件如果挂掉,那么整个系统都会受到影响,所以高可用性就变得非常关键,RabbitMQ Cluster的各组件可以基于某种协议将每一个节点上所持有的信息,与其他节点进行同步,类似Tomcat replication Cluster的复制进群一样,各节点彼此之间进行同步,任何一个节点挂了,那么通过其他节点都可以提供服务,但是这样一来我们就需要一个前端路由器,来完成自动切换,这是RabbitMQ的HA的一种实现;
    还有一种方案的LB的一种实现,负载均衡集群,对于RabbitMQ来讲,它的单个节点可能无法承载那么多的生产任务,那么这个时候我们就可以实现多节点RabbitMQ,然后借助于Haproxy或者Nginx就能实现,他们都可以基于TCP协议转发,所以可用直接将我们的后端RabbitMQ利用TCP的方式进行转发,所以我们直接使用HaProxy将用户请求5672的访问,分散至多个RabbitMQ节点,而且我们还可以基于HaProxy给它们做健康状态检查,并监控各节点当前的请求数量等功能;
    RabbitMQ的集群功能几乎不需要什么复杂的配置,只需要在启动时按照特定方式启动,并基于命令将其添加至集群中即可;
Cluster
    需要注意一个点,要想使用RabbitMQ的Cluster功能必须得将Cluster的Management这个插件启用起来,这是一个基本要求,当启动Management
# 三台节点安装rabbitmq
[root@node01 ~]# yum install -y rabbitmq-server
# 三台节点启用插件
[root@node01 ~]# rabbitmq-plugins enable rabbitmq_management
# 三台节点启动RabbitMQ
[root@node01 ~]# systemctl start rabbitmq-server.service 
# 在node1上设定集群名称
[root@node01 ~]# rabbitmqctl set_cluster_name cluster
# 将node1上的cookie复制到node2和node3并重启node2和node3
[root@node01 ~]# scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/.erlang.cookie
[root@node01 ~]# scp /var/lib/rabbitmq/.erlang.cookie node3:/var/lib/rabbitmq/.erlang.cookie
# node2和node3节点停掉所有的app
[root@node01 ~]# rabbitmqctl stop_app
# 在node02和node03上加入cluster集群
[root@node02 ~]# rabbitmqctl join_cluster rabbit@node01
[root@node03 ~]# rabbitmqctl join_cluster rabbit@node01
# node2和node3节点启动所有的app
[root@node02 ~]# rabbitmqctl start_app
[root@node03 ~]# rabbitmqctl start_app
# 查看集群状态
[root@node01 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node01 ...
[{nodes,[{disc,[rabbit@node01,rabbit@node02,rabbit@node03]}]},
 {running_nodes,[rabbit@node03,rabbit@node02,rabbit@node01]},
 {cluster_name,<<"rabbit@node1">>},
 {partitions,[]}]
...done.
# 测试在任意一台主机上创建一个虚拟主机查看数据是否同步
[root@node01 ~]# rabbitmqctl add_vhost cce
# 在node2上查看,数据已同步
[root@node02 ~]# rabbitmqctl list_vhosts
Listing vhosts ...
/
cce
# 镜像队列 rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注