热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

消息队列_RabbitMQ0003.深入RabbitMQ节点/配置/管理及日志实时化?

消息,队列,rabbitmq,0003,深入,rabbitmq,节点,配置,管理

理解节点:

wKiom1g-uaTCdtw6AAEYIXnpveA102.png

说明: 节点是指Erlang节点,而且节点之间支持相互通信,RabbitMQ应用跑在Erlang节点之上,应用崩溃,Erlang节点会自动尝试重启应用程序,前提是Erlang本身没有崩溃,节点日志默认位于var/log/rabbitmq/rabbit@hostname.log


基本管理:


启动节点: rabbitmq-server -detached

关闭节点: rabbitmqctl stop -n rabbit@hostname


说明: rabbitmq-server启动后会自动启动Erlang节点之上的所有应用,新版本前台运行时ctrl+c时会自动停止整个节点而不在询问,rabbitmqctl作为几乎所有的RabbitMQ管理的一站式解决方案,所以更推荐使用stop优雅关闭整个节点,节点一旦关闭,上层的应用程序自然也会全部关闭.


配置文件:


etc/rabbitmq/rabbitmq-env.conf

说明: 此配置文件主要用于定义节点环境变量,具体可参考(http://www.rabbitmq.com/configure.html#define-environment-variables)

etc/rabbitmq/rabbitmq.config

说明: 此匹配文件主要用于定义节点组件配置,具体可参考(http://www.rabbitmq.com/configure.html#configuration-file)


应用管理:


关闭应用: rabbitmqctl stop_app

开启应用: rabbitmqctl start_app


注意: stop_app只会停止应用程序而不会停止Erlang节点,常用于集群加入之前停止应用程序,把节点重置为原始状态


用户管理:

添加用户: rabbitmqctl add_user root qwertyuiop

删除用户: rabbitmqctl delete_user root

列出用户: rabbitmqctl list_users

更改密码: rabbitmqctl change_password root qwertyuiop

验证密码: rabbitmqctl authenticate_user root qwertyuiop


权限管理:

wKiom1g-udyxp7WpAADseamvr0g504.png

设置权限: rabbitmqctl set_permissions -p / root ".*" ".*" ".*"

更改权限: rabbitmqctl set_permissions -p / root "" "salt-.*" ".*"

清除权限: rabbitmqctl clear_permissions -p / root

列出权限: rabbitmqctl list_permissions

用户权限: rabbitmqctl list_user_permissions root


说明: 访问控制条目包含目标Vhost,目标帐号,配置权限,写权限,读权限,如上-p后必须跟目标Vhost,后面的三个正则表达式参数".*",".*",".*"分别表示配置权限正则,写权限正则,读权限正则,"" "salt-.*" ".*"表示完全阻止配置操作,允许对salt-开头的队列和交换机写,对所有的队列和交换机可读.


案例驱动:

wKioL1g-ugjyYzuyAAB8gDmvJfc559.png

说明: 为了演示RabbitMQ交换机/队列/绑定管理操作,按照如上图创建一个主题交换机绑定三个队列分别用于接收所有错误日志(绑定路由键*.errs),所有日志(绑定路由键alls.*),正常日志(绑定路由键*.info)


> 生产者

#!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # OsChina: http://xmdevops.blog.51cto.com/ # Purpose: # """ # 说明: 导入公共模块 import sys import pika # 说明: 导入其它模块 if __name__ == '__main__':     # 创建凭证对象     credentials = pika.PlainCredentials('root', 'qwertyuiop')     # 创建参数对象     conn_params = pika.ConnectionParameters(         # RabbitMQ服务地址         host='127.0.0.1',         # RabbitMQ服务端口         port=5672,         # RabbitMQ登录凭证         credentials=credentials,         # RabbitMQ虚拟主机         virtual_host='/'     )     # 创建连接对象     conn_broker = pika.BlockingConnection(conn_params)     # 获取信道对象     channel = conn_broker.channel()     exchange = sys.argv[1]     routekey = sys.argv[2]     messages = sys.argv[3]     # 创建配置对象     msg_props = pika.BasicProperties()     # 设置内容类型     msg_props.content_type = 'text/plain'     # 尝试发布消息     channel.basic_publish(         # 发布消息内容         body=messages,         # 发布到交换机         exchange=exchange,         # 发布信息属性         properties=msg_props,         # 发布信息时携带的路由键         routing_key=routekey     )

> 消费者


#!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # OsChina: http://xmdevops.blog.51cto.com/ # Purpose: # """ # 说明: 导入公共模块 import pika # 说明: 导入其它模块 if __name__ == '__main__':     # 创建凭证对象     credentials = pika.PlainCredentials('root', 'qwertyuiop')     # 创建参数对象     conn_params = pika.ConnectionParameters(         # RabbitMQ服务地址         host='127.0.0.1',         # RabbitMQ服务端口         port=5672,         # RabbitMQ登录凭证         credentials=credentials,         # RabbitMQ虚拟主机         virtual_host='/'     )     # 创建连接对象     conn_broker = pika.BlockingConnection(conn_params)     # 获取信道对象     channel = conn_broker.channel()     # 创建日志交换机     channel.exchange_declare(         # 交换机名称         exchange="logs-exchange",         # 交换机类型         type="topic",         # 如果同名交换机已存在依然返回成功,否则创建         passive=False,         # 声明为持久化交换机         durable=True,         # 交换机闲置也不会自动删除         auto_delete=False     )     # 创建info日志级别队列     channel.queue_declare(             # 队列名称             queue="info",             # 如果同名队列已存在依然返回成功,否则创建             passive=False,             # 声明为持久化队列             durable=True,             # 声明为非私有队列             exclusive=False,             # 队列闲置也不会自动删除             auto_delete=False     )     # 创建errs日志级别队列     channel.queue_declare(             # 队列名称             queue="errs",             # 如果同名队列已存在依然返回成功,否则创建             passive=False,             # 声明为持久化队列             durable=True,             # 声明为非私有队列             exclusive=False,             # 队列闲置也不会自动删除             auto_delete=False     )     # 创建alls日志级别队列     channel.queue_declare(             # 队列名称             queue="alls",             # 如果同名队列已存在依然返回成功,否则创建             passive=False,             # 声明为持久化队列             durable=True,             # 声明为非私有队列             exclusive=False,             # 队列闲置也不会自动删除             auto_delete=False     )     # 绑定队列     channel.queue_bind(         # 队列名称         queue="info",         # 交换机名称         exchange="logs-exchange",         # 路由键名称         routing_key="*.info"     )     channel.queue_bind(         # 队列名称         queue="errs",         # 交换机名称         exchange="logs-exchange",         # 路由键名称         routing_key="*.errs"     )     def msg_consumer(channel, method, header, body):         # 发送消息确认         channel.basic_ack(delivery_tag=method.delivery_tag)         print '#[{0}]>: {1}'.format(method.delivery_tag, body)         return     # 作为指定队列消费者     channel.basic_consume(msg_consumer, queue="info", consumer_tag="logs-exchange-info")     channel.basic_consume(msg_consumer, queue="errs", consumer_tag="logs-exchange-errs")     channel.basic_consume(msg_consumer, queue="alls", consumer_tag="logs-exchange-alls")     # 循环调用回调函数接收处理消息     channel.start_consuming()     channel.close()

说明: 测试方法非常简单,python consumer.py启动后尝试执行python producer.py logs-exchange msg.info/python producer.py logs-exchange msg.errs/python producer.py logs-exchange alls.errs关注消费者那边的变化~


队列管理:

列出队列: rabbitmqctl list_queues -p / name messages

列出队列: rabbitmqadmin  -V / list queues name messages

删除队列: rabbitmqctl eval 'IfUnused = false, IfEmpty = true, MatchRegex = <<"info">>, [rabbit_amqqueue:delete(Q, IfUnused, IfEmpty) || Q <- rabbit_amqqueue:list(), re:run(element(4, element(2, Q)), MatchRegex) =/= nomatch ].'

删除队列: rabbitmqadmin   -V / delete queue name=info


说明: list_queues默认只会列出name,messages列,如果要列出更多可以空格隔开,通过rabbitmqctl eval删除非常不方便,具体参数可以修改来删除指定的队列,当然也可以使用rabbitmqadmin调用api删除非常方便便于脚本集成,但必须开启rabbitmq_management管理.


交换管理:

列出交换: rabbitmqctl -p / list_exchanges name type

列出交换: rabbitmqadmin  -V / list exchanges name type

列出绑定: rabbitmqctl -p / list_bindings

列出绑定: rabbitmqadmin -V / list bindings

删除交换: rabbitmqadmin -V / delete exchange name=logs-exchange


说明: list_exchanges默认只会列出name,type列,如果要列出更多可以空格隔开,使用rabbitmqadmin调用api删除非常方便便于脚本集成,但必须开启rabbitmq_management管理.


插件管理:

启用插件: rabbitmq-plugins enable rabbitmq_management

关闭插件: rabbitmq-plugins disable rabbitmq_management


统计数据:

状态统计: rabbitmqctl status


还原配置:

恢复出厂: rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl start_app


日志管理:

文本读取: var/log/rabbitmq/rabbit@hostname-sasl.log

文本读取: var/log/rabbitmq/rabbit@hostname.log

日志轮询: rabbitmqctl rotate_logs .suffix

实时日志: rabbitmqadmin list exchanges查看默认交换机中有一个amq.rabbitmq.log交换机,下面代码伪造了三个零时队列分别接收routing_key为info/warning/error级别的实时日志,非常简单~


#!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # OsChina: http://xmdevops.blog.51cto.com/ # Purpose: # """ # 说明: 导入公共模块 import pika # 说明: 导入其它模块 if __name__ == '__main__':     # 创建凭证对象     credentials = pika.PlainCredentials('guest', 'guest')     # 创建参数对象     conn_params = pika.ConnectionParameters(         # RabbitMQ服务地址         host='127.0.0.1',         # RabbitMQ服务端口         port=5672,         # RabbitMQ服务凭证         credentials=credentials,         # RabbitMQ虚拟主机         virtual_host='/'     )     # 创建连接对象     conn_broker = pika.BlockingConnection(conn_params)     # 获取信道对象     channel = conn_broker.channel()     # 创建队列     channel.queue_declare(             # 队列名称             queue="amq_info",             # 如果同名队列已存在依然返回成功,否则创建             passive=False,             # 声明为非持久化队列             durable=False,             # 声明为私有队列             exclusive=True,             # 队列闲置会自动删除             auto_delete=True     )     channel.queue_declare(             # 队列名称             queue="amq_warn",             # 如果同名队列已存在依然返回成功,否则创建             passive=False,             # 声明为非持久化队列             durable=False,             # 声明为私有队列             exclusive=True,             # 队列闲置会自动删除             auto_delete=True     )     channel.queue_declare(             # 队列名称             queue="amq_errs",             # 如果同名队列已存在依然返回成功,否则创建             passive=False,             # 声明为非持久化队列             durable=False,             # 声明为私有队列             exclusive=True,             # 队列闲置会自动删除             auto_delete=True     )     # 绑定队列     channel.queue_bind(         # 队列名称         queue="amq_info",         # 交换机名称         exchange="amq.rabbitmq.log",         # 路由键名称         routing_key="info"     )     # 绑定队列     channel.queue_bind(         # 队列名称         queue="amq_warn",         # 交换机名称         exchange="amq.rabbitmq.log",         # 路由键名称         routing_key="warning"     )     # 绑定队列     channel.queue_bind(         # 队列名称         queue="amq_errs",         # 交换机名称         exchange="amq.rabbitmq.log",         # 路由键名称         routing_key="error"     )     # 消息回调处理函数     def msg_consumer(channel, method, header, body):         # 发送消息确认         channel.basic_ack(delivery_tag=method.delivery_tag)         print '#[{0}]>: {1}'.format(method.delivery_tag, body)         return     # 作为指定队列消费者     channel.basic_consume(msg_consumer, queue="amq_info", consumer_tag="amq.rabbitmq.log.info")     channel.basic_consume(msg_consumer, queue="amq_warn", consumer_tag="amq.rabbitmq.log.warn")     channel.basic_consume(msg_consumer, queue="amq_errs", consumer_tag="amq.rabbitmq.log.errs")     # 循环调用回调函数接收处理消息     channel.start_consuming()     channel.close()

说明: rabbit@hostname-sasl.log中常常会记录Erlang崩溃或错误原因,当节点无法启动时候对调试非常有用,rabbit@hostname.log会记录生产者和消费者的所有事件,调试时非常有用,rotate_logs会以.suffix为后缀切割日志,大量日志crontab轮询时非常有用.




推荐阅读
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
author-avatar
dajiang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有