目录
概念
任何一个服务,如果仅仅是单机部署,那么性能总是有上限的,RabbitMQ
也不例外,当单台 RabbitMQ
服务处理消息的能力到达瓶颈时,可以通过集群来实现高可用和负载均衡。
通常情况下,在集群中我们把每一个服务称之为一个节点,在 RabbitMQ
集群中,节点类型可以分为两种:
-
内存节点:元数据存放于内存中。为了重启后能同步数据,内存节点会将磁盘节点的地址存放于磁盘之中,除此之外,如果消息被持久化了也会存放于磁盘之中,因为内存节点读写速度快,一般客户端会连接内存节点。
-
磁盘节点:元数据存放于磁盘中(默认节点类型),需要保证至少一个磁盘节点,否则一旦宕机,无法恢复数据,从而也就无法达到集群的高可用目的。
PS:元数据,指的是包括队列名字属性、交换机的类型名字属性、绑定信息、vhost等基础信息,不包括队列中的消息数据。
RabbitMQ
中的集群主要有两种模式:普通集群模式和镜像队列模式。
普通集群模式
在普通集群模式下,集群中各个节点之间只会相互同步元数据,也就是说,消息数据不会被同步。那么问题就来了,假如我们连接到 A
节点,但是消息又存储在 B
节点又怎么办呢?
不论是生产者还是消费者,假如连接到的节点上没有存储队列数据,那么内部会将其转发到存储队列数据的节点上进行存储。虽然说内部可以实现转发,但是因为消息仅仅只是存储在一个节点,那么假如这节点挂了,消息是不是就没有了?这个问题确实存在,所以这种普通集群模式并没有达到高可用的目的。
IP | role |
---|---|
192.168.142.155 | node1 |
192.168.142.156 | node2 |
192.168.142.157 | node3 |
分别在三台主机上添加 hosts
127.0.0.1 localhost
127.0.1.1 node1
192.168.142.155 node1
192.168.142.156 node2
192.168.142.157 node3
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 localhost
127.0.1.1 node2
192.168.142.155 node1
192.168.142.156 node2
192.168.142.157 node3
# The following lines are de