随笔 - 41  文章 - 7  trackbacks - 0
<2016年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

在本章中,我们将涵盖下面的主题:
  1. 监控RabbitMQ的行为
  2. 使用RabbitMQ进行故障诊断
  3. 跟踪RabbitMQ当前活动
  4. 调试RabbitMQ的消息
  5. 当RabbitMQ重启失败时该做什么
  6. 使用Wireshark来调试
介绍
每当我们开发一个应用程序的时候,一种常见的做法是开发一个诊断基础设施. 这可以基于日志文件,SNMP 转移以及其它手段.
RabbitMQ提供了标准日志文件和内建消息故障诊断解决方案.
在前面三个食谱中,我们将看到如何来使用这三种特性.
某些时候,会存在一些阻止RabbitMQ启动的问题.在这种情况下,需要强制解决服务器上的问题并重启服务器。这一点,我们将在RabbitMQ重启失败时该做什么食谱中讲解。

然而,调试消息也是应用程序开发的一部分.在这种情况下,我们需要知道RabbitMQ和客户之间交换的准确信息.可以使用一个内建代理工具(Java client API的一部分) (查看调试RabbitMQ的消息食谱)或者使用高级网络监视工具来检查网络状况,正如我们将在使用Wireshark来调试食谱中看到的一样。
监控RabbitMQ行为
为了检查RabbitMQ的正常行为,有一个监控工具是很有用的,特别是在处理集群的时候.
有许多不同的工具,商业的或免费的, 
这有助于让它们受控于分布式系统如Nagios、Zabbix之下.
在本食谱中,我们将展示如何配置Ganglia  RabbitMQ 插件(http://sourceforge.net/apps/trac/ganglia/wiki/ganglia_quick_start).
准备
为了运行此食谱,你需要启用管理插件来配置RabbitMQ。同时,你也需要安装和配置Ganglia. 在本食谱中,我们使用的版本是3.6.0.
如何做
为了使用Ganglia监控图形来查看RabbitMQ统计数据,你需要执行下面的步骤:
1. 在你的Linux发行版上,使用yum或apt-get安装和配置Ganglia.你需要下面的包:
‰ ganglia-gmetad
‰ ganglia-gmond
‰ ganglia-gmond-python
‰ ganglia-web
‰ ganglia
2. 从https://github.com/ganglia/gmond_python_modules/blob/master/rabbit/python_modules/rabbitmq.py拷贝Python Ganglia监控插件到/usr/lib64/ganglia/python_modules.
3. 从https://github.com/ganglia/gmond_python_modules/blob/master/rabbit/conf.d/rabbitmq.pyconf拷贝Python Ganglia 配置文件到/etc/ganglia/conf.d 

4. 检查配置文件中的参数正确性.实际上, 你可能需要通过只留下默认的虚拟主机来解决以下条目:
paramvhost {
value = "/"
}
5.如果它已经运行了,使用下面的命令来重启gmond:
service gmond restart

如何工作
通过这个食谱, 你可以从Ganglia环境中来监控RabbitMQ.
TIP
对于基本的故障诊断,你可以通过日志文件来进行,默认情况下,日志文件存储于/var/log/rabbitmq.

一旦它运行起来,你就可以从同一个web界面中,看到系统信息和RabbitMQ节点、队列的相关信息,如下面的截图所示:


更多
Ganglia是集群监测一种广泛的解决方案,但不是唯一的一个。其它的解决方案还包括Nagios (www.nagios.org), Zabbix (www.zabbix.com), 以及Puppet (puppetlabs.com).

通过RabbitMQ排除故障
正如前面食谱提到的, 我们可以通过一种便利的方式,即以日志文件的方式来监控RabbitMQ行为.
也可以使用RabbitMQ自身来访问同种信息, 通过向AMQP client通知broker的活动.


准备
要运行本食谱,我们需要运行RabbitMQ以及Java client library.
如何做
为了消费日志消息,你可在Consumer.java中执行主方法.你可在Chapter12/Recipe02/Java/src/rmqexample中找到源友. 下面,我们将高亮主要步骤:
1. 创建一个临时匿名队列,并将其绑定到AMQP log交换器:
String tmpQueue = channel.queueDeclare().getQueue();
channel.queueBind(tmpQueue,"amq.rabbitmq.log","#");
2. 在消费者回调(ActualConsumer.java)中,可以检索消息和每个消息的路由键,并将它们打印出来:
String routingKey = envelope.getRoutingKey();
String message = new String(body);
System.out.println(routingKey + ": " + message);
3. 此时,你可以在broker上执行任何RabbitMQ操作,并且你会看到日志输出到标准输出上。


如何工作
RabbitMQ log交换器amq.rabbitmq.log是一个topic交换器,RabbitMQ自身用来发布其日志消息.
在我们的示例代码中,我们使用#通配符来消费所有topics的消息.
例如,通过运行另一份代码,我们可运行同一个broker的两个连接,然后中断它,我们将下面的输出:
info: accepting AMQP connection <0.2737.0> (127.0.0.1:54698 ->127.0.0.1:5672)

info: accepting AMQP connection <0.2753.0> (127.0.0.1:54699 ->127.0.0.1:5672)
warning: closing AMQP connection <0.2737.0> (127.0.0.1:54698 ->127.0.0.1:5672):
connection_closed_abruptly
warning: closing AMQP connection <0.2753.0> (127.0.0.1:54699 ->127.0.0.1:5672):
connection_closed_abruptly
值得注意的是,在这里报告的信息,信息和警告不是自己的一部分,但是我们在每个开始打印的路由键消息(前一步骤的步骤2)。

TIP
如果我们只想收到警告和错误消息,我们可以订阅相应的主题.

更多
默认情况下,日志交换器-amq.rabbitmq.log被创建在虚拟主机/中。通过在RabbitMQ配置文件中定义default_vhost从而设置其位置是可能的.

追踪RabbitMQ当前活动
有时,为了分析和调试未知的应用程序行为,我们需要追踪RabbitMQ接收和分发的所有消息.
RabbitMQ提供追踪这些消息的所谓的流水追踪工具。
追踪活动可以在运行时启用和禁用,并且它应该只用于调试,因为它规定了broker活动的开销.

准备
要运行此食谱,我们需要运行此食谱,我们需要运行RabbitMQ和Java client library.
如何做
RabbitMQ使用与日志消息中同样的机制来发送追踪消息;因此,示例代码与前一个食谱中的非常相似.

为了消费追踪消息,你可以执行Consumer.java中的主方法,你可在Chapter12/Recipe02/Java/src/rmqexample目录中找到源码.这里,我们高亮了主要步骤:
1. 创建一个临时队列,并将其绑定到AMQP log交换器上:
String tmpQueue = channel.queueDeclare().getQueue();
channel.queueBind(tmpQueue,"amq.rabbitmq.trace","#");
2.在消费者回调(ActualConsumer.java)中, 可以获取每个消息,并使用下面的代码打印出来:
String routingKey = envelope.getRoutingKey();
String message = new String(body);
Map<String,Object> headers = properties.getHeaders();
LongStringexchange_name = (LongString)
headers.get("exchange_name");
LongString node = (LongString) headers.get("node");
...
3. 可从root用户(Linux)或在RabbitMQ命令控制台(Windows)来激活firehose,其激活命令如下:
rabbimqctl trace_on
4. 此时,你可以向broker启动生产和发送消息,然后你们会在标准输出中看到追踪信息.
5. 可调用下面的命令来禁用firehose:
rabbimqctl trace_off


如何工作 
默认情况下,amq.rabbit.trace topic交换器不会接收任何消息,但一旦激活firehose后(前面步骤的步骤3),所有流经broker的消息将被按下面的规则拷贝:
1.进入broker的消息,它们是通过路由键publish.exchange-name发布的, 这里的exchange-name是消息最初发布的交换器名称.
2.离开broker的消息,它们是通过路由键deliver.queuename发布的,这里的queue-name是消息最初被消费的队列名称.
3.消息的body是从原始消息中拷贝过来的.

4.原始消息的元数据会插入到拷贝消息的header属性中. 在步骤2中,我们已经看到了,如何获取最初分发消息的交换器名称,但获取所有原始信息也是可以的,即,找到所有可有字段,并将它们插到消息属性中.firehose的官方文档链接位于:http://www.rabbitmq.com/firehose.html.

调试RabbitMQ消息
有时,通过在标准输出中记录通过broker的消息是有用的.通过RabbitMQ Java客户端提供的简单应用程序来追踪消息,也是可行的.
准备
要运行此食谱,你需要运行的RabbitMQ(运行标准端口 5672),以及RabbitMQ Java client library
如何做
RabbitMQ的Java client library中包含了一个追踪工具,你可以按下面的步骤来进行实际使用.
1. 从http://www.rabbitmq.com/java-client.html页面下载最新版本的RabbitMQ Java client library.
2. 将其解压,并进入其目录
.
3. 通过下面的命令来运行Java tracer:
./runjava.sh com.rabbitmq.tools.Tracer
4. 运行用于调试Java client,并将其连接到5673端口.对于本食谱,我们可以使用包含在Java client包中的另一个Java工具,其调用如下:
./runjava.sh com.rabbitmq.examples.PerfTest -h amqp://localhost:5673 -C 1 -D 1

如何工作
追踪工具是一个简单的AMQP代理;默认情况下,它监听5673端口,并会把所有的请求转发到默认监听5672端口的RabbitMQ broker.
所有生产或消费的消息,如同AMQP操作一样,都会记录到标准输出中.
运行前面步骤的步骤4,我们使用了包含在Java client包中另一个用于作RabbitMQ压力测试的工具.
在这里,我们只是限制了生产一个消息(-C 1) 并消费它(-D 1).
TIP
追踪工具只在Java client API中可用.

更多
可以使用下面的代码来为Java追踪程序传递更多的参数:
./runjava.sh com.rabbitmq.tools.Tracer listenPort connectHost connectPort
listenPort指的是追踪器监听的端口(默认为5673), connectHost/connectPort (默认为localhost/5672) 是用于连接并转发收到请求的主机和端口。
使用下面的命令,你可以找到所有PerfTest可用选项:
./runjava.sh com.rabbitmq.examples.PerfTest --help


也可参考
在http://www.rabbitmq.com/java-tools.html中,你可以找到Java追踪工具以及PerfTest的文档.

当RabbitMQ重启失败时,需要做什么
偶尔情况下, RabbitMQ 可能会重启失败。如果broker包含持久化数据时,这是一个严重的问题,否则,有足够的能力重设其持久化状态。
准备
要运行此食谱,你只需要一个测试RabbitMQ broker.
TIP
我们将销毁所有之前定义的数据—以避免使用生产实例.

如何做
要清空RabbitMQ, 可执行下面的简单步骤:
1. 如果RabbitMQ运行的话,停止它.
2. 定位到Mnesia 数据库目录.默认是/var/lib/rabbitmq/mnesia (Linux) or %APPDATA%\RabbitMQ\db (Windows).
3. 递归删除其目录和文件.
4. 重启RabbitMQ.

如何工作
Mnesia 数据库包含了所有运行时的RabbitMQ定义信息: 队列,交换器,用户等等.
通过删除Mnesia数据库 (或者通过重命名,这样可以在需要的时候恢复某些数据), RabbitMQ会重置到出厂默认状态,当RabbitMQ启动时,它会创建一个新的Mnesia数据库,并使用默认值进行初始化.


更多
如果broker无法在第一时间启动,有可能是某个系统目录存在权限问题:即要么是Mnesia数据库目录,要么是日志目录,要么是某些在配置文件中指定的临时的或自定义的目录.
你可以在RabbitMQ故障排除页页找到详尽的列表(http://www.rabbitmq.com/troubleshooting.html).

也可参考
在Mnesia API 文档页面(http://www.erlang.org/doc/man/mnesia.html),,你可以找到更多关于如何破解Mnesia数据库的信息.

使用Wireshark调试
在调试RabbitMQ消息食谱中,我们已经了解过了如何来追踪RabbitMQ的消息.

然而,以下情况并不总是可能的或可取的,即停止正在运行的客户端(或RabbitMQ服务器),修改它的连接端口,指向一个不同的broker;我们只想监控正在实时传递的消息,影响系统的活动应该尽可能的少。

TIP
但是,正如在前面食谱(追踪RabbitMQ当前活动)中看到的一样,激活firehose是可行的 .


Wireshark是一个免费的有能力解码AMQP消息的网络分析工具.
此工具既可用在客户段,也可以用在服务端,从而
无缝监控AMQP交通状况.

准备
要练习这个食谱,你需要运行的RabbitMQ以及RabbitMQ Java client library.

如何做
在下面的步骤中,我们将看到如何使用Wireshark来追踪AMQP消息:
1. 如果Wireshark在你的系统中尚不可用,那么需要从http://www.wireshark.org/下载和安装Wireshark . 如果可能的话,你也可以从你的发行版中进行安装,如:
yum install wireshark-gnome
2.在Linux系统中,以root用户来启动Wireshark.
3.启动从环回接口中捕获消息.
4.切换到Java client library路径下,在终端中运行下面的命令:
./runjava.sh com.rabbitmq.examples.PerfTest -C 1 -D 1
5.
停止Wireshark GUI的采集,并分析抓到的AMQP交通状况.
如何工作
使用Wireshark,可用于检测AMQP交通的退出或进行一个持有RabbitMQ服务器或客户端的服务器.
在我们的例子中,我们捕获了运行在同一台机器上服务端和客户端网络交通状况,因此连接是localhost中发生的.这也是为什么我们从环回接口中捕获交通状况的原因(前面步骤的步骤3).
反之,我们应该从网络接口中进行捕获,这种网络接口通常是eth0或其它相似的网络接口.

TIP
在Linux上,可以直接捕获localhost;但同样的操作不能应用到Windows上.在这种情况下,客户端和服务端必须位于不同的两台机器上, 并且在网络接口上(要么是物理的,要么是虚拟的)必须激活捕获, 这样它们之间才可连接.


所以,为了运行Wireshark的图形用户界面,如果RabbitMQ客户端和服务器运行在同一个节点,你需要选择环回接口,如图下面的截图所示:



TIP
在Linux上,当你安装Wireshark软件包,你通常只会有命令行界面,tshark。要安装Wireshark的GUI,你必须安装相应的软件包. 例如,在Fedora中,你需要安装wireshark-gnome包.

一旦AMQP交通已穿过环回接口,它已经被Wireshark捕获。
运行在步骤4的实验实际上在两个独立的连接中开启了一个生产者和一个消费者.
为了高亮显示,找到一个描述为Basic.PublishContent-Header的包,点击它,并选择Follow TCP stream.然后,您可以关闭显示客户端和服务器之间有效负载对话的窗口。在主窗口中,您现在可以看到在客户端和服务器之间交换的网络数据包,如下面的截图所示:



用同样的方式,你可以选择RabbitMQ server,如下面的截图所示:

在前面的两个截图中,我们已经强调了消息AMQP的有效载荷,但由于Wireshark中包括了一个非常完整的AMQP解剖器,你会发现在AMQP交通的很多细节。
更多
如果RabbitMQ配置为使用SSL,并且你想要分析加密流量,在一定条件下,通过在Wireshark配置中合理配置SSL公共/私有密钥也是可以的
可在http://wiki.wireshark.org/SSL找到更多信息.
也可参考
http://wiki.wireshark.org/AMQP,你可以找到一些关于Wireshark AMQP 解剖器的一些指南.




posted on 2016-07-20 11:39 胡小军 阅读(3946) 评论(1)  编辑  收藏 所属分类: RabbitMQ

FeedBack:
# re: RabbitMQ-CookBook-第12章-管理RabbitMQ错误条件 2016-07-21 16:57 贝蒂斯橄榄油报价
哇哦,看着好复杂的样子,嘿嘿  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: