夫天地者,万物之逆旅;光阴者,百代之过客。而浮生若梦,为欢几何?
RabbitMQ 入门篇之—集群高可用

RabbitMQ集群模式

RabbitMQ集群模式分为3种:Cluster、Federation、Shovel,其中Cluster是最常用的集群模式。


Cluster 

Cluster模式的集群不支持跨网段,用于同一个网段内的局域网
可以随意的动态增加或者减少
节点之间需要运行相同版本的RabbitMQ和Erlang


Federation 

Federation模式集群应用于广域网,允许单台服务器上的交换机或队列接收发布到另一台服务器上交换机或队列的消息,可以是单独机器或集群。federation队列类似于单向点对点连接,消息会在联盟队列之间转发任意次,直到被消费者接受。通常使用federation来连接internet上的中间服务器,用作订阅分发消息或工作队列。


Shovel 

Shovel集群模式连接方式与federation的连接方式类似,但它工作在更低层次。可以应用于广域网

Cluster集群镜像模式

RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。 


普通模式: 默认的集群模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。  


镜像模式: 将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。


镜像模式配置:  

镜像队列的设置可以通过 命令行和图形界面管理平台。 

命令格式为:rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority] 

-p Vhost: 可选参数,针对指定vhost下的queue进行设置 

Name: policy的名称 

Pattern: queue或exchange的匹配模式(正则表达式) 

Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode      

    ha-mode:指明镜像队列的模式,有效值为 all、exactly、nodes          

        all:表示在集群中所有的节点上进行镜像          

        exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定          

        nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定      

    ha-params:ha-mode模式需要用到的参数      

    ha-sync-mode:队列中消息的同步方式,有效值为automatic(自动)、manual (手动) 

priority:可选参数,policy的优先级 

举个栗子,对队列名称以“GLK_”开头的所有队列进行镜像,并在集群的两个节点上完成进行,policy的设置命令为:

rabbitmqctl set_policy --priority 0 --apply-to queues  MyPolicy "^GLK_" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'


Cluster模式集群搭建五步走

第一步

准备2台在同一内网段不同计算机名的服务器(Node1、Node2),保证能够互相Ping通,关闭防火墙或开启相关端口,安装相同版本的操作系统、RabbitMQ、 Erlang 。

 

第二步

修改2台服务器的Hosts文件,增加IP和计算机名之间的映射。 

192.168.1.2 Node1 

192.168.1.3 Node2 


第三步

将Node1 的 Erlang Cookie文件拷贝到Node2,覆盖Node2的Cookie 。


第四步

停止Node2服务,将Node2加入到Node1,并设置Node2为内存节点。

rabbitmqctl stop_app  #停止Node2 

rabbitmqctl join_cluster --ram rabbit@Node1 #将Node2 加入Node1

rabbitmqctl start_app  #运行Node2 


第五步

查看集群运行状态

rabbitmqctl  cluster_status  #查看集群状态

作者:暗夜余晖

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

0

支持

0

反对

posted @2017-12-3  拜读(3031)

评论列表

#1楼 2019-6-15 210.12.84.65
你好,关于普通集群我有个疑问,如果有一个磁盘节点和多个内存节点,那所有的消息都是存到了磁盘节点,获取消息时,访问内存节点,内存节点也还是要通过内部通讯将磁盘节点的消息获取到再返回给消费者,那性能瓶颈不还是在磁盘节点上吗,这和单机版的rabbitmq有什么区别呢?方便的话可以加QQ交流吗?490726075

评论内容:



喜欢请打赏

支付宝 微信

请放心支付