• 动力节点Rabbitmq-18-21章RabbitMQ集群与高可用


    18 RabbitMQ集群与高可用

    RabbitMQ 的集群分两种模式,一种是默认集群模式,一种是镜像集群模式;
    RabbitMQ集群中所有的节点(一个节点就是一个RabbitMQ的broker服务器) 被归为两类:一类是磁盘节点,一类是内存节点;
    磁盘节点会把集群的所有信息(比如交换机、绑定、队列等信息)持久化到磁盘中,而内存节点只会将这些信息保存到内存中,如果该节点宕机或重启,内存节点的数据会全部丢失,而磁盘节点的数据不会丢失;

    18.1 默认集群模式

    默认集群模式也叫 普通集群模式、或者 内置集群模式;
    RabbitMQ默认集群模式,只会把交换机、队列、虚拟主机等元数据信息在各个节点同步,而具体队列中的消息内容不会在各个节点中同步;

    元数据
    队列元数据:队列名称和属性(是否可持久化,是否自动删除)
    交换器元数据:交换器名称、类型和属性
    绑定元数据:交换器和队列的绑定列表
    vhost元数据:vhost内的相关属性,如安全属性等;
    当用户访问其中任何一个RabbitMQ节点时,查询到的queue/user/exchange/vhost等信息都是相同的;
    但集群中队列的具体信息数据只在队列的拥有者节点保存,其他节点只知道队列的元数据和指向该节点的指针,所以其他节点接收到不属于该节点队列的消息时会将该消息传递给该队列的拥有者节点上;
    为什么集群不复制队列内容和状态到所有节点:

    1. 存储空间;

    2)性能;
    如果消息需要复制到集群中每个节点,网络开销不可避免,持久化消息还需要写磁盘,占用磁盘空间。
    那么问题来了?
    如果有一个消息生产者或者消息消费者通过amqp-client的客户端连接到节点1进行消息的发送或接收,那么此时集群中的消息收发只与节点1相关,这个没有任何问题;
    如果客户端相连的是节点2或者节点3 (队列1数据不在该节点上),那么情况又会是怎么样呢?
    如果消息生产者所连接的是节点2或者节点3,此时队列1的完整数据不在该两个节点上,那么在发送消息过程中这两个节点主要起了一个路由转发作用,根据这两个节点上的元数据(也就是指向queue的owner node的指针)转发至节点1上,最终发送的消息还是会存储至节点1的队列1上;

  • 相关阅读:
    Docker 安装 MySQL、Redis、Nginx
    干货!教您使用工业树莓派结合CODESYS配置EtherCAT主站
    unity sdk -AppLovin MAX 广告聚合平台接入+Firebase统计
    7-5 最大子矩阵和问题
    Android——解决BottomNavigationView+Fragment重建与重叠问题
    MyBatis-Plus入门案例
    开启摄像头镜像无效-左右镜像相反
    容器化技术Docker
    PyTorch and Stable Diffusion on FreeBSD
    ASO优化:教你学会如何选词,技巧有哪些?
  • 原文地址:https://blog.csdn.net/f5465245/article/details/130422034