码迷,mamicode.com
首页 > 其他好文 > 详细

RabbitMQ概念及环境搭建(四)RabbitMQ High Availability

时间:2014-12-12 19:09:16      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:rabbitmq

####################################################
RabbitMQ High Availability
####################################################
1.高可用queue
默认情况下RabbitMQ cluster中的queues位于单独的节点(queues被首次声明的节点),而exchanges和bindings存在于cluster中各节点。因而每个节点失效exchanges和bindings并无影响,单弱queues所在的节点失效就会影响该节点上存在的queues。但是。queues可以在多个节点上镜像。每个被镜像的queue包含一个master和一个或者多个slave。若原master失效则最旧的slave被提升为新的master。

publish到queue的message会被复制到各个slave、consumers无论从cluster中哪个节点连接都会连接到master上,对于已经自master上被确认的message各slave会丢弃。所以,queue镜像只是增强了可用性。并没有在各节点间均衡负载。

该方案需要RabbitMQ cluster, 不能再cluster内处理network partitions因而不推荐在WAN中使用,仅用于LAN。

2.配置镜像
通过policy进行,可在任意时刻更改,将non-mirrored queue改为mirrored queue,或者反之。需注意的是non-mirrored queue与没有slave的mirrore的queue并不相同,前者无需额外mirroring架构运行的更快。
可用的policy
ha-mode   ha-params   行为
all                              queue被mirror到cluster中所有节点。
                                 cluster中新添加节点,queue也会被mirror到该节点。
exactly   count            queue被mirror到指定数目的节点。
                                 count大于cluster中节点数则queue被mirror到所有节点。
                                 若count小于cluster中节点数,在包含mirror的某节点down后不会在其他节点建新的mirror(为避免cluster中queue migrating)
nodes     node names  queue被mirror到指定名字的节点。
                                 若任一名称在cluster中不存在并不会引发错误。
                                若指定的任何节点在queue声明时都不在线则queue在被连接到的节点创建。

关于nodes类型的policy
设置或更改nodes类型的policy可能引起原master迁移。比如原master没有出现的新的lolicy节点列表中时。RabbitMQ采取的策略是保持原master直到至少一个新的slave已经同步,一旦同步后原master马上自动失效。原consumer连接会断掉,需重连。
如,原queue在节点{A,B},A为master。来一个新的policy{C,D},会有一段时间的状态为{A,C,D},待queue同步后A上的master关闭,新的mirror为{C,D}

特殊queue:Exclusivequeues
exclusive queues不会被镜像(mirror)也不会被持久化(durable),即使被声明为如此。因为一但存放queue的节点down了上边的连接也会断掉,对于exclusive queues相关的queue会被马上删除。

3.镜像配置示例(可通过多种方式)
下面的例子将“ha.”开头的queue mirror到cluster中所有节点
rabbitmqctl   rabbitmqctl set_policy ha-all "^ha\." ‘{"ha-mode":"all"}‘
HTTP API    PUT /api/policies/%2f/ha-all {"pattern":"^ha\.", "definition":{"ha-mode":"all"}}
Web UI        Navigate to Admin > Policies > Add / update a policy.
                  Enter "ha-all" next to Name, "^ha\." next to Pattern, and "ha-mode" = "all" in the first line next to Policy.
                  Click Add policy.

下面的例子将“two.”开头的queue mirror到cluster中两个节点,且自动同步
rabbitmqctl    rabbitmqctl set_policy ha-two "^two\." ‘{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}‘
HTTP API    PUT /api/policies/%2f/ha-two {"pattern":"^two\.", "definition":{"ha-mode":"exactly", "ha-params":2,"ha-sync-mode":"automatic"}}
Web UI        Navigate to Admin > Policies > Add / update a policy.
                   Enter "ha-two" next to Name and "^two\." next to Pattern.
                   Enter "ha-mode" = "exactly" in the first line next to Policy, then "ha-params" = 2 in the second line, then "ha-sync-mode" = "automatic" in the third, and set the type on the second line to "Number".
                   Click Add policy.


下面的例子将“nodes.”开通的queue mirror到cluster中特定的node
rabbitmqctl   rabbitmqctl set_policy ha-nodes "^nodes\." ‘{"ha-mode":"nodes","ha-params":["nodeA", "nodeB"]}‘
HTTP API    PUT /api/policies/%2f/ha-nodes {"pattern":"^nodes\.", "definition":{"ha-mode":"nodes", "ha-params":["nodeA", "nodeB"]}
Web UI        Navigate to Admin > Policies > Add / update a policy.
                   Enter "ha-nodes" next to Name and "^nodes\." next to Pattern.
                   Enter "ha-mode" = "nodes" in the first line next to Policy, then "ha-params" in the second line, set the second line‘s type to "List", and then enter "nodeA" and "nodeB" in the sublist which appears.
                  Click Add policy.

4.其他注意事项

参考:
http://www.rabbitmq.com/ha.html

RabbitMQ概念及环境搭建(四)RabbitMQ High Availability

标签:rabbitmq

原文地址:http://blog.csdn.net/zyz511919766/article/details/41896823

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!