rabbitmq集群功能和原理:node
设计集群目的:正则表达式
容许消费者和生产者在RabbitMQ节点崩溃的状况下继续运行算法
经过增长更多的节点来扩展消息通讯的吞吐量shell
rabbitmq能够经过三种方式来部署分布式集群系统,分别是:cluster、federation、shovel数据库
cluster:后端
不支持夸网段,用于同一个网段内的局域网安全
能够随意动态的增长和减小服务器
节点之间须要运行相同版本的rabbitmq和erlangmarkdown
federation:应用于广域网,容许单台服务器上的交换机或队列接收发布到另外一台服务器交换机或队列的消息,能够是单独机器或集群。federation队列相似于单向点对点链接,消息会在联盟队列之间转发任意次,直到被消费者接受。一般使用federation来链接internet上的中间服务器,用做订阅分发消息或工做队列cookie
shovel:链接方式与federation的链接方式相似,但它工做在更低层次,能够应用于广域网
节点类型
RAM node:内存节点将全部队列、交换机、绑定、用户、权限、和vhost的元数据定义存储在内存中,好处是可使得交换机和队列声明等操做更加快捷
Disk node:将元数据存储在磁盘中,单节点系统只容许磁盘类型的节点,防止重启rabbitmq的时候,丢失系统的配置信息
说明:rabbitmq要求集群中至少有一个磁盘节点,全部其余节点能够是内存节点,当节点加入或者离开时,必需要将该变动通知一个磁盘节点。若是集群中惟一的磁盘节点崩溃,集群扔可保持运行,可是没法进行其余操做(增删改查),直到节点恢复
解决方法:设置两个磁盘节点,至少一个是可用的,能够保存元数据的更改
Erlang Cookie
Erlang Cookie是保证不一样节点能够相互通讯的密钥,要保证集群中的不一样节点相互通讯必须共享相同的Erlang Cookie。
说明:这就要从rabbitmqctl命令的原理提及,rabbitmq底层是经过erlang架构来实现的,因此rabbitmqctl会启动erlang节点,并基于erlang节点来使用erlang系统链接rabbitmq节点。在链接过程当中须要正确的Erlang Cookie和节点名称,Erlang节点经过交换Erlang Cookie以得到认证
RabbitMQ的Cluster集群模式通常分为两种,普通模式和镜像模式
普通模式:默认的集群模式,以两个节点(rabbit0一、rabbit02)为例来进行说明。对于Queue来讲,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit0一、rabbit02间进行消息传输,把A中的消息实体取出并通过B发送给consumer。因此consumer应尽可能链接每个节点,从中取消息。即对于同一个逻辑队列,要在多个节点创建物理Queue。不然不管consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点没法取到rabbit01节点中还未消费的消息实体。若是作了消息持久化,那么得等rabbit01节点恢复,而后才可被消费;若是没有持久化的话,就会产生消息丢失的现象
镜像模式:将须要消费的队列变为镜像队列,存在于多个节点,这样就能够实现RabbitMQ的HA高可用性。做用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通信会占用大量的网络带宽
实现机制
镜像队列实现了RabbitMQ的高可用性(HA),具体的实现策略以下所示:
ha-mode | ha-params | 功能 |
---|---|---|
all | 空 | 镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。 |
exactly | count | 镜像队列将会在集群上复制count份。若是集群数量少于count时候,队列会复制到全部节点上。若是大于Count集群,有一个节点crash后,新进入节点也不会作新的镜像。 |
nodes | node name | 镜像队列会在node name中复制。若是这个名称不是集群中的一个,这不会触发错误。若是在这个node list中没有一个节点在线,那么这个queue会被声明在client链接的节点。 |
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: 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 priority:可选参数,policy的优先级
下面的命令来查看那些slaves已经完成同步
rabbitmqctl list_queues name slave_pids synchronised_slave_pids
能够经过手动的方式同步一个queue:
rabbitmqctl sync_queue name
一样也能够取消某个queue的同步功能:
rabbitmqctl cancel_sync_queue name
一般队列由两部分组成:一部分是AMQQueue,负责AMQP协议相关的消息处理,即接收生产者发布的消息、向消费者投递消息、处理消息confirm、acknowledge等等;另外一部分是BackingQueue,它提供了相关的接口供AMQQueue调用,完成消息的存储以及可能的持久化工做等
在RabbitMQ中BackingQueue又由5个子队列组成:Q1, Q2, Delta, Q3和Q4。RabbitMQ中的消息一旦进入队列,不是固定不变的,它会随着系统的负载在队列中不断流动,消息的不断发生变化。与这5个子队列对于,在BackingQueue中消息的生命周期分为4个状态:
注意:对于持久化的消息,消息内容和消息全部都必须先保存在DISK上,才会处于上述状态中的一种,而Gamma状态的消息是只有持久化的消息才会有的状态
上述就是RabbitMQ的多层队列结构的设计,咱们能够看出从Q1到Q4,基本经历RAM->DISK->RAM这样的过程。这样设计的好处是:当队列负载很高的状况下,可以经过将一部分消息由磁盘保存来节省内存空间,当负载下降的时候,这部分消息又渐渐回到内存,被消费者获取,使得整个队列具备很好的弹性
rabbitmqctl — 用于管理中间件的命令行工具
rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options…]
RabbitMQ是AMQP的实现, 后者是高性能企业消息通讯的新兴标准. RabbitMQ server是AMQP 中间件健壮的,可扩展的实现.
rabbitmqctl 用来管理RabbitMQ中间件的命令行工具.它经过链接中间件节点来执行全部操做。
若是中间件没有运行,将会显示诊断信息, 不能到达,或因不匹配Erlang cookie而拒绝链接.
[-n node]
默认节点是”rabbit@server”,此处的server是本地主机. 在一个名为”server.example.com”的主机上, RabbitMQ Erlang node 的节点名称一般是rabbit@server (除非RABBITMQ_NODENAME在启动时设置了非默认值). hostname -s 的输出一般是”@” 标志后的东西.查看rabbitmq-server(1)来了解配置RabbitMQ broker的细节.
[-q]
使用-q标志来启用宁静(quiet)模式,这会一致消息输出.
[-t timeout]
操做超时时间(秒为单位). 只适用于"list" 命令. 默认是无穷大.
应用程序和集群管理
stop [pid_file]
用于中止运行RabbitMQ的Erlang node.若是指定了pid_file,还将等待指定的过程结束。例如: rabbitmqctl stop 此命令会终止RabbitMQ node的运行.
stop_app
中止RabbitMQ application,但Erlang node会继续运行.此命令主要用于优先执行其它管理操做(这些管理操做须要先中止RabbitMQ application),如. reset.例如: rabbitmqctl stop_app
start_app
启动RabbitMQ application. 此命令典型用于在执行了其它管理操做以后,从新启动中止的RabbitMQ application。如reset.例如: rabbitmqctl start_app 此命令来指导RabbitMQ node来启动RabbitMQ application.
wait {pid_file}
等待RabbitMQ application启动.此命令用来等待RabbitMQ application来启动node。它会等待建立pid文件,而后等待pid文件中的特定pid过程启动,最后等待RabbitMQ application 来启动node. pid file是经过rabbitmq-server 脚原本建立的.默认状况下,它存放于Mnesia目录中. 修改RABBITMQ_PID_FILE 环境变量能够改变此位置。如: rabbitmqctl wait /var/run/rabbitmq/pid 此命令会在RabbitMQ node启动后返回.
reset
将RabbitMQ node还原到最初状态.包括从所在群集中删除此node,从管理数据库中删除全部配置数据,如已配置的用户和虚拟主机,以及删除全部持久化消息. 执行reset和force_reset以前,必须中止RabbitMQ application ,如使用stop_app. 示例: rabbitmqctl reset 此命令会重设RabbitMQ node.
force_reset
强制RabbitMQ node还原到最初状态. 不一样于reset , force_reset 命令会无条件地重设node,不论当前管理数据库的状态和集群配置是什么. 它只能在数据库或集群配置已损坏的状况下才可以使用。 执行reset和force_reset以前,必须中止RabbitMQ application ,如使用stop_app. 示例: rabbitmqctl force_reset 此命令会重设RabbitMQnode.
rotate_logs {suffix}
指示RabbitMQ node循环日志文件. RabbitMQ 中间件会将原来日志文件中的内容追加到原始名称和后辍的日志文件中,而后再将原始日志文件内容复制到新建立的日志上。实际上,当前日志内容会移到以此后辍结尾的文件上。当目标文件不存在时,将会进行建立。若是不指定后辍,则不会发生循环,日志文件只是从新打开。示例: rabbitmqctl rotate_logs .1 此命令指示RabbitMQ node将日志文件的内容追加到新日志文件(文件名由原日志文件名和.1后辍构成)中。如. rabbit@mymachine.log.1 和 rabbit@mymachine-sasl.log.1. 最后, 日志会在原始位置恢复到新文件中.
集群管理
join_cluster {clusternode} [–ram]
clusternode 加入集群的节点. [--ram] 若是进行了设置,节点将以RAM节点身份加入集群. 指导节点成为集群中的一员. 在加入集群以前,节点会重置,所以在使用此命令时,必须当心. 这个命令要成功,RabbitMQ应用程序必须先中止,如stop_app. 集群节点能够是两种类型: 磁盘节点(Disc Node) 或 内存节点(RAM Node).磁盘节点会在RAM和磁盘中复制数据, 经过冗余能够防止节点失效事件,并可从断电这种全局事件中进行恢复. RAM节点只在RAM中复制数据(除了队列的内容外,还依赖于队列是不是持久化的或者内容对于内存来讲是否过大) ,并主要用于可伸缩性. RAM节点只有当管理资源(如,增长/删除队列,交换机,或绑定)的时候才具备更高的性能.一个集群必须至少有一个磁盘节点,一般来讲还不止一个. 默认状况下,节点是磁盘节点.若是你想要建立内存节点,须要提供--ram 标志. 在执行cluster命令以后, 不管什么时候,当前节点上启动的RabbitMQ 应用程序在节点宕机的状况下,会尝试链接集群中的其它节点。 要脱离集群, 必须重设(reset)节点. 你也能够经过forget_cluster_node 命令来远程删除节点. 更多详情,参考集群指南. 例如: rabbitmqctl join_cluster hare@elena --ram 此命令用于指示RabbitMQ node以ram节点的形式将 hare@elena 加入集群.
cluster_status
按节点类型来分组展现集群中的全部节点,包括当前运行的节点. 例如: rabbitmqctl cluster_status 此命令会显示集群中的全部节点.
change_cluster_node_type {disc | ram}
修改集群节点的类型. 要成功执行此操做,必须首先中止节点,要将节点转换为RAM节点,则此节点不能是集群中的惟一disc节点。 例如: rabbitmqctl change_cluster_node_type disc 此命令会将一个RAM节点转换为disc节点.
forget_cluster_node [–offline]
[--offline] 容许节点从脱机节点中删除. 这只在全部节点都脱机且最后一个掉线节点不能再上线的状况下有用,从而防止整个集群从启动。它不能使用在其它状况下,由于这会致使不一致. 远程删除一个集群节点.要删除的节点必须是脱机的, 而在删除节点期间节点必须是在线的,除非使用了--offline 标志. 当使用--offline 标志时,rabbitmqctl不会尝试正常链接节点;相反,它会临时改变节点以做修改.若是节点不能正常启动的话,这是很是有用的.在这种状况下,节点将变成集群元数据的规范源(例如,队列的存在),即便它不是之前的。所以,若是有可能,你应该在最新的节点上使用这个命令来关闭。 例如: rabbitmqctl -n hare@mcnulty forget_cluster_node rabbit@stringer 此命令会从节点hare@mcnulty中删除rabbit@stringer节点.
rename_cluster_node {oldnode1} {newnode1} [oldnode2] [newnode2 …]
支持在本地数据库中重命名集群节点. 此子命令会促使rabbitmqctl临时改变节点以做出修改. 所以本地集群必须是中止的,其它节点能够是在线或离线的. 这个子命令接偶数个参数,成对表示节点的旧名称和新名称.你必须指定节点的旧名称和新名称,由于其它中止的节点也可能在同一时间重命名. 同时中止全部节点来重命名也是能够的(在这种状况下,每一个节点都必须给出旧名称和新名称)或一次中止一个节点来重命名(在这种状况下,每一个节点只须要被告知其名句是如何变化的). 例如: rabbitmqctl rename_cluster_node rabbit@misshelpful rabbit@cordelia 此命令来将节点名称rabbit@misshelpful 重命名为rabbit@cordelia.
update_cluster_nodes {clusternode}
clusternode 用于咨询具备最新消息的节点. 指示已集群的节点醒来时联系clusternode.这不一样于join_cluster ,由于它不会加入任何集群 - 它会检查节点已经以clusternode的形式存在于集群中了. 须要这个命令的动机是当节点离线时,集群能够变化.考虑这样的状况,节点A和节点B都在集群里边,这里节点A掉线了,C又和B集群了,而后B又离开了集群.当A醒来的时候,它会尝试联系B,但这会失败,由于B已经不在集群中了.update_cluster_nodes -n A C 可解决这种场景.
force_boot
确保节点将在下一次启动,即便它不是最后一个关闭的。一般状况下,当你关闭整个RabbitMQ 集群时,你重启的第一个节点应该是最后一个下线的节点,由于它能够看到其它节点所看不到的事情. 但有时这是不可能的:例如,若是整个集群是失去了电力而全部节点都在想它不是最后一个关闭的.
在这种节点掉线状况下,你能够调用rabbitmqctl force_boot .这就告诉节点下一次无条件的启动节点.在此节点关闭后,集群的任何变化,它都会丢失. 若是最后一个掉线的节点永久丢失了,那么你须要优先使用rabbitmqctl forget_cluster_node --offline, 由于它能够确保在丢失的节点上掌握的镜像队列获得提高。 例如: rabbitmqctl force_boot 这能够强制节点下次启动时不用等待其它节点.
sync_queue [-p vhost] {queue}
queue 同步队列的名称 指示未同步slaves上的镜像队列自行同步.同步发生时,队列会阻塞(全部出入队列的发布者和消费者都会阻塞).此命令成功执行后,队列必须是镜像的. 注意,未同步队列中的消息被耗尽后,最终也会变成同步. 此命令主要用于未耗尽的队列。
cancel_sync_queue [-p vhost] {queue}
queue 取消同步的队列名称. 指示同步镜像队列中止同步.
purge_queue [-p vhost] {queue}
queue 要清除队列的名称. 清除队列(删除其中的全部消息).
set_cluster_name {name}
设置集群名称. 集群名称在client链接时,会通报给client,也可用于federation和shovel插件记录消息的来源地. 群集名称默认是来自在群集中的第一个节点的主机名,但能够改变。 例如: rabbitmqctl set_cluster_name london 设置集群名称为"london".
用户管理
注意rabbitmqctl 管理RabbitMQ 内部用户数据库. 任何来自其它认证后端的用户对于rabbitmqctl来讲是不可见的.
add_user {username} {password}
username 要建立的用户名称. password 设置建立用户登陆broker的密码. rabbitmqctl add_user tonyg changeit 此命令用于指示RabbitMQ broker 建立一个拥有非管理权限的用户,其名称为tonyg, 初始密码为changeit.
delete_user {username}
username 要删除的用户名称. 例如: rabbitmqctl delete_user tonyg 此命令用于指示RabbitMQ broker删除名为tonyg的用户
change_password {username} {newpassword}
username 要修改密码的用户名称. newpassword 用户的新密码. 例如: rabbitmqctl change_password tonyg newpass 此命令用于指定RabbitMQ broker将tonyg 用户的密码修改成newpass.
clear_password {username}
username 要清除密码的用户名称. 例如: rabbitmqctl clear_password tonyg 此命令会指示RabbitMQ broker清除名为tonyg的用户密码.如今,此用户不能使用密码登陆(但能够经过SASL EXTERNAL登陆,若是配置了的话).
authenticate_user {username} {password}
username 用户的名称. password 用户的密码. 例如: rabbitmqctl authenticate_user tonyg verifyit 此命令会指示RabbitMQ broker以名称为tonyg, 密码为verifyit来进行验证.
set_user_tags {username} {tag …}
username 要设置tag的用户名称. tag 用于设置0个,1个或多个tags.任何现有的tags都将被删除. 例如: rabbitmqctl set_user_tags tonyg administrator 此命令指示RabbitMQ broker用于确保tonyg 是administrator.当经过AMQP来登陆时,这没有什么效果,但用户经过其它的途经来登陆时,它可用来管理用户,虚拟主机和权限(如使用管理插件). rabbitmqctl set_user_tags tonyg 此命令会指示RabbitMQ broker删除tonyg上的任何现有的tag.
list_users
列出用户. 每一个结果行都包含用户名,其后紧跟用户的tags. 例如: rabbitmqctl list_users 此命令指示RabbitMQ broker列出全部用户.
访问控制
注意rabbitmqctl 会管理RabbitMQ的内部用户数据库. 无权限的用户将不能使用rabbitmqctl.
add_vhost {vhost}
vhost 要建立虚拟主机名称. 建立一个虚拟主机. 例如: rabbitmqctl add_vhost test 此命令指示RabbitMQ broker来建立一个新的名为test的虚拟主机.
delete_vhost {vhost}
vhost 要删除的虚拟主机的名称. 删除一个虚拟主机. 删除一个虚拟主机,同时也会删除全部交换机,队列,绑定,用户权限,参数和策略. 例如: rabbitmqctl delete_vhost test 此命令指示RabbitMQ broker删除名为test的虚拟主机.
list_vhosts [vhostinfoitem …]
列出全部虚拟主机. vhostinfoitem 参数用于标识哪些虚拟主机应该包含在结果集中.结果集中的列顺序会匹配参数的顺序.vhostinfoitem 可接受下面的值: name 虚拟主机的名称. tracing 是否对虚拟主机启用追踪. 若是没有指定vhostinfoitem 参数,那么会显示虚拟主机名称. 例如: rabbitmqctl list_vhosts name tracing 此命令用于指示RabbitMQ broker显示全部虚拟主机.
set_permissions [-p vhost] {user} {conf} {write} {read}
vhost 授予用户可访问的虚拟机名称,默认是/. user 可访问指定虚拟主机的用户名称. conf 一个用于匹配用户在哪些资源名称上拥有配置权限的正则表达式 write 一个用于匹配用户在哪些资源名称上拥有写权限的正则表达式. read 一个用于匹配用户在哪些资源名称上拥有读权限的正则表达式. 设置用户权限. 例如: rabbitmqctl set_permissions -p /myvhost tonyg "^tonyg-.*" ".*" ".*" 此命令表示RabbitMQ broker授予tonyg 用户可访问 /myvhost虚拟主机,并在资源名称以"tonyg-"开头的全部资源上都具备配置权限,并在全部资源上都拥有读写权限。
clear_permissions [-p vhost] {username}
vhost 用于设置禁止用户访问的虚拟主机名称,默认为/. username 禁止访问特定虚拟主机的用户名称. 设置用户权限. 例如: rabbitmqctl clear_permissions -p /myvhost tonyg 此命令用于指示RabbitMQ broker禁止tonyg 用户访问/myvhost虚拟主机.
list_permissions [-p vhost]
vhost 用于指定虚拟主机名称,将会列出全部可访问此虚拟主机的全部用户名称和权限.默认为/. 显示虚拟机上权限. 例如: rabbitmqctl list_permissions -p /myvhost 此命令指示RabbitMQ broker列出全部已受权访问/myvhost 虚拟主机的用户,同时也会列出这些用户能在虚拟主机资源可操做的权限.注意,空字符串表示没有任何授予的权限。
list_user_permissions {username}
username 要显示权限的用户名称. 列出用户权限. 例如: rabbitmqctl list_user_permissions tonyg 此命令指示RabbitMQ broker列出tonyg可受权访问的全部虚拟主机名称,以及在这些虚拟主机上的操做.
参数管理
RabbitMQ的某些特性(如联合插件)是动态控制的. 每一个参数都是与特定虚拟主机相关的组件名称, name和value构成的. 组件名称和name都是字符串,值是Erlang term. 参数可被设置,清除和显示.一般你能够参考文档来了解如何设置参数.
set_parameter [-p vhost] {component_name} {name} {value}
设置一个参数. component_name 要设置的组件名称. name 要设置的参数名称. value 要设置的参数值,做不JSON项。在多数shells中,你更喜欢将其引发来. 例如: rabbitmqctl set_parameter federation local_username '"guest"' 此命令用于在默认虚拟主机上设置federation 组件的local_username 参数值"guest".
clear_parameter [-p vhost] {component_name} {key}
清除参数. component_name 要清除参数的组件名称. name 要清除的参数名称. 例如: rabbitmqctl clear_parameter federation local_username 此命令用于清除默认虚拟主机上的federation 组件的local_username 参数值.
list_parameters [-p vhost]
列出虚拟主机上的全部参数. 示例: rabbitmqctl list_parameters 此命令用于列出默认虚拟主机上的全部参数.
策略管理
策略用于在集群范围的基础上用于控制和修改队列和交换机的行为. 策略应用于虚拟主机,由name, pattern, definition或可选的priority组成. 策略可被设置,清除和列举.
set_policy [-p vhost] [–priority priority] [–apply-to apply-to] {name} {pattern} {definition}
设置策略. name 策略名称. pattern 正则表达式, 匹配要应用的资源 definition 策略的定义,JSON形式.在大多数shells中,你极可能须要引用这个 priority 策略的整数优先级. 数字越高则优先级越高.默认是0. apply-to 策略适用的对象类型,其值可为 "queues", "exchanges" 或 "all".默认是"all". 例如: rabbitmqctl set_policy federate-me "^amq." '{"federation-upstream-set":"all"}' 此命令在默认虚拟主机上设置策略为federate-me,这样内建的交换器将进行联合.
clear_policy [-p vhost] {name}
清除策略. name 要清除的策略名称. 例如: rabbitmqctl clear_policy federate-me 此命令来清除默认虚拟主机上的federate-me 策略.
list_policies [-p vhost]
显示虚拟主机上的全部策略. 例如: rabbitmqctl list_policies 此命令会显示默认虚拟主机上的全部策略.
服务器状态
服务器状态查询查询服务器返回一个结果以制表符分隔的列表. 某些查询(list_queues, list_exchanges, list_bindings, 和 list_consumers) 接受一个可选的vhost 参数. 若是这个参数出现了,那么它必须指定在查询的后面.
list_queues, list_exchanges and list_bindings 命令接受一个可选的虚拟主机参数以显示其结果.默认值为”/”.
list_queues [-p vhost] [queueinfoitem …]
返回队列的详细信息. 若是无-p标志,将显示/虚拟主机上的队列详情."-p" 标志可用来覆盖此默认值. queueinfoitem 参数用于指示哪些队列信息项会包含在结果集中.结果集的列顺序将匹配参数的顺序.queueinfoitem 能够是下面列表中的任何值: name 非ASCII字符的队列名称. durable 服务器重启后,队列是否能幸存. auto_delete 再也不使用时,是否须要自动删除队列. arguments 队列参数. policy 应用到队列上的策略名称. pid 关联队列的Erlang进程ID. owner_pid 表示队列专用全部者的表明链接的Erlang进程ID.若是队列是非专用的,此值将为空. exclusive True:若是队列是专用的(即有owner_pid), 反之false exclusive_consumer_pid 表示此channel的专用消费者订阅到此队列的Erlang进程Id. 若是没有专用消费者,则为空. exclusive_consumer_tag 专用消费者订阅到此队列的Consumer 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 队列中全部消息体的大小总和.这不包括消息属性(包括headers) 或任何开销(overhead)。 message_bytes_ready 相似于message_bytes ,但只统计准备投递给clients的那些消息. message_bytes_unacknowledged 相似于message_bytes ,但只统计那些已经投递给clients但还未应答的消息 message_bytes_ram 相似于message_bytes ,但只统计那些在RAM中的消息 message_bytes_persistent 相似于message_bytes ,但只统计那些持久化的消息 head_message_timestamp 若是存在,只显示队列中第1个消息的timestamp属性. 消息的时间戳只出如今分页状况下. disk_reads 从队列启动开如,已从磁盘上读取该队列的消息总次数. disk_writes 从队列启动开始,已向磁盘队列写消息总次数. consumers 消费者数目. consumer_utilisation 时间分数(0.0与1.0之间),队列可当即向消费者投递消息. 它能够小于1.0,若是消费者受限于网络堵塞或预提取数量. memory 与队列相关的Erlang进程消耗的内存字节数,包括栈,堆以及内部结构. slave_pids 若是队列是镜像的,这里给出的是当前slaves的IDs. synchronised_slave_pids 若是队列是镜像的,当前slaves的IDs是master同步的- 即它们可在无消息丢失的状况下,接管master. state 队列状态.正常状况下是'running', 但若是队列正在同步也多是"{syncing, MsgCount}". 处于集群下的节点若是掉线了,队列状态交显示'down' (大多数queueinfoitems 将不可用). 若是没有指定queueinfoitems,那么将显示队列名称和队列深度. 例如: rabbitmqctl list_queues -p /myvhost messages consumers 此命令显示了/myvhost虚拟主机中每一个队列的深度和消费者数目.
list_exchanges [-p vhost] [exchangeinfoitem …]
返回交换器细节.若是没有指定"-p"选项,将返回 / 虚拟主机的细节. "-p" 选项可用来覆盖默认虚拟主机. exchangeinfoitem 参数用来表示哪些交换器信息要包含在结果中. 结果集中列的顺序将与参数顺序保持一致. exchangeinfoitem 可接受下面的列表中任何值: name 交换器名称. type 交换器类型(如[direct, topic, headers, fanout]). durable 当服务器重启时,交换器是否能复活. auto_delete 当再也不使用时,交换器是否须要自动删除. internal 交换器是不是内部的,即不能由client直接发布. arguments 交换器参数 policy
应用到交换器上的策略名称.
若是没有指定exchangeinfoitems,那么将会显示交换器类型和类型
例如:
rabbitmqctl list_exchanges -p /myvhost name type
此命令会显示/myvhost中每一个交换器的名称和类型.
list_bindings [-p vhost] [bindinginfoitem …]
返回绑定细节.默认状况下返回的是 / 虚拟主机上的绑定详情.可以使用"-p" 标记来覆盖默认虚拟主机. bindinginfoitem 参数用来表示结果中包含哪些绑定信息. 结果集中列的顺序将匹配参数的顺序.bindinginfoitem可接受下面列表的任意值: source_name 绑定中消息来源的名称. C中非ASCII转义字符. source_kind 绑定中消息来源的类别.当前老是exchange. C中非ASCII转义字符. destination_name 绑定中消息目的地名称.C中非ASCII转义字符. destination_kind 绑定中消息目的地的种类. C中非ASCII转义字符. routing_key 绑定的路由键,C中非ASCII转义字符. arguments 绑定参数. 若是没有指定bindinginfoitems,将会显示全部上述条目. 例如: rabbitmqctl list_bindings -p /myvhost exchange_name queue_name 此命令来显示/myvhost虚拟主机上绑定的交换器名称和队列名称.
list_connections [connectioninfoitem …]
返回TCP/IP链接统计. connectioninfoitem 参数用来表示在结果中包含哪些链接信息. 结果集中列的顺序将匹配参数的顺序. connectioninfoitem可接受下面列表的任意值: pid 与链接相关的Erlang进程ID. name 链接的可读名称. port 服务器端口. host 返回反向DNS获取的服务器主机名称,或 IP地址(反向DNS解析失败) 或者未启用. peer_port Peer 端口. peer_host 返回反向DNS获取的Peer主机名称,或 IP地址(反向DNS解析失败) 或者未启用. ssl 用Boolean来表示链接是不是SSL的. ssl_protocol SSL 协议(如. tlsv1) ssl_key_exchange SSL key exchange 算法 (如 rsa) ssl_cipher SSL cipher 算法 (如aes_256_cbc) ssl_hash SSL hash 函数 (如 sha) peer_cert_subject peer的 SSL 安全证书的主体, RFC4514形式. peer_cert_issuer peer的 SSL安全证书的发行者, RFC4514 形式. peer_cert_validity peer的SSL安全证书的有效期. state 链接状态(可为[starting, tuning, opening, running, flow, blocking, blocked, closing, closed]其中一个). channels 使用链接的channel数。 protocol 使用的AMQP协议版本(当前是{0,9,1} 或{0,8,0}). 注意,若是client请求的是AMQP 0-9 链接, 咱们会视为AMQP 0-9-1. auth_mechanism 使用的SASL认证机制,如PLAIN. user 与链接相关的用户名 vhost 虚拟主机名称,C中非ASCII转义字符. timeout 链接超时/协商的心跳间隔,秒为单位. frame_max 最大 frame 大小(字节). channel_max 此链接上channel的最大数目. client_properties 链接创建期间由client发送的信息属性. recv_oct Octets已收到. recv_cnt Packets 已收到. send_oct Octets 发送. send_cnt Packets 发送. send_pend 发送队列大小. connected_at 链接创建的日期和时间,看成timestamp. 若是没有connectioninfoitems, 那么会显示user, peer host, peer port,流量控制和内存块状态的时间 例如: rabbitmqctl list_connections send_pend port 此命令会显示发送队列的大小以及第个链接的服务器端口.
list_channels [channelinfoitem …]
返回全部当前channel上的信息,逻辑容器执行大部分 AMQP命令.这将包含最初AMQP链接的部分,以及不一样插件和其它扩展建立的channels. channelinfoitem 参数用来表示在结果集中包含哪些channel信息.结果集中列的顺序将匹配参数的顺序. channelinfoitem 可接受下面列表中的任何一个参数: pid 与链接相关的Erlang进程ID. connection channel所属的链接Erlang进程ID. name channel的可读名称. number channel的数目,在一个链接中,它有惟一的标识符. user 与channel相关的用户名称. vhost channel操做的虚拟主机. transactional True:若是channel处于事务模式,其它状况为false. confirm True:若是channel是确认模式,其它状况为false. consumer_count 在channel中接收消息的逻辑AMQP消费者数目. messages_unacknowledged 在channel中消息已投递但还未应答的消息数目. messages_uncommitted 在channel中已收到消息但尚未提交事务的消息个数. acks_uncommitted 确认收到一个还未提交的事务数。 messages_unconfirmed 还没有确认已发布消息的数目。在通道不在确认模式下时,这将是0。 prefetch_count 新消费者QoS预提取限制, 0表示无上限. global_prefetch_count 整个channel QoS预提取限制, 0表示无上限. 若是没有指定channelinfoitems,那么将显示pid, user, consumer_count,messages_unacknowledged. 例如: rabbitmqctl list_channels connection messages_unacknowledged 此命令会显示每一个channel中链接进程和未应答消息的数目.
list_consumers [-p vhost]
列举消费者, 即订阅队列的消息流. 每行将打印出由制表符分隔的已订阅队列的名称,建立并管理订阅的channel进程的标识,channel中订阅的consumer tag惟一标识符, boolean值表示投递到此消费者的消息是否须要应答,整数值表示表示预提取限制(为0表示无限制), 以及关于此消费者的任何其它参数.
status
显示 broker 状态信息,如当前Erlang节点上运行的应用程序, RabbitMQ 和 Erlang 的版本信息, OS 名称, 内存和文件描述符统计信息. (查看cluster_status 命令来找出那些节点是集群化的以及正在运行的.) 例如: rabbitmqctl status 此命令显示了RabbitMQ broker的相关信息.
environment
显示每一个运行程序环境中每一个变量的名称和值.
report
为全部服务器状态生成一个服务器状态报告,输出应该重定向到一个文件. 例如: rabbitmqctl report > server_report.txt 此命令建立了一个服务器报告,可将它附着在支持请求的电子邮件中.
eval {expr}
执行任意Erlang表达式. 例如: rabbitmqctl eval 'node().' 此命令用于返回rabbitmqctl链接的节点名称
杂项
close_connection {connectionpid} {explanation}
connectionpid 要关闭的与链接相关的Erlang进程ID. explanation 解释字符串. 指示broker关闭与Erlang进程id相关的链接(可经过list_connections 命令查看), 经过为链接客户端传递解释字符串(做为AMQP链接关闭协议的一部分). 例如: rabbitmqctl close_connection "<rabbit@tanto.4262.0>" "go away" 此命令指示RabbitMQ broker关闭与Erlang 进程id<rabbit@tanto.4262.0>相关联的链接, 同时向客户端传递go away字符串.
trace_on [-p vhost]
vhost 要开启追踪的虚拟主机的名称. 开启追踪.注意,追踪状态不是持久化的; 若是服务器重启,追踪状态将会丢失.
trace_off [-p vhost]
vhost 要中止追踪的虚拟主机名称. 中止追踪.
set_vm_memory_high_watermark {fraction}
fraction 当一个浮点数大于或等于0时,会触发流量控制新内存阈值部分。
set_vm_memory_high_watermark absolute {memory_limit}
memory_limit 流程控制触发的新内存限制, 以字节来表示大于或等于0的整数或以字符串和内存单位来表示(如 512M或1G). 可用的单位是: k, kiB: kibibytes (2^10 bytes) M, MiB: mebibytes (2^20) G, GiB: gibibytes (2^30) kB: kilobytes (10^3) MB: megabytes (10^6) GB: gigabytes (10^9)
set_disk_free_limit {disk_limit}
disk_limit 以整数或字符串单位的可用磁盘下限限制(查看vm_memory_high_watermark), 如 512M or 1G. 一旦可用磁盘空间达到这个限制,就会设置磁盘报警.
set_disk_free_limit mem_relative {fraction}
fraction 相对于整个可用内存的限制,其值为非负浮点数. 当值小于1.0时是很危险的,应该谨慎使用