RabbitMQ Network Partitions 服务日志对比

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 如果你一直使用RabbitMQ作为业务的消息中间件,难免会遇到网络分区(Network Partitions)的故障,也许你当时会束手无策,一脸懵逼,不过希望在看完这篇文章之后,能给你一点解决网络分区的思路。

如果你一直使用RabbitMQ作为业务的消息中间件,难免会遇到网络分区(Network Partitions)的故障,也许你当时会束手无策,一脸懵逼,不过希望在看完这篇文章之后,能给你一点解决网络分区的思路。

RabbitMQ中所有节点状态的变更都会记录在日志当中,日志默认地址为:$RABBITMA_HOME/var/log/rabbitmq/rabbit@node*.log。所以当网络分区发生的时候可以根据日志内容来推测出当时发生网络分区的原因,进而据此优化你的业务逻辑,增强应用的鲁棒性。

本文只展示在模拟发生网络分区前后的日志对比,方便在查看日志的时候可以提供一个参考。

本文之后的RabbitMQ集群有两个节点组成,分别为rabbit@node1和rabbit@node2。
模拟网络分区的方法:关闭node2节点的网卡(ifdown eth0),之后再恢复。注:测试采用的两个节点都是单网卡的。
网络分区的恢复方法:关闭node2节点(rabbitmqctl stop),之后再恢复node节点(rabbitmq-server -detached)即可恢复网络分区。
网络分区的查看方式:rabbitmqctl cluster_status命令之后查看partititons中是否有相关节点信息。或者也可以通过WebUI的方式查看。

具体执行步骤以及两个节点的日志对比如下所示。
1.在node2上执行ifdown eth0。
node1中打印日志如下

=ERROR REPORT==== 24-Jun-2017::17:08:55 ===
** Node 'rabbit@node2' not responding **
** Removing (timedout) connection **

=INFO REPORT==== 24-Jun-2017::17:08:55 ===
rabbit on node 'rabbit@node2' down

=INFO REPORT==== 24-Jun-2017::17:08:55 ===
node 'rabbit@node2' down: net_tick_timeout

node2打印日志:

NG REPORT==== 24-Jun-2017::17:35:31 ===
epmd does not know us, re-registering rabbit at port 25672

=ERROR REPORT==== 24-Jun-2017::17:36:00 ===
** Node 'rabbit@node1' not responding **
** Removing (timedout) connection **

=INFO REPORT==== 24-Jun-2017::17:36:00 ===
rabbit on node 'rabbit@node1' down

=INFO REPORT==== 24-Jun-2017::17:36:00 ===
node 'rabbit@node1' down: net_tick_timeout

之后如果不执行任何操作,node2每隔1min会打印日志(忽略下面的具体日期):

NG REPORT==== 24-Jun-2017::xx:xx:xx ===
epmd does not know us, re-registering rabbit at port 25672

2.在node2上执行ifup eth0。
node1之后打印日志如下:

=INFO REPORT==== 24-Jun-2017::17:10:32 ===
node 'rabbit@node2' up

=ERROR REPORT==== 24-Jun-2017::17:10:32 ===
Mnesia('rabbit@node1'): ** ERROR ** mnesia_event got {inconsistent_database, running_partitioned_network, 'rabbit@node2'}

node2打印日志:

=INFO REPORT==== 24-Jun-2017::17:42:21 ===
node 'rabbit@node1' up

=ERROR REPORT==== 24-Jun-2017::17:42:21 ===
Mnesia('rabbit@node2'): ** ERROR ** mnesia_event got {inconsistent_database, running_partitioned_network, 'rabbit@node1'}

3.此时在node1上执行rabbitmqctl cluster_status可以看到:

[root@node1 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@node1' ...
[{nodes,
     [{disc,
          ['rabbit@node1','rabbit@node2']}]},
 {running_nodes,['rabbit@node1']},
 {cluster_name,<<"rabbit@node1">>},
 {partitions,
     [{'rabbit@node1',['rabbit@node2']}]}]

4.此时在node2上执行rabbitmqctl cluster_status可以看到:

[root@node2 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@node2' ...
[{nodes,
     [{disc,
          ['rabbit@node1','rabbit@node2']}]},
 {running_nodes,['rabbit@node2']},
 {cluster_name,<<"rabbit@node1">>},
 {partitions,
     [{'rabbit@node2',['rabbit@node1']}]}]

此时可以判断已经出现了网络分区,之后恢复网络分区。


5.在node2上执行rabbitmqctl stop之后。
可以看到node1的日志:

=INFO REPORT==== 24-Jun-2017::17:25:11 ===
rabbit on node 'rabbit@node2' down

=INFO REPORT==== 24-Jun-2017::17:25:12 ===
Keep rabbit@node2 listeners: the node is already back

=INFO REPORT==== 24-Jun-2017::17:25:13 ===
node 'rabbit@node2' down: connection_closed

note2中的日志:

=INFO REPORT==== 24-Jun-2017::17:56:21 ===
Stopping RabbitMQ

=INFO REPORT==== 24-Jun-2017::17:56:21 ===
stopped TCP Listener on [::]:5672

=INFO REPORT==== 24-Jun-2017::17:56:21 ===
Stopped RabbitMQ application

=INFO REPORT==== 24-Jun-2017::17:56:21 ===
Halting Erlang VM

6.在node2上执行rabbitmq-server -detached以恢复网络分区。
此时node1的日志为:

=INFO REPORT==== 24-Jun-2017::17:58:27 ===
node 'rabbit@node2' up

=INFO REPORT==== 24-Jun-2017::17:58:27 ===
rabbit on node 'rabbit@node2' up

此时node2的日志为:

ERROR REPORT==== 24-Jun-2017::17:58:55 ===
Mnesia('rabbit@node2'): ** ERROR ** mnesia_event got {inconsistent_database, starting_partitioned_network, 'rabbit@node1'}

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
Starting RabbitMQ 3.5.7 on Erlang 19.1
Copyright (C) 2007-2015 Pivotal Software, Inc.
Licensed under the MPL.  See http://www.rabbitmq.com/

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
node           : rabbit@node2
home dir       : /root
config file(s) : /opt/rabbitmq/sbin/../etc/rabbitmq/rabbitmq.config (not found)
cookie hash    : VCwbL3S9/ydrGgVsrLjVkA==
log            : /opt/rabbitmq/sbin/../var/log/rabbitmq/rabbit@node2.log
sasl log       : /opt/rabbitmq/sbin/../var/log/rabbitmq/rabbit@node2-sasl.log
database dir   : /opt/rabbitmq/sbin/../var/lib/rabbitmq/mnesia/rabbit@node2

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
Memory limit set to 392MB of 980MB total.

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
Disk free limit set to 50MB

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
Limiting to approx 924 file handles (829 sockets)

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
FHC read buffering:  ON
FHC write buffering: ON

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
Priority queues enabled, real BQ is rabbit_variable_queue

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
msg_store_transient: using rabbit_msg_store_ets_index to provide index

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
msg_store_persistent: using rabbit_msg_store_ets_index to provide index

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
started TCP Listener on [::]:5672

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
rabbit on node 'rabbit@node2' up

=INFO REPORT==== 24-Jun-2017::17:58:55 ===
Server startup complete; 0 plugins started.

此时可以在任何一个节点中输入rabbitmqctl cluster_status命令
之后可以看到:

[root@node1 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@node1' ...
[{nodes,[{disc,['rabbit@node1', 'rabbit@node2']}]},
 {running_nodes,['rabbit@node2','rabbit@node1']},
 {cluster_name,<<"rabbit@node1">>},
 {partitions,[]}]

只要看到partitions中没有任何节点信息即表示网络分区消失。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
3月前
|
Web App开发 存储 监控
iLogtail 开源两周年:UC 工程师分享日志查询服务建设实践案例
本文为 iLogtail 开源两周年的实践案例分享,讨论了 iLogtail 作为日志采集工具的优势,包括它在性能上超越 Filebeat 的能力,并通过一系列优化解决了在生产环境中替换 Filebeat 和 Logstash 时遇到的挑战。
149 14
|
7月前
|
消息中间件 开发工具 RocketMQ
消息队列 MQ产品使用合集之如何关闭客户端的日志记录
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
7月前
|
传感器 数据采集 监控
基于阿里云MQTT服务,设计一个STM32的智能光伏控制系统
这篇文章详细介绍了利用STM32F103C8T6单片机实现光伏发电系统的关键技术。全文分为四章:第一章阐述了光伏发电的背景、意义及应用场景,强调其在绿色能源领域的重要性。第二章介绍了如何通过STM32F103C8T6及光敏电阻和伺服电机实现光线追踪系统,详细描述了硬件选择、连接及使用HAL库编写的单片机程序。第三章讲解了最大功率点追踪(MPPT)的原理,并展示了如何利用STM32F103C8T6和相关传感器、DC-DC转换器实现MPPT功能。第四章描述了如何通过STM32F103C8T6与SIM7600CE 4G模块连接到阿里云MQTT服务,实现设备状态数据的远程传输和控制。本文提供了全面的硬
17759 5
|
3月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
49 1
EMQ
|
6月前
|
物联网 Linux C语言
在 Windows 平台搭建 MQTT 服务
NanoMQ 有着强大的跨平台和可兼容能力,不仅可以用于以 Linux 为基础的各类平台,也为 Windows 平台提供了 MQTT 服务的新选择。
EMQ
128 8
在 Windows 平台搭建 MQTT 服务
|
3月前
|
存储 缓存 网络协议
搭建dns服务常见报错--查看/etc/named.conf没有错误日志信息却显示出错(/etc/named.conf:49: missing ‘;‘ before ‘include‘)及dns介绍
搭建dns服务常见报错--查看/etc/named.conf没有错误日志信息却显示出错(/etc/named.conf:49: missing ‘;‘ before ‘include‘)及dns介绍
233 0
|
4月前
|
SQL 人工智能 运维
在阿里云日志服务轻松落地您的AI模型服务——让您的数据更容易产生洞见和实现价值
您有大量的数据,数据的存储和管理消耗您大量的成本,您知道这些数据隐藏着巨大的价值,但是您总觉得还没有把数据的价值变现出来,对吗?来吧,我们用一系列的案例帮您轻松落地AI模型服务,实现数据价值的变现......
267 3
|
5月前
|
Ubuntu Linux 测试技术
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
|
7月前
|
消息中间件 负载均衡 开发工具
消息队列 MQ产品使用合集之当一个服务出现堆积后,为什么不把后面的流量负载到其它服务上
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
消息队列 MQ产品使用合集之当一个服务出现堆积后,为什么不把后面的流量负载到其它服务上
|
5月前
|
API
【Azure 服务总线】查看Service Bus中消息多次发送的日志信息,消息是否被重复消费
【Azure 服务总线】查看Service Bus中消息多次发送的日志信息,消息是否被重复消费
下一篇
开通oss服务