从 Kafka 到 Pulsar:数据流演进之路 | 青训营笔记

81 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第12天

消息队列概述

消息队列是在消息的传输过程中保存消息的容器。

消息队列的应用场景:

  • MQ 消息通道:
    • 异步解耦(下游无需关注上游)
    • 削峰填谷(MQ带缓存)
    • 发布订阅(下游订阅即可消费)
    • 高可用(各模块可用性独立)
  • EventBridge 事件总线:
    • 事件源:将云服务、自定义应用、SaaS应用等应用程序产生的事件消息发布到事件集
    • 事件集:存储所接收的事件消息,根据事件规则将事件消息路由到事件目标
    • 事件目标:消费事件消息。
  • Data Platform 流数据平台
    • 提供批/流数据处理能力
    • 各类组件提供连接接口
    • 提供 Streaming/Function 能力
    • 根据数据 schema 灵活的进行数据预处理

常见消息队列: RabbitMQ、RocketMQ、Kafka、Pulsar,单机吞吐量依次提高,前两者采用主从架构,后两者采用分布式架构。

Kafka 详解

  • Kafka 架构介绍

    • ZooKeeper:元数据存储;提供一致性和可用性;提供功能: watch观察节点状态机制、持久/临时节点能力
    • Broker:
      • 若干个Broker节点组成Kafka节点,主节点负责数据写入,副节点负责数据备份
      • 作为消息的接收模块:使用React网络模型进行消息数据的接收
      • 作为消息的持久化模块,进行消息的副本复制以及持久化
      • 作为高可用模块,通过副本间的Failover进行高可用保证
    • Controller:掌控节点的变更和决策,特殊Broker
      • 去zk注册上controller节点的broker即为controller,其他就是watch controller节点
      • 节点出现异常则进行重新注册。
    • Coordinator:
      • 负责topic-partition <-> consumer的负载均衡(Partition<->Broker之间只是映射关系)
      • 根据不同场景提供不同的分配策略
  • Kafka 高可用

    • 副本同步机制
      • 提供isr副本复制机制,提供热备机制
      • 写入ack机制;1:leader写入成功就成功;0:produver发送后即成功;-1:所有副本都成功
    • 副本切换机制
      • 提供clean/unclean副本选举机制
        • clean:优先选取isr中的副本作为leader,若isr中无可用副本则partition不可用(更注重数据一致性)
        • unclean:优先选取isr中的副本作为leader,若isr中无可用副本则选择其他存活副本(不能保证一致性,保证可用性)
  • Kafka 集群扩缩容

    • Topic维度
      • partition在各个broker之间的分布是均匀的
      • 同一个partition的replica不会分布在一台broker
    • Broker维度
      • Broker之间的replica的数量是均匀的
  • Kafka 未来演进之路

    • 去除zookeeper依赖
    • 存储计算分离演进
    • 使用KRaft作为元数据和数据存储介质
  • Kafka 运维/调优经验介绍

    • 单机吞吐,参数配置,指标可视化,扩缩容优化

Pulsar 详解

  • Pulsar 架构介绍

    • Proxy:提供类似GateWay代理能力,保障Broker安全
    • Broker:数据层代理器;运行两个模块:http服务器,调度分发器
    • Storage:Pulsar数据存储Segment在不同存储中的抽象
      • 多级存储,L1(缓存);L2(Bookkeeper);L3(S3等冷存)
    • IO连接器
  • Bookkeeper 介绍

    • BookKeeper是优化实时工作负载的存储服务。

    • 架构设计:Bookies 在启动的时候向 ZooKeeper 注册节点,Client 通过 ZooKeeper 发现可用的 Bookie。

    • 基本概念: Ledger:BK中的基本存储单元;Fragment:BK的最小分布单元;Entry:日志

    • 新建Ledger:

      • Ensemble:一个Ledger所涉及的Bookie集合,可以控制一个 Ledger 的读写带宽;
      • Write Quorum:控制一条记录的副本数;
      • Ack Quorum:写每条记录需要等待的副本 Ack 数 ,控制时延;
      • 增加 Ensemble,可以增加读写带宽(增加了可写的机器数);
      • 减少 Ack Quorum,可以减长尾时延。
    • 读/写一致性

      • 写:每条记录会被 writer 赋予一个严格递增的 id,写成功更新Last-Add-Confirm指针。LAC 与 LAP(Pushed)差值为正在写数据
      • 读:所有的 Reader 都可以安全读取 Entry ID 小于或者等于 LAC 的记录
    • 读写分离

      • 写入优化:写入时,不但会写入到Journal中还会写入到缓存(memtable)中,定期会做刷盘(刷盘前会做排序,通过聚合+排序优化读取性能)
      • 读取优化:先读Memtable,没命中再通过索引读磁盘;Ledger Device中会维护一个索引结构,存储在RocksDB中,它会将(Ledgerld, Entryld) 映射到(EntryLogld,文件中的偏移量)
    • 可以发现:Partition<->Broker之间只是映射关系,Broker在扩缩容的过程中只需要更改映射即可

  • Pulsar 功能介绍

    • 生产模式
    • 消费模式
    • 多租户能力
    • Plugin
    • GEO Replication(异地备份)