博客
关于我
RabbitMQ集群 - 仲裁队列、Raft协议(最详细的选举流程)
阅读量:794 次
发布时间:2023-03-01

本文共 1647 字,大约阅读时间需要 5 分钟。

仲裁队列与Raft协议

1. 仲裁队列概述

在 RabbitMQ 中,普通队列存在一个关键问题:当一个节点宕机后,其他节点无法读写宕机节点的队列数据。为了解决此问题,RabbitMQ 引入了仲裁队列。

2. 仲裁队列的作用

  • 仲裁队列通过 Raft 协议实现不同节点间队列消息数据的复制。在主节点宕机时,其他节点仍能通过仲裁队列继续服务。

3. Raft 协议概述

Raft 协议是一种共识算法,用于解决分布式系统中的单点故障问题。它通过三个子问题确保系统一致性:Leader 选举、日志复制和安全性。


4. Raft 节点角色

Raft 节点有三种角色:

  • Leader:负责处理客户端请求并复制日志到所有 Follower。
  • Follower:接收 Leader 发送的日志信息。
  • Candidate:在没有收到 Leader 心跳的情况下,切换为 Candidate 状态并发起选举。

  • 5. 任期与选举流程

    • 任期(Term):从一次选举开始到 Leader 宕机为止为一个任期。节点会存储当前任期号,并在每次成功选举后单调递增。

    • 选举流程

      • 新节点启动时默认为 Follower。
      • 若在选举超时时间内未收到 Leader 心跳,节点切换为 Candidate 并发起选举。
      • 候选节点通过 RequestVote RPC 向其他节点请求投票。
      • 若获得超过半数投票(包括自己的一票),成为新的 Leader。
      • 若未获得半数票数,保留 Candidate 状态并重新发起选举。

    6. 选举超时与避免集群选举

    为了避免集群同时发起选举,Raft 使用随机选举超时时间(150-300ms)。这样可以确保大多数情况下不会出现所有节点同时成为 Candidate。


    7. 消息复制

    • 仲裁队列有多个副本,包括一个主节点和多个从节点。
    • 客户端只与主节点交互,主节点将命令复制到从节点。
    • 主节点故障时,从节点会被选举为新的主节点,继续提供服务。

    8. 仲裁队列的使用

    8.1 MQ 管理平台

    MQ 管理平台提供了对仲裁队列的监控和管理功能。

    8.2 Spring AMQP 配置

    • 配置
      spring:
      application:
      name: rabbitmq
      rabbitmq:
      host: env-base
      port: 5672
      username: root
      password: 1111
    • Bean 配置
      import com.cyk.rabbitmq.constants.MQConst;
      import org.springframework.amqp.core.Queue;
      import org.springframework.amqp.core.QueueBuilder;
      @Configuration
      class QuorumConfig {
      @Bean
      fun quorumQueue(): Queue = QueueBuilder
      .durable(MQConst.QUORUM_QUEUE)
      .quorum()
      .build();
      }
    • 生产者接口
      @RestController
      @RequestMapping("/mq")
      class MQApi(
      private val rabbitTemplate: RabbitTemplate
      ) {
      @GetMapping
      fun quorum(): String {
      rabbitTemplate.convertAndSend("", MQConst.QUORUM_QUEUE, "quorum msg 1")
      return "ok"
      }
      }

    9. 结果展示

    • 通过配置和使用 Spring AMQP,可以轻松创建并管理仲裁队列。
    • 仲裁队列确保了消息的高可用性和系统的容错能力。
    • 当主节点下线时,其他节点仍能通过仲裁队列继续服务。

    转载地址:http://citfk.baihongyu.com/

    你可能感兴趣的文章
    PHP——修改数据库1
    查看>>
    PHP——封装Curl请求方法支持POST | DELETE | GET | PUT 等
    查看>>
    PHP——底层运行机制与原理
    查看>>
    php一句话图片运行,【后端开发】php一句话图片木马怎么解析
    查看>>
    PHP三方登录,移动端与服务端交互
    查看>>
    Redis事务深入解析和使用
    查看>>
    PHP上传文件大小限制的调整 Nginx 413 Request Entity Too Large
    查看>>
    php上传文件找不到临时文件夹
    查看>>
    PHP下curl用法分析
    查看>>
    php与web服务器关系
    查看>>
    redis事务操作
    查看>>
    php中0,空,null和false的区别
    查看>>
    PHP中array_merge和array相加的区别分析
    查看>>
    PHP中Closure::bindTo的用法分析
    查看>>
    php中curl得使用
    查看>>
    PHP中curl特性
    查看>>
    PHP中date时间不对
    查看>>
    PHP中dirname(__FILE__)的意思
    查看>>
    PHP中extract()函数的妙用
    查看>>
    PHP中fileinfo的作用以及怎么开启fileinfo
    查看>>