Sto provando a configurare un cluster di server RabbitMQ, per ottenere code altamente disponibili utilizzando un'architettura server attiva/passiva. Sto seguendo questa guida:Come configurare RabbitMQ usando l'architettura Active/Passive High Availability
- http://www.rabbitmq.com/clustering.html
- http://www.rabbitmq.com/ha.html
- http://karlgrz.com/rabbitmq-highly-available-queues-and-clustering-using-amazon-ec2/
mia esigenza per l'alta disponibilità è semplice, ho due nodi (CentOS 6.4) con RabbitMQ (v3.2) e Erlang R15B03. Il Nodo1 deve essere "attivo", rispondere a tutte le richieste e il Nodo2 deve essere il nodo "passivo" che ha tutte le code e i messaggi replicati (dal Nodo1).
Per fare questo, ho configurato il seguente:
- Node1 con RabbitMQ lavorando bene in modalità non-cluster
- Nodo2 con RabbitMQ lavorando bene in modalità non-cluster
Il successivamente ho creato un cluster tra entrambi i nodi: unendo Nodo2 a Nodo1 (guida 1). Successivamente ho configurato un criterio per eseguire il mirroring delle code (guida 2), replicando tutte le code e i messaggi tra tutti i nodi del cluster. Funziona, posso collegarmi a qualsiasi nodo e pubblicare o consumare messaggi, mentre entrambi i nodi sono disponibili.
Il problema si verifica quando ho una coda "queueA" che è stata creata sul Nodo1 (master su codaA), e quando Nodo1 viene arrestato, non riesco a connettermi alla codaA nel Nodo2 per produrre o consumare messaggi, Node2 genera un errore che dice che Node1 non è accessibile (penso che la codaA non sia replicata al Nodo2 e che il Nodo2 non possa essere promosso come master della codaA).
L'errore è:
{ "L'operazione di AMQP è stata interrotta: AMQP primo motivo, iniziata da Peer, il codice = 404, text = \" NOT_FOUND - casa nodo 'di coniglio @ node1' di durevole coda 'queueA' in vhost 'app01' è giù o inaccessibile \ "classid = 50, methodId = 10, la causa ="}
La sequenza dei passaggi utilizzati è:
Node1:
1. rabbitmq-server -detached
2. rabbitmqctl start_app
Node2:
3. Copy .erlang.cookie from Node1 to Node2
4. rabbitmq-server -detached
al cluster (Node2):
5. rabbitmqctl stop_app
6. rabbitmqctl join_cluster [email protected]
7. rabbitmqctl start_app
Configura coda politica mirroring:
8. rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
Nota: Il modello utilizzato per i nomi delle code è "" (tutte le code).
Quando eseguo "rabbitmqctl list_policies" e "rabbitmqctl cluster_status" è tutto ok.
Perché il Nodo2 non può rispondere se il Nodo1 non è disponibile? C'è qualcosa di sbagliato in questa configurazione?
Quali proprietà hanno la coda e i messaggi inviati? Il tuo cluster conserva i messaggi? (una specie di configurazione del cluster quando si imposta un nodo) Date anche un'occhiata qui: http://stackoverflow.com/a/23224388/1248724 – Zarathustra