一.功能和原理
1.设计集群的目的
(1)允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行;
(2)通过增加更多的节点来扩展消息通信的吞吐量.
2.集群配置方式
Rabbitmq可以通过三种方法来部署分布式集群系统,分别是:cluster,federation,shovel
a)cluster:
不支持跨网段,用于同一个网段内的局域网
可以随意的动态增加或者减少
节点之间需要运行相同版本的Rabbitmq和Erlang
b)federation:
应用于广域网,允许单台服务器上的交换机或者队列接收发布到另外一台服务器上的交换机或队列的消息,可以是单台机器或集群.federation队列类似于单向点对点连接,消息会在联盟队列之间转发任意次,直到被消费者接受.通常使用federation来连接internet上的中间服务器,用作订阅分发消息或者工作队列.
c)shovel:
连接方式与federation的连接方式类似,但它工作在更低层次,可以用于广域网.
3.节点类型
集群中的节点一般有两种,一种是内存节点,一种是磁盘节点,内存节点由于没有磁盘读写,性能比磁盘节点好,磁盘节点可以将状态持久化到磁盘,可用性比内存节点好,需要权衡考虑.本次打算用一台作为磁盘节点,做数据备份,两台内存节点,用于提高性能.
Rabbitmq要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点.如果集群中唯一的磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他的操作(增删改查),直到节点恢复.
4.集群模式
普通模式(默认):对于Queue来说,消息实体只存在于其中的一个节点,A/B两个节点仅有相同的元数据,即队列结构.(交换机的所有元数据在所有节点上是一致的,而队列的完整信息只有在创建它的节点上,各个节点仅有相同的元数据,即队列结构)当消息进入A节点的Queue中后,consumer从B节点拉取数据时,RabbitMQ会临时在A.B间进行消息传输,把A中的消息实体取出并经过B发送给consumer.所以consumer应尽量连接每个节点,从中取消息.即对于同一个逻辑队列,要在多个节点建立物理Queue,否则无论consumer连A或B,出口总在A,会产生瓶颈.该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体.如果做个消息持久化,那么等A几点恢复,然后才可被消费;如果没有做持久化,然后就...该模式非常适合非持久化队列,只有该队列是非持久化的,客户端才能重新连接到集群中的其他节点,并且重新创建队列,如果该队列是持久化的,那么唯一的办法就是将故障节点恢复起来.
镜像模式(高可用模式):把需要的队列做成镜像模式,存在于多个节点,数据Rabbitmq的HA方案.该模式解决了上述问题,其实质和普通模式的不同之处在于,消息实体会主动在镜像节点间同步,而不会在consumer取数据时临时拉取.该模式带来的副作用也很明显,除了降低系统性能意外,如果镜像队列过多,加之有大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在对可靠性要求较高的场合中适用.
二.搭建步骤
1.配置hosts
在安装好Rabbitmq的几台机器上,分别修改/etc/hosts文件,必须修改为一样的状态. 例如:
172.17.0.1 rabbitm