而多节点的集群有两种方式:普通集群和镜像集群(也称主从集群)。
普通集群
这种模式充分利用了Erlang语言天生具备的集群能力。在这个集群模式中,各个节点共享相同的元数据,例如队列结构,但消息不会冗余存储,而是只存在于某一个节点中。当消费者需要消费消息时,如果请求的节点并不存储所需的数据,RabbitMQ会在节点之间临时传输消息,将数据从存储节点传输到消费节点。
显然,这种集群模式存在一定的消息可靠性问题。当某个节点宕机时,该节点上的数据将无法被消费,必须等待节点恢复后才能继续处理。这可能导致消费者端无法正确应答已经消费的消息,在服务恢复后可能导致消息被重复消费。此外,如果消息未经持久化,重启后消息将会丢失。
另外,这种集群模式不支持高可用性。当某个节点服务故障时,需要手动重启该服务才能确保该节点上的消息能够正常消费。因此,这种模式只适合一些对消息安全性要求不高的场景。在使用这种模式时,消费者应尽量连接到每一个节点,以减少消息在集群中的传输。
图片
image
镜像集群
这种模式是RabbitMQ官方HA(高可用)方案,在普通集群模式的基础上进行了增强。在搭建普通集群之后,需要进行额外的配置和部署。其本质区别在于,这种模式会在镜像节点之间主动进行消息同步,而不是在客户端拉取消息时临时同步。
在这种模式下,集群内部会通过算法选举产生主节点(master)和从节点(slave)。一旦主节点失效,集群将自动选举出新的主节点,确保整个集群的高可用性。
图片
优缺点
首先看下普通集群
- 共享元数据:各节点间共享队列结构等元数据,但缺点也很明显消息仅存在于某一个节点
- 消息在消费时会在节点间临时传输,增加了传输延迟和复杂性
- 节点宕机时,该节点上的消息无法被消费,且可能导致重复消费,需要手动重启宕机节点以恢复消息消费
再看下镜像模式:
- 主动消息同步:在镜像节点之间主动进行消息同步,确保每个节点上都存有完整的消息数据。消息的可靠性大大提高,即使单个节点宕机,也不会导致消息丢失。但是集群内部的网络带宽会被主动同步大量占用,可能导致网络拥塞,影响整个集群的性能。
- 通过选举机制,当主节点故障时,自动选出新的主节点,保证服务的连续性和可用性。
因此,并没有一种万能解决方案,最终还是要根据各业务需求来确定集群方案。例如,在金融交易系统或实时数据处理系统中,建议采用高可用的镜像模式。但如果带宽有限制且没有实时性要求,那么使用默认的普通集群可能更合适。
总结
通过本文我们深入了解了RabbitMQ的集群模式及其优缺点。无论是普通集群还是镜像集群,都有其适用的场景和局限性。
普通集群利用Erlang语言的集群能力,但消息可靠性和高可用性方面存在一定挑战;而镜像集群通过主动消息同步提高了消息的可靠性和高可用性,但可能会占用大量网络带宽。
因此,在选择集群方案时,需要综合考虑业务需求、系统性能和资源限制等因素。唯有根据实际情况来灵活选择最适合的方案,以确保系统的稳定性和可靠性。