rabbitmq 日志文件大小设置_RabbitMQ Network Partitions 服务日志对比

本文详细介绍了RabbitMQ在网络分区发生时的日志表现,以及如何通过日志来理解故障原因和恢复步骤。通过模拟网络分区,展示了节点在连接断开和恢复时的日志变化,并提供了检查和恢复网络分区的方法。
摘要由CSDN通过智能技术生成

如果你一直使用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,<>},

{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,<>},

{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,<>},

{partitions,[]}]

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

RabbitMQ是一个开源的消息队列系统,用于在分布式应用程序之间传递消息。它通过消息队列的方式实现了异步通信,将发送者和接收者解耦,提高了系统的可靠性和可扩展性。RabbitMQ由交换机、队列和绑定组成。消息发布者将消息发送到交换机,然后交换机根据绑定规则将消息路由到相应的队列,最后消费者从队列中接收消息。 要使用RabbitMQ,首先需要安装RabbitMQ服务并启动。可以通过下载RabbitMQ官方网站提供的安装程序进行安装。安装完成后,可以双击rabbitmq-server.bat启动脚本来启动RabbitMQ服务,然后打开服务管理,可以看到RabbitMQ正在运行。 一旦RabbitMQ服务已经安装并运行,你就可以使用RabbitMQ提供的客户端库来连接到RabbitMQ并进行相关操作,如创建队列、发送和接收消息等。在使用RabbitMQ之前,你需要先安装相应的客户端库,并在代码中引入它们。 以下是一个使用RabbitMQ的HelloWorld小案例的示例代码: ```python import pika # 连接到RabbitMQ服务器 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 声明一个队列 channel.queue_declare(queue='hello') # 发送消息 channel.basic_publish(exchange='', routing_key='hello', body='Hello, RabbitMQ!') # 关闭连接 connection.close() ``` 以上代码创建了一个名为"hello"的队列,并发送了一条消息"Hello, RabbitMQ!"到该队列。你可以根据实际需求修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值