zoukankan      html  css  js  c++  java
  • [Open Source] RabbitMQ 高可用集群方案

    简介

    RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡。
    Rabbit模式大概分为以下三种:单一模式、普通模式、镜像模式

    RabbitMQ工作模式

    • 单一模式 (最简单的情况,非集群模式)

    • 普通模式 (默认的集群模式)

      • 流程
        • 对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。
        • 当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。
      • 问题
        • 该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。
        • 如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,然后就没有然后了
    • 镜像模式

      • 流程
        • 把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案。
        • 消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。
      • 问题
        • 降低系统性能
        • 集群带宽大大消耗(如果镜像队列数量过多,加之大量的消息进入)
      • 优点
        • 对可靠性要求较高的场合中适用
    • 集群说明

      • 一个rabbitmq集 群中可以共享 user,vhost,queue,exchange等,所有的数据和状态都是必须在所有节点上复制的

    集群搭建

    • 操作步骤(node1为主,node2,node3为从,node4为proxy)
      • 在 192.168.0.1(node1)、192.168.0.2(node2)、192.168.0.3(node3) 三个节点上安装,然后开启 RabbitMQ 监控插件
      • node1
        • .erlang.cookie文件拷贝到 node2、node3
      • node1,node2,node3
        • rabbitmqctl stop // 停止Rabbit
        • rabbitmq-server -detached //
      • node2,node3
        • rabbitmqctl stop
        • rabbitmqctl join_cluster rabbit@node1
        • rabbitmqctl start_app
      • node4
        • 作为proxy指向node1,node2,node3(用于透明调用使用)
        • 当然,你也可以通过var connection = factory.CreateConnection(["ip1","ip2"].ToList());
      • cli
        • rabbitmqctl cluster_status // 检查集群状态
        • rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' // 添加策略
      • gui(如果cli不方便的话)

    说明

    • proxy 层可用nginx haproxy nlb lvs

    • 集群搭建完,任意一台Rabbit服务器(节点)挂了,都能正常取到数据。保证了高可用。

    • 顺便推荐下自己封装的Rabbit(Install-Package RabbitMQ.Wrapper)

      • 自动重连
      • 自定义配置
      • 持久化消息
  • 相关阅读:
    MapReduce —— MapTask阶段源码分析(Output环节)
    MapReduce——移动数据不如移动计算
    MapReduce —— MapTask阶段源码分析(Input环节)
    MapReduce——客户端提交任务源码分析
    NameNode和SecondaryNameNode角色功能分析
    线程的实现原理
    RTFSC:SpringBoot 源码惊鸿一瞥
    垃圾收集器学习笔记
    常见的六种OOM异常和错误
    简单类型多线程加锁
  • 原文地址:https://www.cnblogs.com/neverc/p/6888560.html
Copyright © 2011-2022 走看看