[rabbitmq-discuss] RabbitMQ Clustering with Federation
Simon MacMullen
simon at rabbitmq.com
Thu Aug 1 16:55:13 BST 2013
No, at the moment that's only for federation. This may change in future.
Cheers, Simon
On 01/08/2013 4:53PM, Robert Parker wrote:
> Ah, so is there a way to alleviate the need for both the publisher (in
> our case, mass transit) or the consumer (a .net reporting app) to use
> load balancer VIP for client connections to any cluster using a compound
> connection string via the .NET API? That is, is it possible to use
> something similar to
> '{"uri":["amqp://remote1-__node1","amqp://remote1-node2"]}' on the
> client side for either publishing or consuming such that we don't need
> an external load balancer at all to achieve high availability for BOTH
> client connections and federation connections?
>
>
> Thanks,
> Robert
>
>
> On Thu, Aug 1, 2013 at 10:34 AM, Simon MacMullen <simon at rabbitmq.com
> <mailto:simon at rabbitmq.com>> wrote:
>
> On 31/07/2013 5:35PM, Robert Parker wrote:
>
> I'm having some trouble getting the right architecture configured to
> support rabbitmq federation in a clustered high availability
> environment. Our basic setup is four clusters of two nodes each
> which
> are separated by a WAN.
>
> "home" is the "home" cluster and "remote1", "remote2" and
> "remote3" are
> remote clusters. There are a lot of queues being created and
> published
> to via the API identically on all clusters but I only want to
> federate
> ONE of the queues, which is called "EventListener" back to the
> "home"
> cluster from all the "remote" clusters. I want messages
> published to
> this queue on each remote cluster to be federated to the home
> cluster to
> be consumed by a separate event listener service that only lives
> at the
> "home" site.
>
>
> Just to be clear: you are aware that (currently) it's only
> *exchanges* which can be federated, not queues?
>
> Each cluster is configured with:
>
>
> <snip>
>
> We have configured three hardware load balancer VIPs that load
> balance
> connections on port 5672 between both nodes in each cluster, and
> have
> configured federation upstreams to use these and also configured our
> application to use these VIPs for queue/exchange creation and for
> publishing messages. Here's our federation config script thats
> run on
> node1 of the home cluster only:
>
>
> <snip>
>
> However I am noticing that the "rabbitmqctl eval
> 'rabbit_federation_status:__status()." command only shows federation
> config on node2 of the home cluster despite having been
> configured on node1:
>
>
> Federation works by establishing link(s) from the downstream to the
> upstream(s). You can define the upstreams on any node in the
> downstream cluster (the configuration is cluster-wide) and the
> cluster will arbitrarily start the link processes on any node (and
> will migrate them around the cluster if nodes go down).
>
> *However*, rabbit_federation_status:__status() will only report
> links that are running on the local node. This is probably not well
> documented. Hmm. Let's fix that.
>
> (The HTTP API exported by rabbitmq_federation_management will report
> links on all nodes.)
>
> <snip>
>
> And I'm noticing that messages published to the queues via the load
> balancer VIPs to the remote clusters are not showing up in the
> "EventListener" queue of the home cluster.
>
>
> Note that you have federated an exchange called "EventListener", not
> a queue. So if you bind a queue to the exchange "EventListener" on
> home, and publish to the exchange "EventListener" on remote1/2/3
> then you should see messages turning up in the queue on home. Is
> that what you're doing?
>
> Is this not the right way to set this up?
>
>
> It sounds like you're basically right, apart from the exchange vs
> queue thing.
>
> Is it possible to configure
> this without using an external load balancer and still achieve high
> availability?
>
>
> Since 3.1.0, yes. You can specify multiple URIs in a single
> upstream, and federation will connect to a randomly chosen one (and
> keep retrying different ones if that one goes down). Use something like:
>
> rabbitmqctl set_parameter federation-upstream remote1-upstream
> '{"uri":["amqp://remote1-__node1","amqp://remote1-node2"]__,"expires":3600000}'
>
> If I federate to a single node of a cluster directly,
> what happens if that node goes down?
>
>
> If you only specify one URI, it will keep retrying until that node
> comes back up.
>
> Do I have to configure redundant
> federation between every node of home cluster to every node of each
> remote cluster?
>
>
> No - since the config is shared across the cluster. So you can set
> up the upstreams on one node of the home cluster, pointing to all
> nodes of the remote clusters.
>
> If I don't use a load balancer VIP to publish to from my
> application, if the single node of the cluster I've configured goes
> down, it wont help me that the other node is still available.
>
>
> Not sure what you mean here. Hopefully I've explained enough now.
>
> Cheers, Simon
>
> --
> Simon MacMullen
> RabbitMQ, Pivotal
>
>
--
Simon MacMullen
RabbitMQ, Pivotal
More information about the rabbitmq-discuss
mailing list