当前位置: 首页 > article >正文

【MQ】如何保证消息队列的高可用?

 RocketMQ

  • NameServer集群部署

    • Broker做了集群部署

      • 主从模式

        • 类型:同步复制、异步复制

        • 主节点返回消息给客户端的时候是否需要同步从节点

        • Dledger:要求至少消息复制到半数以上的节点之后,才给客户端返回写入成功

        • slave定时从master同步数据(同步刷盘、异步刷盘),master一旦挂了,slave提供消费服务,不能写入消息

Kafka

  • Kafka 从 0.8 版本开始提供了高可用机制,可保障一个或多个 Broker 宕机后,其他 Broker 能继续提供服务

分区副本、备份机制

  • 同一个 Partition 存在多个消息副本,每个 Partition 的副本通常由 1 个 Leader 及 0 个以上的 Follower 组成,
    • Kafka 会尽量将所有的 Partition 以及各 Partition 的副本均匀地分配到整个集群的各个 Broker 上

    • 多副本机制

      • 分区(Partition)引入了多副本(Replica)机制。

      • 多分区、多副本机制好处呢?

        • 1. Kafka 通过给特定 Topic 指定多个 Partition分区, 而各个 Partition 可以分布在不同的 Broker 上, 这样便能提供比较好的并发能力(负载均衡)。

        • 2. Partition 可以指定对应的 Replica 数, 这也极大地提高了消息存储的安全性, 提高了容灾能力,不过也相应的增加了所需要的存储空间。

ACK 机制

  • 生产者发送消息中包含 acks 字段,该字段代表 Leader 应答生产者前 Leader 收到的应答数
    • 发送的 acks=1 和 0 消息会出现丢失情况,为了不丢失消息可配置生产者acks=all & min.insync.replicas >= 2

    • 「acks=0」

      • 生产者无需等待服务端的任何确认,因此 acks=0 不能保证服务端已收到消息

    • 「acks=1」默认值

      • 只要 Partition Leader 接收到消息而且写入本地磁盘了,就认为成功了,不管其他的 Follower 有没有同步

    • 「acks=all or -1」

      • 服务端会等所有的 follower 的副本受到数据后才会收到 leader 发出的 ack,这样数据不会丢失

      • Broker 有个配置项min.insync.replicas(默认值为 1)代表了正常写入生产者数据所需要的最少 ISR 个数

ISR 机制

  • ISR 中的副本都是与 Leader 同步的副本,不在 ISR 中的Follower副本就被认为是没有资格的
    • Follower 周期性地向 Leader 发送 FetchRequest 请求,发送时间间隔配置在replica.fetch.wait.max.ms中,默认值为 500

    • 每个分区的 Leader 负责维护 ISR 列表并将 ISR 的变更同步至 ZooKeeper,被移出 ISR 的 Follower 会继续向 Leader 发 FetchRequest 请求,试图再次跟上 Leader 重新进入 ISR

    • ISR 中所有副本都跟上了 Leader,通常只有 ISR 里的成员才可能被选为 Leader

主从同步

  • 1、Follower副本通过发送Fetch请求来同步Leader副本上的数据。
    • Unclean 领导者选举

      • 当 Kafka 中unclean.leader.election.enable配置为 true(默认值为 false)且 ISR 中所有副本均宕机的情况下,

      • 开启 Unclean 领导者选举可能会造成数据丢失,但好处是,它使得分区 Leader 副本一直存在,不至于停止对外提供服务,因此提升了高可用性,

    • LEO(Log End Offset)

      • 对于Leader副本和每个Follower副本来说,它们都有各自的LEO

      • LEO是下一个要写入的消息的偏移量

    • HW(High Watermark)

      • HW是分区中所有副本的已提交消息的最大偏移量。是分区中所有ISR(In-Sync Replicas)副本的LEO中的最小值

      • 只要分区的Leader副本和至少一个Follower副本保持同步,消费者就能看到所有已提交的消息,即使Leader副本发生故障

    • 确保了Kafka在分区的Leader副本发生故障时,可以从ISR中选举出一个Follower副本作为新的Leader,

Leader 选举 & 故障恢复机制

  • 「Kafka 从 0.8 版本开始引入了一套 Leader 选举及失败恢复机制」
    • 在集群所有 Broker 中选出一个 Controller,负责各 Partition 的 Leader 选举以及 Replica 的重新分配

    • Controller

      • 集群中的 Controller 也会出现故障,因此 Kafka 让所有 Broker 都在 ZooKeeper 的 Controller 节点上注册一个 Watcher。

    • 当出现 Leader 故障后,Controller 会将 Leader/Follower 的变动通知到需要为此作出响应的 Broker。

    • Kafka 使用 ZooKeeper 存储 Broker、Topic 等状态数据,Kafka 集群中的 Controller 和 Broker 会在 ZooKeeper 指定节点上注册 Watcher(事件监听器),以便在特定事件触发时,由 ZooKeeper 将事件通知到对应 Broker

    • 当 Broker 发生故障后,由 Controller 负责选举受影响 Partition 的新 Leader 并通知到相关 Broker


http://www.kler.cn/a/524010.html

相关文章:

  • 改进候鸟优化算法之四:基于动态环境的MBO算法(D-MBO)
  • AI 浪潮席卷中国年,开启科技新春新纪元
  • 机器学习第一道菜(二):玩转最小二乘法
  • Hugging Face 推出最小体积多模态模型,浏览器运行成为现实!
  • 速通Docker === Docker Compose
  • 【数据结构】(1)集合类的认识
  • Spring Boot多环境配置实践指南
  • Python面试宝典8 | 手写Python max 函数,从入门到精通
  • Kubernetes扩展
  • 提升企业内部协作的在线知识库架构与实施策略
  • 【YOLOv11改进[Backbone]】使用EMO替换Backbone
  • Deepseek R1 的大模拟考试
  • 高精度算法:加法
  • DeepSeek辅助学术写作摘要内容
  • 1.25学习记录
  • 工业级 RAG 实现 - QAnything
  • LeetCode100之子集(78)--Java
  • 合并二叉树(力扣617)
  • Verilog语言学习总结
  • Linux 4.19内核中的内存管理:x86_64架构下的实现与源码解析
  • 字节一面, Go语言的Map 的扩容机制是怎样的?
  • (三)Session和Cookie讲解
  • 2025春晚刘谦魔术揭秘魔术过程
  • 【仪器分析】FACTs-幅度
  • 【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像
  • python学opencv|读取图像(四十八)使用cv2.bitwise_xor()函数实现图像按位异或运算