普通集群模式(无高可用性)

普通集群模式,意思就是多台机器上启动多个RabbitMQ实例,每个机器启动一个。你创建的queue,只会放在一个RabbitMQ实例上,但是每个实例都同步queue的元数据(元数据可以认为是queue的一些配置信息,通过元数据,可以找到queue所在的实例)。你消费的时候实际上如果连接到另外一个实例,那么那个实例会从queue所在的实例上拉取数据过来。
这种方式确实麻烦,也不怎么好,没做到所谓的分布式,就是普通集群。因为者导致你要么消费者每次随机连接一个实例然后拉取数据,要么固定连接那个queue所在实例消费数据,前者有数据拉取的开销,后者导致单实例性能瓶颈。而且如果那个放queue的实例宕机了,会导致接下来的其他实例就无法从那个实例拉取,如果你开启了消息持久化,让RabbitMQ落地存储消息的话,消息不一定会丢失,得等到这个实例恢复了,然后才可以继续从这个queue拉取数据
所以这个事就比较尴尬了,这就没有什么所谓的高可用性,这方案主要就是提高吞吐量的,就是说让集群中多个节点来服务某个queue的读写操作。
上述摘自:中华石衫的互联网大厂面试第一季(https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/how-to-ensure-high-availability-of-message-queues.md
image.png

镜像集群模式(高可用性)

这种模式,才是所谓的RabbitMQ的高可用模式。跟普通集群模式不一样的是,在镜像集群模式下,你创建的queue,无论元元素还是queue里的消息都会存在与多个实例上,就是说,每个RabbitMQ节点都有这个queue的一个完整镜像,包含queue的全部数据的意思。然后每次你写消息到queue的时候,都会自动把消息同步到多个实例的queue上。
那么如何开启这个镜像集群模式呢?其实很简单,RabbitMQ有很好的管理控制台,就是在后台新增一个策略,这个策略是镜像集群策略,指定的时候可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,再次创建queue的时候,应用这个策略,就会自动将数据同步到其他节点上去了。
这样的话,好处在于,你任何一个机器宕机了,没事,其他机器(节点)还包含了这个queue的完整的数据,别的consumer都可以到其他节点上去消费数据。坏处在于,第一,这个性能开销也太大了吧。消息需要同步到所有机器上,导致网络宽带压力和消耗很重!第二,这么玩儿,不是分布式的,就没有扩展性可言了,如果某个queue负载很重,你加机器新增的机器也包含了这个queue的所有数据,并没有办法线性扩展你的queue。你想,如果这个queue的数据量很大,大到这个机器上的容量无法容纳了,此时该怎么办呢?
image.png

Mirror镜像集群的搭建

  1. 准备2台centos(192.168.0.121 192.168.0.122)服务器 安装好rabbitmq
  2. 将rabbitmq服务器进行启动

    rabbitmq-server rabbitmq-server -detached(后台启动)

  3. centos(192.168.0.121) /etc/hostname m1

    centos(192.168.0.122) /etc/hostname m2

  4. centos(192.168.0.121) /etc/hosts 192.168.0.121 m1 192.168.0.122 m2

    centos(192.168.0.122) /etc/hosts 192.168.0.121 m1 192.168.0.122 m2

  5. 配置防火墙的拦截端口(两台服务器配置相同)

    firewall-cmd —zone=public —add-port=4369/tcp —permanent(erlang监听端口)
    firewall-cmd —zone=public —add-port=5672/tcp —permanent(rabbitmq服务监听端口)
    firewall-cmd —zone=public —add-port=15672/tcp —permanent(rabbitmq控制台监听端口)
    firewall-cmd —zone=public —add-port=25672/tcp —permanent(rabbitmq内部监听端口)
    激活配置的端口
    firewall-cmd —reload
    重启centos
    init 0

  6. 两个rabbitmq之间进行数据通讯需要保持一样的cookie

    将121服务器上面的cookie复制到122服务器上面
    scp /var/lib/rabbitmq/.erlang.cookie 192.168.0.122:/var/lib/rabbitmq/

  7. 对cookie文件进行授权,只有拥有这才能对其进行操作(两台无服务器配置相同)

    chmod 400 /var/lib/rabbitmq/.erlang.cookie

  8. 对122服务器进行配置

  • rabbitmqctl stop_app 停止rabbitmq的服务
  • rabbitmqctl join_cluster rabbit@m1 加入集群
  • rabbitmqctl start_app 对服务进行重启
  • rabbitmqctl cluster_status 查看集群的状态

    上述摘自IT老齐:http://www.itlaoqi.com/chapter/1454.html