[rabbitmq-discuss] Problems with the {cluster_partition_handling, pause_minority} option
Simon MacMullen
simon at rabbitmq.com
Tue Mar 18 09:54:27 GMT 2014
Hi. Just to let you know that this has not been forgotten about. I have
reproduced the problem you describe and am investigating it. The key
factor seems to be (at a TCP level) that A realises it is disconnected
from B but not vice versa. Therefore (at an Erlang level) the partition
is not detected.
It's not specifically to do with pause_minority mode.
I'll post more information when I have it.
Cheers, Simon
On 05/03/2014 17:18, David Rodrigues wrote:
> Dear RabbitMQ Community,
>
> I'm having some problems with the {cluster_partition_handling,
> pause_minority} option and I would like to share with you my doubts.
>
> First, the architecture. I'm running RabbitMQ 3.2.4 (Erlang R14A) on 3
> nodes (rabbitmq at rabbitmq-test01, rabbitmq at rabbitmq-test02 and
> rabbitmq at rabbitmq-test03) on a virtualized platform - quite similar to
> EC2. And because of that I have, from time to time, connectivity issues
> – I know, that's bad ;)
>
> Digging into the doc I have found that the best way to handle the
> problem is using the pause_minority option -
> https://www.rabbitmq.com/partitions.html.
>
> But from time to time my nodes get disconnected from each other and do
> not recover automatically. Hopefully I have managed to reproduce the
> problem. Here are the steps.
>
> THE CONFIGURATION FILE
> ***********************************************************
>
> My configuration file is quite simple:
>
> %% -*- mode: erlang -*-
> [
> {rabbit,
> [
> {auth_mechanisms, ['PLAIN', 'AMQPLAIN']},
> {default_vhost, <<"/">>},
> {default_user, <<"admin">>},
> {default_pass, <<"admin">>},
> {default_permissions, [<<".*">>, <<".*">>, <<".*">>]},
> {default_user_tags, [administrator]},
> {cluster_partition_handling, pause_minority},
> {cluster_nodes, {['rabbitmq at rabbitmq-test01',
> 'rabbitmq at rabbitmq-test02', 'rabbitmq at rabbitmq-test03'], disc}}
> ]},
> {kernel, []},
> {rabbitmq_management, []},
> {rabbitmq_management_agent, []},
> {rabbitmq_shovel,
> [{shovels, []}
> ]},
> {rabbitmq_stomp, []},
> {rabbitmq_mqtt, []},
> {rabbitmq_amqp1_0, []},
> {rabbitmq_auth_backend_ldap, []}
> ].
>
> Has you can see, the {cluster_partition_handling, pause_minority} option
> is there.
>
> PAUSE_MINORITY WORKING
> ***********************************************************
>
> When the network outage is long enough, the option works perfectly.
>
> To simulate a connection problem on rabbitmq-test03 I run:
>
> iptables -A INPUT -s rabbitmq-test01 -j DROP; iptables -A OUTPUT -d
> rabbitmq-test01 -j DROP
> iptables -A INPUT -s rabbitmq-test02 -j DROP; iptables -A OUTPUT -d
> rabbitmq-test02 -j DROP
>
> Then wait long enough for the following messages to appear in the logs
> of rabbitmq-test03 (approximately 180 seconds):
>
> =ERROR REPORT==== 5-Mar-2014::16:51:02 ===
> ** Node 'rabbitmq at rabbitmq-test02' not responding **
> ** Removing (timedout) connection **
> =ERROR REPORT==== 5-Mar-2014::16:51:02 ===
> ** Node 'rabbitmq at rabbitmq-test01' not responding **
> ** Removing (timedout) connection **
> =INFO REPORT==== 5-Mar-2014::16:51:02 ===
> rabbit on node 'rabbitmq at rabbitmq-test02' down
> =WARNING REPORT==== 5-Mar-2014::16:51:30 ===
> Cluster minority status detected - awaiting recovery
> =INFO REPORT==== 5-Mar-2014::16:51:30 ===
> rabbit on node 'rabbitmq at rabbitmq-test01' down
> =INFO REPORT==== 5-Mar-2014::16:51:30 ===
> Stopping RabbitMQ
> =INFO REPORT==== 5-Mar-2014::16:51:30 ===
> stopped TCP Listener on [::]:5672
> =WARNING REPORT==== 5-Mar-2014::16:51:58 ===
> Cluster minority status detected - awaiting recovery
>
> When flushing the rules (iptables -F) the connectivity is reestablished
> and the cluster works perfectly.
>
> In the logs:
>
> =INFO REPORT==== 5-Mar-2014::16:52:58 ===
> started TCP Listener on [::]:5672
> =INFO REPORT==== 5-Mar-2014::16:52:58 ===
> rabbit on node 'rabbitmq at rabbitmq-test01' up
> =INFO REPORT==== 5-Mar-2014::16:52:58 ===
> rabbit on node 'rabbitmq at rabbitmq-test02' up
>
> Finally the cluster status :
>
> Cluster status of node 'rabbitmq at rabbitmq-test03' ...
> [{nodes,[{disc,['rabbitmq at rabbitmq-test01','rabbitmq at rabbitmq-test02',
> 'rabbitmq at rabbitmq-test03']}]},
> {running_nodes,['rabbitmq at rabbitmq-test01','rabbitmq at rabbitmq-test02',
> 'rabbitmq at rabbitmq-test03']},
> {partitions,[]}]
> ...done.
>
> So far, so good. The option works flawlessly.
>
> PAUSE_MINORITY NOT WORKING
> ***********************************************************
>
> Life is not so bright when the network partition is not long enough.
>
> On rabbitmq-test03 I will run my iptables commands again:
>
> iptables -A INPUT -s rabbitmq-test01 -j DROP; iptables -A OUTPUT -d
> rabbitmq-test01 -j DROP
> iptables -A INPUT -s rabbitmq-test02 -j DROP; iptables -A OUTPUT -d
> rabbitmq-test02 -j DROP
>
> However this time I'll only wait 60 seconds before flushing my rules
> with iptables -F.
>
> And that's the result in rabbitmq-test03 logs:
>
> =INFO REPORT==== 5-Mar-2014::16:55:00 ===
> rabbit on node 'rabbitmq at rabbitmq-test02' down
> =ERROR REPORT==== 5-Mar-2014::16:55:00 ===
> Mnesia('rabbitmq at rabbitmq-test03'): ** ERROR ** mnesia_event got
> {inconsistent_database, running_partitioned_network,
> 'rabbitmq at rabbitmq-test02'}
> =INFO REPORT==== 5-Mar-2014::16:55:00 ===
> rabbit on node 'rabbitmq at rabbitmq-test01' down
> =INFO REPORT==== 5-Mar-2014::16:55:00 ===
> Statistics database started.
> =INFO REPORT==== 5-Mar-2014::16:55:00 ===
> Statistics database started.
>
> Again, the result is quiet ugly on rabbitmq-test01:
>
> =ERROR REPORT==== 5-Mar-2014::16:55:00 ===
> ** Node 'rabbitmq at rabbitmq-test03' not responding **
> ** Removing (timedout) connection **
> =INFO REPORT==== 5-Mar-2014::16:55:00 ===
> rabbit on node 'rabbitmq at rabbitmq-test03' down
> =INFO REPORT==== 5-Mar-2014::16:55:01 ===
> global: Name conflict terminating {rabbit_mgmt_db,<2669.1582.0>}
>
> Finally my cluster status:
>
> Cluster status of node 'rabbitmq at rabbitmq-test03' ...
> [{nodes,[{disc,['rabbitmq at rabbitmq-test01','rabbitmq at rabbitmq-test02',
> 'rabbitmq at rabbitmq-test03']}]},
> {running_nodes,['rabbitmq at rabbitmq-test03']},
> {partitions,[{'rabbitmq at rabbitmq-test03',['rabbitmq at rabbitmq-test02']}]}]
> ...done.
>
> That's it. Even with the pause_minority option my cluster was disintegrated.
>
> SYNOPSIS
> ***********************************************************
>
> In short, if the network outage is long enough everything goes according
> to the plan and the cluster works perfectly once the connectivity is
> reestablished. However if the network outage has a intermediate duration
> (not too short, not too long) the pause_minority option seems not to work.
>
> Are you aware of this problem? Is there any solution to cope with this
> particular situation?
>
> Thanks,
> David
>
>
> _______________________________________________
> rabbitmq-discuss mailing list
> rabbitmq-discuss at lists.rabbitmq.com
> https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
>
More information about the rabbitmq-discuss
mailing list