简介
RabbitMQ是用erlang开发的,集群很是方便,由于erlang天生就是一门分布式语言,但其自己并不支持负载均衡。
Rabbit模式大概分为如下三种:单一模式、普通模式、镜像模式node
RabbitMQ工做模式
单一模式 (最简单的状况,非集群模式)nginx
- 普通模式 (默认的集群模式)
- 流程
- 对于Queue来讲,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。
- 当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并通过B发送给consumer。
- 问题
- 该模式存在一个问题就是当A节点故障后,B节点没法取到A节点中还未消费的消息实体。
- 若是作了消息持久化,那么得等A节点恢复,而后才可被消费;若是没有持久化的话,而后就没有而后了
- 镜像模式
- 流程
- 把须要的队列作成镜像队列,存在于多个节点,属于RabbitMQ的HA方案。
- 消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。
- 问题
- 下降系统性能
- 集群带宽大大消耗(若是镜像队列数量过多,加之大量的消息进入)
- 优势
- 集群说明
- 一个rabbitmq集 群中能够共享 user,vhost,queue,exchange等,全部的数据和状态都是必须在全部节点上复制的
集群搭建
- 操做步骤(node1为主,node2,node3为从,node4为proxy)
- 在 192.168.0.1(node1)、192.168.0.2(node2)、192.168.0.3(node3) 三个节点上安装,而后开启 RabbitMQ 监控插件
- node1
- .erlang.cookie文件拷贝到 node二、node3
- node1,node2,node3
rabbitmqctl stop
// 中止Rabbit
rabbitmq-server -detached
//
- node2,node3
- rabbitmqctl stop
- rabbitmqctl join_cluster rabbit@node1
- rabbitmqctl start_app
- node4
- 做为proxy指向node1,node2,node3(用于透明调用使用)
- 固然,你也能够经过var connection = factory.CreateConnection(["ip1","ip2"].ToList());
- cli
rabbitmqctl cluster_status
// 检查集群状态
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
// 添加策略
- gui(若是cli不方便的话)

说明