zoukankan      html  css  js  c++  java
  • Linux----------Rabbitmq消息队列

    转载 https://www.cnblogs.com/williamjie/p/9481774.html

    一、rabbitmq简介

    1.1 MQ介绍

    • 什么是MQ
      消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。
      其主要用途:不同进程Process/线程Thread之间通信。

    为什么会产生消息队列?有几个原因:

    • 1.不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个;
    • 2.不同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列;

    MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里开源的RocketMQ。本文主要介绍RabbitMq

    1.2 RabbitMQ简介

    AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
    AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
    下面将重点介绍RabbitMQ中的一些基础概念,了解了这些概念,是使用好RabbitMQ的基础。

    1.3 rabbitmq实现原理

    1.4 rabbitmq原理和集群介绍

    rabbitmq是依据erlang的分布式特性(RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证)来实现的,所以部署rabbitmq分布式集群时要先安装erlang,并把其中一个服务的cookie复制到另外的节点。

    rabbitmq集群中,各个rabbitmq为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般的,均应建立为磁盘节点,为了防止机器重启后的消息消失;

    • RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过rabbitmq HA镜像队列进行消息队列实体复制。

    普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。

    镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。

    二、命令参数和配置文件

    2.1 配置文件

    RabbitMQ 常用的三种自定义服务器的通用方法:
    •配置文件 rabbitmq.conf
    •环境变量文件 rabbitmq-env.conf
    •补充配置文件 advanced.config

    rabbitmq.conf和rabbitmq-env.conf的位置
    •在二进制安装中路径是在 :安装目录下的/etc/rabbitmq/
    •rpm 安装: /etc/rabbitmq/
    如果rabbitmq.conf和rabbitmq-env.conf 的两个文件不存在,那么我们可以创建该文件,然后我们可以通过环境变量
    指定该文件的位置。

    2.1.1 配置文件详解

    https://www.linuxidc.com/Linux/2019-03/157354.htm

    2.2 常用命令

    用户角色
    rabbitmq用户角色(role)分为五类: 超级管理员(administrator)、监控者(monitor)、决策制定者(policymaker)、普通管理者(management)和其他。
    administrator 可登录管理控制台(启用management plugin的情况下),查看所有的信息,并且可以对用户、策略(policy)进行操作;
    monitoring 可登录管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数、内存使用情况,磁盘使用情况等);
    policymaker 可以登录管理控制台(启用management plugin的情况下),同时可以对策略(policy)进行操作;
    management 仅可登录管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理;
    其他 无法登录管理控制台,通常就是普通的生产者和消费者。

    • 语法:
      rabbitmqctl [-n {nodename}] [-t timeout] [-q] {command} [command options...]

    2.2.1 application和cluster management

    rabbitmqctl stop [{pid_file}]
    # 表示stop 在RabbitMQ服务器上运行的一个Erlang 节点,可以指定某一个 *pid_file*,表示会等待这个指定的程序结束
    
    rabbitmqctl shutdown
    # 表示终止RabbitMQ 服务器上的Erlang进程,如果终止失败,会返回非零数字
    
    rabbitmqctl stop_app
    # 表示终止RabbitMQ的应用,但是Erlang节点还在运行。该命令典型的运行在一些需要RabbitMQ应用被停止的管理行为之前,例如 reset
    
    rabbitmqctl start_app
    # 表示启动RabbitMQ的应用。该命令典型的运行在一些需要RabbitMQ应用被停止的管理行为之后,例如 reset
    
    rabbitmqctl wait {pid_file}
    # 表示等待RabbitMQ应用启动。该命令会等待指定的pid file被创建,也就是启动的进程对应的pid保存在这个文件中,然后RabbitMQ应用在这个进程中启动。如果该进程终止,没有启动RabbitMQ应用,就会返回错误。
    # 合适的pid file是有rabbitmq-server 脚本创建的,默认保存在 Mnesia 目录下,可以通过修改 RABBITMQ_PID_FILE 环境变量来修改
    # 例如 rabbitmqctl wait /var/run/rabbitmq/pid
    
    rabbitmqctl reset
    # 表示设置RabbitMQ节点为原始状态。会从该节点所属的cluster中都删除,从管理数据库中删除所有数据,例如配置的用户和vhost,还会删除所有的持久消息。
    # 要想reset和force_reset操作执行成功,RabbitMQ应用需要处于停止状态,即执行过 stop_app
    
    rabbitmqctl force_reset
    # 表示强制性地设置RabbitMQ节点为原始状态。它和reset的区别在于,可以忽略目前管理数据库的状态和cluster的配置,无条件的reset。
    # 该方法的使用,应当用在当数据库或者cluster配置损坏的情况下作为最后的方法。
    
    rabbitmqctl rotate_logs {suffix}
    # 表示将日志文件的内容追加到新的日志文件中去,这个新的日志文件的文件名是原有的日志文件名加上命令中的 suffix,并且恢复日志到原来位置的新文件中。
    # 注意:如果新文件原先不存在,那么会新建一个;如果suffix为空,那么不会发生日志转移,只是重新打开了一次日志文件而已。
    
    rabbitmqctl hipe_compile {directory}
    # 表示在指定的目录下执行HiPE编译和缓存结果文件 .beam-files
    # 如果需要父目录会被创建。并且在编译之前,该目录下的所有 .beam-files会被自动删除。
    # 使用预编译的文件,你应该设置 RABBITMQ_SERVER_CODE_PATH 环境变量为 hipe_compile 调用指定的目录。
    

    2.2.2 cluster management

    rabbitmqctl join_cluster {clusternode} [--ram]
    # 表示结合到指定的集群,如果有参数 --ram 表示作为RAM节点结合到该集群中。
    # 该命令指令本节结合到指定的集群中,在结合之前,该节点需要reset,所以在使用时,需要格外注意。为了成功运行本命令,必须要停止RabbitMQ应用,例如 stop_app
    # 集群节点有两种类型: disc 和 RAM。disc类型,复制数据在RAM和disc上,在节点失效的情况下,提供了冗余保证,也能从一些全局事件中恢复,例如所有节点失效。RAM类型,只复制数据在RAM上,主要表现在伸缩性上,特别是在管理资源(例如:增加删除队列,交换器,或者绑定)上表现突出。
    # 一个集群必须至少含有一个disc节点,当通常都多余一个。通过该命令时,默认是设置为disc节点,如果需创建RAM节点,需要指定参数 --ram
    # 执行此命令之后,在该节点上启动的RabbitMQ应用,在该节点挂掉之后,会尝试连接节点所在集群中的其他节点。
    # 为了离开集群,可以 reset 该节点,也可以使用命令 forget_cluster_node 远程删除节点
    
    rabbitmqctl cluster_status
    # 表示显示通过节点类型聚合在一起的集群中的所有节点,还有目前正在运行的节点
    
    rabbitmqctl change_cluster_node_type {disc|ram}
    # 表示改变集群节点的类型。该操作的正确执行,必定会停止该节点。并且在调整一个node为ram类型时,该节点不能为该集群的唯一node
    
    rabbitmqctl forget_cluster_node [--offline]
    # 表示远程移除一个集群节点。要删除的节点必须脱机,如果没有脱机,需要使用 --offline 参数。当使用 --offline 参数时,rabbitmqctl不会去连接节点,而是暂时变成节点,以便进行变更。这在节点不能正常启动时非常有用。在这种情况下,节点会成为集群元数据的规范来源(例如哪些队列存在)。因此如果可以的话,应该使用此命令在最新的节点上关闭。
    # --offline 参数使节点从脱机节点上移除。使用场景主要是在所有节点脱机,且最后一个节点无法联机时,从而防止整个集群启动。在其他情况不应该使用,否则会导致不一致。
    # 例如 rabbitmqctl -n hare@mcnulty forget_cluster_node  rabbit@stringer
    # 上述命令将从节点 hare@mcnulty 中移除节点 rabbit@stringer
    
    rabbitmqctl rename_cluster_node {oldnode1} {newnode1} [oldnode2] [newnode2...]
    # 表示在本地数据库上修改集群节点名称。该命令让rabbitmqctl暂时成为一个节点来做出做变更。因此,本地的待修改的集群节点一定要完全停止,其他节点可以是online或者offline
    
    rabbitmqctl update_cluster_nodes {clusternode}
    # 表示指示已经集群的节点在唤醒时联系 {clusternode} 进行集群。这与 join_cluster 命令不同,因为它不加入任何集群,它是检查节点是否已经在具有 {clusternode} 的集群中。
    # 该命令的需求,是在当一个节点offline时,修改了集群节点的情形下。例如:节点A和B聚群,节点A offline了,节点C和B集群,并且B节点离开了该集群,那么当节点A起来的时候,A会尝试连接B,但是由于B节点已经不在该集群中,所以会失败。
    # 通过 update_cluster_nodes -n A C 将会解决上述问题。
    
    rabbitmqctl force_boot
    # 表示强制确保节点启动,即使该节点并不是最后down的。
    # 一般情况下,当你同时shut down了RabbitMQ集群时,第一个重启的节点应该是最后一个down掉的,因为它可能已经看到了其他节点发生的事情。但是有时候这并不可能:例如当整个集群lose power,那么该集群的所有节点会认为他们不是最后一个关闭的。
    # 如果最后down的节点永久的lost,那么应该优先使用 rabbitmqctl forget_cluster_node --offline ,因为这将确保在丢失节点上的镜像队列得到优先处理。
    
    rabbitmqctl sync_queue [-p vhost] {queue}
    # {queue} 表示待同步的队列名称
    # 指引含有异步slaves的镜像队列去同步自身。当队列执行同步化时,其将会被锁定(指所有publishers发送出去的和consumers获取到的队列都会被锁定)。为了成功执行此命令,队列必须要被镜像。
    # 注意,排除消息的异步队列将最终被同步化,此命令主要运用于未被排除完全消息的队列。
    
    rabbitmqctl cancel_sync_queue [-p vhost] {queue}
    # 指引一个正在同步的镜像队列停止此操作。
    
    rabbitmqctl purge_queue [-p vhost] {queue}
    # {queue} 表示待清空消息的队列名称
    # 该命令表示清空队列(即删除队列中的所有消息)
    
    rabbitmqctl set_cluster_name {name}
    # 设置集群的名称。在连接中,集群的名称被声明在客户端上,被同盟和插件用来记录一个消息所在的位置。集群的名称默认来自于集群中第一个节点的主机名,但是可以被修改。
    

    2.2.3 User management

    注意,rabbitmqctl 管理 RabbitMQ 的内部用户数据库,所有其他后台需要认证的用户对于rabbitmqctl将不可见。

    rabbitmqctl add_user {username} {password}
    # {username} 表示用户名; {password}表示用户密码
    # 该命令将创建一个 non-administrative 用户
    
    rabbitmqctl delete_user {username}
    # 表示删除一个用户,该命令将指示RabbitMQ broker去删除指定的用户
    
    rabbitmqctl change_password {username} {newpassword}
    # 表示修改指定的用户的密码
    
    rabbitmqctl clear_password {username}
    # 表示清除指定用户的密码
    # 执行此操作后的用户,将不能用密码登录,但是可能通过已经配置的SASL EXTERNAL的方式登录。
    
    rabbitmqctl authenticate_user {username} {password}
    # 表示指引RabbitMQ broker认证该用户和密码
    
    rabbitmqctl set_user_tags {username} {tag ...}
    # 表示设置用户的角色,{tag}可以是零个,一个,或者是多个。并且已经存在的tag也将会被移除。
    # rabbitmqctl set_user_tags tonyg administrator 该命令表示指示RabbitMQ broker确保用户tonyg为一个管理员角色。
    # 上述命令在用户通过AMQP方式登录时,不会有任何影响;但是如果通过其他方式,例如管理插件方式登录时,就可以去管理用户、vhost 和权限。
    
    rabbitmqctl list_users
    # 表示列出所有用户名信息
    

    2.2.3 Access control

    注意,rabbitmqctl 管理 RabbitMQ 的内部用户数据库,所有其他后台需要认证的用户的权限对于rabbitmqctl将不可见。

    rabbitmqctl add_vhost {vhost}
    # {vhost} 表示待创建的虚拟主机项的名称
    
    rabbitmqctl delete_vhost {vhost}
    # 表示删除一个vhost。删除一个vhost将会删除该vhost的所有exchange、queue、binding、用户权限、参数和策略。
    
    rabbitmqctl list_vhosts {vhostinfoitem ...}
    # 表示列出所有的vhost。其中 {vhostinfoitem} 表示要展示的vhost的字段信息,展示的结果将按照 {vhostinfoitem} 指定的字段顺序展示。这些字段包括: name(名称) 和 tracing (是否为此vhost启动跟踪)。
    # 如果没有指定具体的字段项,那么将展示vhost的名称。
    
    rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}
    # 表示设置用户权限。 {vhost} 表示待授权用户访问的vhost名称,默认为 "/"; {user} 表示待授权反问特定vhost的用户名称; {conf}表示待授权用户的配置权限,是一个匹配资源名称的正则表达式; {write} 表示待授权用户的写权限,是一个匹配资源名称的正则表达式; {read}表示待授权用户的读权限,是一个资源名称的正则表达式。
    # rabbitmqctl set_permissions -p myvhost tonyg "^tonyg-.*" ".*" ".*"
    # 例如上面例子,表示授权给用户 "tonyg" 在vhost为 `myvhost` 下有资源名称以 "tonyg-" 开头的 配置权限;所有资源的写权限和读权限。
    
    rabbitmqctl clear_permissions [-p vhost] {username}
    # 表示设置用户拒绝访问指定指定的vhost,vhost默认值为 "/"
    
    rabbitmqctl list_permissions [-p vhost]
    # 表示列出具有权限访问指定vhost的所有用户、对vhost中的资源具有的操作权限。默认vhost为 "/"。
    # 注意,空字符串表示没有任何权限。
    
    rabbitmqctl list_user_permissions {username}
    # 表示列出指定用户的权限vhost,和在该vhost上的资源可操作权限。
    

    2.2.4 Parameter Management

    RabbitMQ的一些特性(例如联合插件)是被动态的、集群范围内的参数控制。有两类参数:属于vhost的参数和全局参数。
    一个属于vhost的参数由三部分组成: 组件名称,参数名称和值。其中组件名称和名称是字符串,值是一个Erlang项。
    一个全局参数由两部分组成: 参数名称和值。其中名称是字符串,值是一个Erlang项。
    参数可以被设置,删除,列出。参数的具体设置方法如下:

    rabbitmqctl set_parameter [-p vhost] {component_name} {name} {value}
    # 设置参数,{component_name}表示待设置参数的组件名称,{name} 表示待设置的参数名称,{value}表示待设置的参数值,是一个JSON项,在多数shell中,你很有可能要应用该值
    # rabbitmqctl set_parameter federation local_username '"guest"'
    # 上述例子,表示设置默认vhost即 "/" 的 federation 组件的参数 local_username 的值设置为JSON项 "guest"
    
    rabbitmqctl clear_parameter [-p vhost] {component_name} {key}
    # 表示清理一个参数,{component_name}表示待清理的组件名称,{key}表示待清理的参数名称
    # rabbitmqctl clear_parameter federation local_username
    # 上述例子表示清理默认vhost上的组件 federation 的参数 local_username
    
    rabbitmqctl list_parameters [-p vhost]
    # 表示列举出指定的vhost上的所有参数
    
    rabbitmqctl set_global_parameter {name} {value}
    # 设置一个全局运行时的变量,有些类似于 set_parameter ,但是此 key-value 对并不绑定于vhost。 
    # rabbitmqctl set_global_parameter mqtt_default_vhosts '{"O=client,CN=guest":"/"}'
    # 上述例子,设置一个全局运行时的参数 mqtt_default_vhosts 的值为一个JSON项, {"O=client,CN=guest":"/"}
    
    rabbitmqctl clear_global_parameter {name}
    # 清除一个全局运行时参数,类似于 clear_parameter,但是此 key-value 对并不绑定于vhost。
    # rabbitmqctl clear_global_parameter mqtt_default_vhosts
    # 上述例子,清除一个全局运行时参数 mqtt_default_vhosts
    
    rabbitmqctl list_global_parameters
    # 列出所有的全局运行时参数,类似于 list_parameters,但是该命令不绑定于任何vhost
    

    2.2.5Policy Management

    策略用于在集群范围内,控制和修改队列和交换器的行为。适用于给定固定虚拟机,并由名称,模式,定义和可选优先级组成。可以设置,清除和列出策略。

    rabbitmqctl set_policy [-p vhost] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}
    # {name} 表示策略名称;
    # {pattern} 表示当匹配到给定资源的正则表达式,使的该策略得以应用; 
    # {definition} 表示策略的定义,作为一个JSON项,在多数shell中,你很可能需要去应用它
    # {priority} 表示策略的优先级的整数,数据越大表示优先级越高,默认值为0
    # {apply_to} 表示策略应该应用的类型: queues/exchange/all,默认值是 all
    
    rabbitmqctl clear_policy [-p vhost] {name}
    # 表示清理一个策略。 {name} 表示待清理的策略名称
    
    rabbitmqctl list_policies [-p vhost]
    # 表示列举出给定的vhost的所有策略信息
    

    2.2.6 Server Status

    服务状态查询语句,询问服务之后,将返回tab分隔的一组列项结果。一些查询语句(例如 list_queues, list_exchanges, list_bindings, list_consumers)接受一个可选的vhost参数。该参数(如果存在),必须在查询之后立即指定。

    rabbitmqctl list_queues [-p vhost] [[--offline] | [--online] | [--local]] [queueinfoitem ...]
    # 返回队列的详细信息。如果 "-p" 标志不存在,那么将返回默认虚拟主机的队列详细信息。"-p" 可以用来覆盖默认vhost。可以使用一下互斥选项之一,通过其状态或者位置过滤显示的队列。
    # [--offline] 表示仅仅列出当前不可用的持久队列(更具体地说,他们的主节点不是)
    # [--online] 表示列出当前可用的队列(他们的主节点是)
    # [--local] 表示仅仅列出那些主程序在当前节点上的队列
    # queueinfoitem参数用于指示要包括在结果中的哪些队列信息项。结果中的列顺序将与参数的顺序相匹配。queueinfoitem可以从以下列表中获取任何值:
    # name 表示队列的名称
    # durable 表示服务器重启之后,队列是否存活
    # auto_delete 表示不再使用的队列是否自动被删除
    # arguments 表示队列的参数
    # policy 表示应用在队列中的策略名称
    # pid 表示和队列相关联的Erlang进程的ID
    # owner_pid 表示作为队列的排他所有者的连接的Erlang进程的ID,如果队列是非排他,则为空
    # exclusive 表示队列是否是排他的,有 owner_pid 返回 True,否则返回 False
    # exclusive_consumer_pid 表示排他消费者订阅该队列的频道的Erlang进程的ID,如果没有独家消费者,则为空
    # exclusive_consumer_tag 表示订阅该队列的排他消费者的消费tag。如果没有排他消费者,则为空
    # messages_ready 表示准备被发送到客户端的消息数量
    # messages_unacknowledged 表示已经被发送到客户端但是还没有被确认的消息数量
    # messages 表示准备发送和没有被确认的消息数量总和(队列深度)
    # messages_ready_ram 表示驻留在 ram 里的 messages_ready 的消息数量
    # messages_unacknowledged_ram 表示驻留在 ram 里的 messages_unacknowledged 的消息数量
    # messages_ram 表示驻留在 ram 里的消息总数
    # messages_persistent 表示队列中持久消息的总数(对于临时队列,总是为0)
    # message_bytes 表示在队列中所有消息body的大小,这并不包括消息属性(包括header)或者任何开销
    # message_bytes_ready 表示类似于 messge_bytes 但仅仅计算那些将发送到客户端的消息
    # message_bytes_unacknowledged 表示类似于 message_bytes 但仅仅计算那些已经发送到客户还没有确认的消息
    # message_bytes_ram 表示类似于 message_bytes 但仅仅计算那些驻留在ram中的消息
    # message_bytes_persistent 表示类似于 message_bytes 但仅仅计算那些持久消息
    # head_message_timestamp 表示队列中第一个消息的时间戳属性(如果存在)。只有处在 paged-in 状态的消息才存在时间戳。
    # disk_reads 表示该队列自start起,从磁盘读取消息的次数总和
    # disk_writes 表示该队列自start起,被写入磁盘消息的次数总和
    # consumers 表示consumer的数量
    # consumer_utilisation 表示队列能够立即将消息传递给消费者的时间分数(0.0 ~ 1.0之间),如果消费者受到网络拥塞或者预取计数的限制,该值可能小于1.0
    # memory 表示和该队列相关联的Erlang进程消耗的内存字节数,包括stack/heap/内部数据结构
    # slave_pids 表示该队列目前的slave的ID号(如果该队列被镜像的话)
    # synchronised_slave_pids 表示如果队列被镜像,给出与主队列同步的当前slave的ID号,即可以从主队列接管而不丢失消息的slave的ID
    # state 表示队列的状态,一般是 "running"; 如果队列正在同步,也可能是 "{syncing, MsgCount}"; 如果队列所处的节点当前down了,队列显示的状态为 "down"
    # 如果没有指定queueinfoitem,那么将显示队列的名称(name)和深度(messages)
    
    
    rabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem ...]
    # 返回交换器的详细信息。如果 "-p" 标志不存在,那么将返回默认虚拟主机的交换器详细信息。"-p" 可以用来覆盖默认vhost。
    # exchangeinfoitem参数用于指示要包括在结果中的哪些交换器信息项。结果中的列顺序将与参数的顺序相匹配。exchangeinfoitem可以从以下列表中获取任何值:
    # name 表示交换器的名称
    # type 表示交换器类型(例如: direct/topic/fanout/headers)
    # durable 表示服务器重启之后,交换器是否存活
    # auto_delete 表示交换器不再使用时,是否被自动删除
    # internal 表示交换器是否是内部的,例如不能被客户端直接发布
    # arguments 表示交换器的参数
    # policy 表示引用在该交换器上的策略名称
    # 如果没有指定任何 exchangeinfoitem,那么该命令将显示交换器的名称(name)和类型(type)
    
    
    rabbitmqctl list_bindings [-p vhost] [bindinginfoitem ...]
    # 返回绑定的详细信息。如果 "-p" 标志不存在,那么将返回默认虚拟主机的绑定详细信息。"-p" 可以用来覆盖默认vhost。
    # bindinginfoitem参数用于指示要包括在结果中的哪些绑定信息项。结果中的列顺序将与参数的顺序相匹配。bindinginfoitem可以从以下列表中获取任何值:
    # source_name 表示绑定附加到的消息源的名称
    # source_kind 表示绑定附加到的消息源的类型,目前通常交换器
    # destination_name 表示附加绑定到的消息目的地的名称
    # destination_kind 表示附加绑定到的消息目的地的类型
    # routing_key 表示绑定的routing key
    # arguments 表示绑定的参数
    # 如果没有指定任何的 bindinginfoitem ,那么将展示上述所有的参数
    # rabbitmqctl list_bindings -p /myvhost exchange_name queue_name
    # 上述命令,表示展示在 /myvhost 虚拟主机中的绑定的exchange名称和queue名称
    
    
    rabbitmqctl list_connections [connectioninfoitem ...]
    # 返回TCP/IP连接统计信息
    # connectioninfoitem 参数用于指示要包括在结果中的哪些连接信息项,结果中的列顺序将与参数的顺序相匹配。connectioninfoitem可以从以下列表中获取任何值:
    # pid 表示与该connection相关联的Erlang进程的id号
    # name 表示该连接的可读性名称
    # port 表示服务端口
    # host 表示通过反向DNS获取的服务器主机名,如果反向DNS失败或未启用,则为其IP地址
    # peer_port 表示对等端口
    # peer_host 表示通过反向DNS获取的对等主机名,如果反向DNS失败或未启用,则为其IP地址
    # ssl 表示该连接是否使用SSL保护的bool值
    # ssl_protocal 表示SSL协议(例如: tlsv1)
    # ssl_key_exchange 表示SSL关键交换器算法(例如: rsa)
    # ssl_cipher 表示SSL密码算法(例如: aes_256_cbc)
    # ssl_hash 表示SSL哈希函数(例如: sha)
    # peer_cert_issuer 表示对等体的SSL证书的颁发者,以RFC4514形式出现
    # peer_cert_validity 表示对等体的SSL证书的有效期限
    # state 表示连接状态(例如: starting/tuning/opening/running/flow/blocking/blocked/closing/closed)
    # channels 表示正在使用连接的通道数量
    # protocol 表示正在使用的AMQP的版本号。注意,如果一个客户端需要一个AMQP 0-9 连接,我们将其作为 AMQP 0-9-1
    # auth_mechanism 表示使用SASL认证机制,如PLAN
    # user 表示和该连接相关联的用户名
    # vhost 表示vhost名称
    # timeout 表示连接超时/协商心跳间隔,单位为秒
    # frame_max 表示最大的frame大小(byte)
    # channel_max 表示该连接上通道的最大数量
    # client_properties 表示在连接建立期间,有客户端传送的消息属性
    # recv_oct 表示接受到的八位字节
    # recv_cnt 表示接受到的包
    # send_oct 表示发送的八位字节
    # send_cnt 表示发送的包
    # send_pend 表示发送的队列大小
    # connected_at 表示该连接被建立的日期和时间的时间戳格式
    # 如果没有指定任何connectioninfoitem,那么将展示:user/peer_host/peer_port/流量控制和内存块状态之后的时间
    
    
    rabbitmqctl list_channels [channelinfoitem ...]
    # 返回所有当前的通道的信息,通道即一个执行大多数AMQP命令的逻辑容器。这包括由普通AMQP连接的一部分通道、由各种插件和其他扩展程序创建的通道。
    # channelinfoitem 参数用于指示要包括在结果中的哪些连接信息项,结果中的列顺序将与参数的顺序相匹配。channelinfoitem 可以从以下列表中获取任何值:
    # pid 表示与该连接相关联的Erlang程序的ID号
    # connection 表示与通道所属连接相关联的Erlang进程的ID号
    # name 表示通道的可读性名称
    # number 表示通道的号码,在连接中唯一表示它
    # user 表示和该通道相关联的用户名
    # vhost 表示通道操作所在的vhost
    # transactional 表示通道是否处于事务模式,返回 true,否则返回 false
    # confirm 表示通道是否处于确认模式,返回 true, 否则返回 false
    # consumer_count 表示通过通道检索消息的逻辑AMQP消费者数量
    # messages_unacknowledged 表示通过通道发送过但还没收到反馈的消息的数量
    # messages_uncommitted 表示尚未提交的事务中接受的消息数
    # acks_uncommitted 表示尚未提交的事务中接受的确认数
    # messages_unconfirmed 表示尚未确认已发布的消息数量。在不处于确认模式中的通道上,该值为0
    # prefetch_count 表示新消费者的QoS预取限制,如果没有限制则为0
    # global_prefetch_count 表示整个通道的QoS预取限制,如果没有限制则为0
    # 如果没有指定任何 channelinfoitem 项,那么将展示 pid/user/consumer_count/messages_unacknowledged
    
    
    rabbitmqctl list_consumers [-p vhost]
    # 列出消费者,例如对一个队列的消息流的订阅者。每一行用tab字符分隔:
    # 订阅的队列名称、创建和管理订阅的通道id、在通道中唯一标识订阅的消费者tag、消息传输到订阅者之后是否需要确认的bool值、代表预取限制的整数(0表示none)、订阅者的其他参数
    
    
    rabbitmqctl status
    # 展示broker的状态信息,例如在当前Erlang节点上正在运行的应用、RabbitMQ和Erlang版本号、OS名称、内存和文件描述统计信息
    
    
    rabbitmqctl node_health_check
    # RabbitMQ节点的健康检查,验证 Rabbit 应用正在运行,list_queues和list_channels返回,警告没有被设置
    # rabbitmqctl node_health_check -n rabbit@stringer
    # 上述例子,表示对RabbitMQ节点进行健康检查
    
    
    rabbitmqctl environment
    # 在每个正在运行的应用程序的应用程序环境中,显示每个变量的名称和值
    
    
    rabbitmqctl report
    # 生成服务器状态报告,其中包括用于支持目的的所有服务器状态信息的并置。当伴随支持请求时,输出应该被重定向到一个文件
    # rabbitmqctl report > server_report.txt
    
    
    rabbitmqctl eval {expr}
    # 评估一个任务Erlang表达式
    # rabbitmqctl eval 'node().'
    # 上述例子,将返回 rabbitmqctl 已经连接的节点名称
    

    2.2.7 Miscellaneous

    rabbitmqctl 其他的一些命令

    rabbitmqctl close_connection {connectionpid} {explanation}
    # {connectionpid} 表示待关闭连接的Erlang进程的ID号
    # {explanation} 表示解释字符串
    # 指引broker去关闭与ID为 {connectionid} Erlang进程相关联的连接,作为AMQP连接关闭协议的一部分,它也会向连接的客户端传递 {explanation} 字符串
    # rabbitmqctl close_connection "<rabbit@tanto.4262.0>" "go away"
    # 上述例子,表示关闭与ID号为 "<rabbit@tanto.4262.0>" 的Erlang进程相关联的连接,并向连接的客户端传输解释性语句 "go away"。
    
    
    rabbitmqctl trace_on [-p vhost]
    # vhost 表示要启动跟踪的虚拟机名称
    # 开始跟踪。注意,跟踪状态不是持久的,如果服务重启,它将恢复为关闭
    
    
    rabbitmqctl trace_off [-p vhost]
    # 停止跟踪
    
    
    rabbitmqctl set_vm_memory_high_watermark {fraction}
    # {fraction} 触发流量控制的新内存阈值分数,大于或等于0的浮点数
    
    
    rabbitmqctl set_vm_memory_high_watermark absolute {memory_limit}
    # {memory_limit} 触发流量控制的新内存限制,以字节表示,大于或等于0的整数或作为具有存储单元(例如: 512M或者1G),可用的单位有:
    k/kiB: kibibytes(2^10字节); M/MiB: mebibytes(2^20字节); G/GiB: gibibytes(2^30字节)
    kB: kilobytes(10^3); MB: megabytes(10^6); GB: gigabytes(10^9)
    
    
    rabbitmqctl set_disk_free_limit {disk_limit}
    # {disk_limit} 下限为字节整数或具有存储单元的字符串(参见 vm_memory_high_watermark 命令),例如: 512M或1G,一旦可用磁盘空间达到限制,将会设置磁盘告警
    
    
    rabbitmqctl set_disk_free_limit mem_relative {fraction}
    # {fraction} 相对于可用RAM的限制,为非负的浮点数。低于1.0的值可能是危险的,应小心使用。
    
    
    rabbitmqctl encode [--decode] [value] [passphrase] [--list-ciphers] [--list-hashes] [--cipher cipher] [--hash hash] [--iterations iteraions]
    # [--decode] 表示解密输入值的标志位。
      例如: rabbitmqctl encode --decode '{encrypted,'<<"...">>}' mypassphrase
    # [value] [passphrase] 表示加密和解密的值、密码。 
      例如: rabbitmqctl encode '<<"guest">>' mypassphrase
      例如: rabbitmqctl encode --decode '{encrypted,'<<"...">>}' mypassphrase 
    # [--list-ciphers] 表示列出支持的密码标志位
      例如: rabbitmqctl encode --list-ciphers
    # [--list-hashes] 表示列出支持的哈希算法标志位
      例如: rabbitmqctl encode --list-hashes
    # [--cipher cipher] [--hash hash] [--iterations iterations] 表示用于指定加密设置的选项,它们可以独立使用
      例如: rabbitmqctl encode --cipher blowfish_cfb64 --hash sha256 --iterations 1000 '<<"guest">>' mypassphrase
    

    2.2.8 用户和用户角色

    # 查看用户信息
    rabbitmqctl list_users
    # 结果如下
    Listing users ...
    guest   [administrator]
    ...done.
    
    
    # 创建新用户 rabbitmqctl add_user {username} {password}
    rabbitmqctl add_user jshan 123456
    # 结果如下,表示创建成功
    Creating user "jshan" ...
    ...done.
    # 再次查询结果如下
    Listing users ...
    guest   [administrator]
    jshan   []
    ...done.
    # 上述结果中,第一列表示用户名,第二列表示用户角色
    
    
    # 为用户设置用户角色 rabbitmqctl set_user_tags {username} {role}
    rabbitmqctl set_user_tags jshan monitoring
    # 结果如下,表示设置成功
    Setting tags for user "jshan" to [monitoring] ...
    ...done.
    # 说明一下,执行该命令之后,会先删除该用户已有的角色,然后添加新的角色,可以填写多个角色,如果想删除某个用户的所有角色,可以设置如下:
    rabbitmqctl set_user_tags {username}
    
    
    # 修改用户密码 rabbitmqctl change_password {username} {newpassword}
    rabbitmqctl change_password jshan 123
    # 结果如下,表示修改成功
    Changing password for user "jshan" ...
    ...done.
    
    
    # 清除用户密码 rabbitmqctl clear_password {username}
    rabbitmqctl clear_password jshan
    # 结果如下,表示清除成功
    Clearing password for user "jshan" ...
    ...done.
    # 说明一下,执行该命令之后,用户无法对该用户使用密码登录
    
    
    # 删除用户 rabbitmqctl delete_user {username}
    rabbitmq delete_user jshan
    # 结果如下,表示删除成功
    Deleting user "jshan" ...
    ...done.
    

    2.3 常用管理命令

    Rabbitmq服务器的主要通过rabbitmqctl和rabbimq-plugins两个工具来管理,以下是一些常用功能。
    1). 服务器启动与关闭

      启动: rabbitmq-server –detached 或 service rabbitmq-server start
    
      关闭:rabbitmqctl stop           或 service rabbitmq-server stop
    
      若单机有多个实例,则在rabbitmqctlh后加–n 指定名称
    

    2). 插件管理

      开启某个插件:rabbitmq-pluginsenable xxx
    
      关闭某个插件:rabbitmq-pluginsdisablexxx
    
      注意:重启服务器后生效。
    

    3).virtual_host管理

      新建virtual_host: rabbitmqctladd_vhost  xxx
    
      撤销virtual_host:rabbitmqctl  delete_vhost xxx
    

    4). 用户管理

      新建用户:rabbitmqctl add_user xxx pwd
    
      删除用户:   rabbitmqctl delete_user xxx
    
      改密码: rabbimqctl change_password {username} {newpassword}
    
      设置用户角色:rabbitmqctl set_user_tags {username} {tag ...}
    
              Tag可以为 administrator,monitoring, management
    

    5). 权限管理

      权限设置:set_permissions [-pvhostpath] {user} {conf} {write} {read}
    
               Vhostpath
    
               Vhost路径
    
               user
    
     用户名
    
              Conf
    
      一个正则表达式match哪些配置资源能够被该用户访问。
    
              Write
    
      一个正则表达式match哪些配置资源能够被该用户读。
    
               Read
    
      一个正则表达式match哪些配置资源能够被该用户访问。
    

    6). 获取服务器状态信息

       服务器状态:rabbitmqctl status
    
       队列信息:rabbitmqctl list_queues[-p vhostpath] [queueinfoitem ...]
    
                Queueinfoitem可以为:name,durable,auto_delete,arguments,messages_ready,
    
                messages_unacknowledged,messages,consumers,memory
    
       Exchange信息:rabbitmqctllist_exchanges[-p vhostpath] [exchangeinfoitem ...]
    
                 Exchangeinfoitem有:name,type,durable,auto_delete,internal,arguments.
    
       Binding信息:rabbitmqctllist_bindings[-p vhostpath] [bindinginfoitem ...]       
    
                 Bindinginfoitem有:source_name,source_kind,destination_name,destination_kind,routing_key,arguments
    
       Connection信息:rabbitmqctllist_connections [connectioninfoitem ...]
    
       Connectioninfoitem有:recv_oct,recv_cnt,send_oct,send_cnt,send_pend等。
    
       Channel信息:rabbitmqctl  list_channels[channelinfoitem ...]
    
      Channelinfoitem有consumer_count,messages_unacknowledged,messages_uncommitted,acks_uncommitted,messages_unconfirmed,prefetch_count,client_flow_blocked
    

    三、简单安装和使用

    注意:erlang和mq的版本,mq版本为3.6,erlang版本不能超过19

    3.1 单机版YUM安装

    环境:centos7.7,rabbitmq-server-3.6.6-1.el7.noarch.rpm

    #yum安装
    #安装依赖
    yum install ncurses ncurses-base ncurses-devel ncurses-libs ncurses-static ncurses-term ocaml-curses ocaml-curses-devel openssl-devel zlib-devel make ncurses-devel gcc gcc-c++ unixODBC unixODBC-devel openssl openssl-devel -y
    rz rabbitmq-server-3.6.6-1.el7.noarch.rpm
    yum install -y erlang 
    yum localinstall rabbitmq-server-3.6.6-1.el7.noarch.rpm
    yum install socat(可能自动安装)
    
    #查看版本
    erl -v
    
    #启动服务
    systemctl start rabbitmq.server.service
    
    #查看状态
    rabbitmqctl status
    
    #启动web管理插件
    rabbitmq-plugins enable rabbitmq_management
    
    #如果提示找不到,使用查看插件名称
    rabbitmq-plugins list
     
    #增加访问用户,默认用户guest只能本地访问。
    rabbitmqctl add_user admin passwd(123456)
     
    #设置超级管理员:
    rabbitmqctl set_user_tags admin administrator
     
    设置默认vhost("/")访问权限
    rabbitmqctl set_permissions -p "/" admin "." "." ".*"
     
    #浏览器访问:http://IP:15672
    用户名admin,密码123456进行登录
     
    #最好登录console的时候,删除默认账户guest
    
    #开放安全组或防火墙15672端口
    #访问ip:15672,默认账户密码15672(上面)
    Config file        /etc/rabbitmq/rabbitmq.config
    Database directory /var/lib/rabbitmq/mnesia/rabbit@docker-004
    Log file           /var/log/rabbitmq/rabbit@docker-004.log
    SASL log file      /var/log/rabbitmq/rabbit@docker-004-sasl.log 
    

    3.2 rabbitmq集群安装

    环境:centos7.7,rabbitmq-server-3.6.6-1.el7.noarch.rpm
    IP:192.168.1.1 192.168.1.2 192.168.1.3

    1.安装单机版
    上面3.1-rabbitmq单机安装
    
    2.配置hosts,/etc/hosts
    192.168.1.1  node1
    192.168.1.2  node2
    192.168.1.3  node3
    
    2.复制.erlang的cookie文件【集群通讯的重点】
    #erlang.cookie一般会存在这两个地址:第一个是$home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie,注意这个文件的权限是 400(默认即是400)
    scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/.erlang.cookie
    scp /var/lib/rabbitmq/.erlang.cookie node3:/var/lib/rabbitmq/.erlang.cookie
    
    3.重启动各节点rabbitmq服务
    rabbitmqctl stop
    rabbitmq-server -detached
    或
    systemctl restart rabbitmq
    
    4.查看节点状态
    rabbitmqctl cluster_status
    
    5.新增一个用户并赋予权限
    rabbitmqctl add_user  admin 123456
    rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
    rabbitmqctl set_user_tags admin administrator
    
    6.组成集群
    node2上:
    rabbitmqctl stop_app 
    rabbitmqctl join_cluster rabbit@node1   #加入node1为主的集群,因为cookie文件
    rabbitmqctl start_app
    PS:如果要使用内存节点,则可以使用
    node2上:
    rabbitmqctl join_cluster --ram rabbit@node1加入集群
    
    7.查看节点状态
    rabbitmqctl cluster_status
    看结果集群的名称默认为rabbit@node1
    
    8.设置镜像队列
    rabbitmqctl set_policy -p coresystem  ha-all "^" '{"ha-mode":"all"}'
    PS:"coresystem" vhost名称, "^"匹配所有的队列, ha-all 策略名称为ha-all, '{"ha-mode":"all"}' 策略模式为 all 即复制到所有节点,包含新增节点。
    
    9.安装并配置HA高可用
    PS:可以使用阿里云的内网slb来实现负载均衡,nginx也可以
    - haproxy示例:
    yum install haproxt
    
    cat /etc/haproxy/haproxy.cfg
    global 
        
        log         127.0.0.1 local2
     
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
     
        stats socket /var/lib/haproxy/stats
     
    defaults 
           log        global 
           mode       tcp 
           option     tcplog 
           option     dontlognull 
           retries    3 
           option redispatch 
           maxconn 2000 
           contimeout      5s 
           clitimeout      120s 
           srvtimeout      120s 
     
    listen rabbitmq_cluster 192.168.101.11:5670
           mode      tcp 
           balance roundrobin 
           server rabbit1  192.168.101.11:5672 check inter 5000 rise 2 fall 2 
           server rabbit2  192.168.101.12:5672 check inter 5000 rise 2 fall 2        
           server rabbit3  192.168.101.13:5672 check inter 5000 rise 2 fall 2 
    listen private_monitoring :8100 mode http option httplog stats enable stats uri /rabbitmqstats stats refresh 5s
    #启动服务
    systemctl start haproxy
    

    3.3 常见错误

    三、常见问题
    常见错误:
    1、使用 rabbitmq-server -detached命令启动rabbitmq时,出现以下提示Warning: PID file not written; -detached was passed,此时使用rabbitmqctl status提示服务已启动,可知此问题不用解决。

    2、由于更改hostname文件,在每次rabbitmqctl stop或者rabbitmqctl cluster_status等,只要是rabbitmq的命令就报错,提示大概如下

    Cluster status of node rabbit@web2 ...
    Error: unable to connect to node rabbit@web2: nodedown
    
    DIAGNOSTICS
    ===========
    
    attempted to contact: [rabbit@web2]
    
    rabbit@web2:
      * connected to epmd (port 4369) on web2
      * epmd reports node 'rabbit' running on port 25672
      * TCP connection succeeded but Erlang distribution failed
    
      * Hostname mismatch: node "rabbit@mq2" believes its host is different. Please ensure that hostnames resolve the same way locally and on "rabbit@mq2"
    
    
    current node details:
    - node name: 'rabbitmq-cli-11@web2'
    - home dir: /root
    - cookie hash: SGwxMdJ3PjEXG1asIEFpBg==
    

    此时先ps aux | grep mq,然后kill -9 该进程,然后再rabbitmq-server -detached即可解决。(即先强杀,再重新启动)

    3、使用rabbitmqctl stop,rabbitmq-server -detached重新启动后,原先添加的用户admin、虚拟主机coresystem等均丢失,还需要重新添加。

    采用脚本启动,在脚本中写好启动好需要加载的各配置项(创建admin用户并授权,创建虚拟主机并授权,配置镜像队列)。

    3、命令

    rabbitmqctl stop_app 仅关闭应用,不关闭节点
    rabbitmqctl start_app 开启应用
    rabbitmq--server -detached 启动节点和应用
    rabbitmqctl 关闭节点和应用

    4、常用命令:

    Rabbitmq服务器的主要通过rabbitmqctl和rabbimq-plugins两个工具来管理,以下是一些常用功能。

    1). 服务器启动与关闭

    启动: rabbitmq-server –detached
    关闭:rabbitmqctl stop
    若单机有多个实例,则在rabbitmqctlh后加–n 指定名称

    2). 插件管理

    开启某个插件:rabbitmq-plugins enable xxx
    关闭某个插件:rabbitmq-plugins disable xxx
    注意:重启服务器后生效。
    3).virtual_host管理

    新建virtual_host: rabbitmqctl add_vhost xxx
    撤销virtual_host:rabbitmqctl delete_vhost xxx

    4). 用户管理

    新建用户:rabbitmqctl add_user xxxpwd
    删除用户: rabbitmqctl delete_user xxx
    查看用户:rabbitmqctl list_users
     改密码: rabbimqctlchange_password {username} {newpassword}
    设置用户角色:rabbitmqctlset_user_tags {username} {tag ...}
    Tag可以为 administrator,monitoring, management

    5). 权限管理

    权限设置:set_permissions [-pvhostpath] {user} {conf} {write} {read}
    Vhostpath
    Vhost路径
    user
    用户名
    Conf
    一个正则表达式match哪些配置资源能够被该用户访问。
    Write
    一个正则表达式match哪些配置资源能够被该用户读。
    Read
    一个正则表达式match哪些配置资源能够被该用户访问。

    6). 获取服务器状态信息
    服务器状态:rabbitmqctl status ##其中可查看rabbitmq的版本信息

    7).获取集群状态信息
    rabbitmqctl cluster_status

    3.4 部署注意事项

    1.集群各节点的hosts解析
    2. .erlang的cookie要一致
    3.指定加入的集群名要准确
    4.erlang和rabbitmq的版本对应
    5.创建的用户和权限要一致
    6.时间同步

  • 相关阅读:
    php socket 发送HTTP请求 POST json
    登录令牌 Token 介绍
    如何打开rdb文件
    Web登录其实没那么简单
    爆款小程序是如何诞生的?
    如何在小程序上增加音视频?
    拒绝“割韭菜”— 谈谈区块链正经的商用场景!
    想知道微信怎么做指纹支付开发?看这里!
    游戏安全有多重要?——GAME-TECH游戏开发者技术沙龙
    嘿,OCR文字识别了解下!
  • 原文地址:https://www.cnblogs.com/L1-5551/p/13600478.html
Copyright © 2011-2022 走看看