从 Kafka 到 Pulsar的数据流演进之路笔记(二)| 青训营笔记

212 阅读6分钟

从 Kafka 到 Pulsar的数据流演进之路笔记(二)| 青训营笔记

这是我参与「第四届青训营 -大数据场」笔记创作活动的第17天

三、Pulsar 详解

1. Pulsar 架构介绍

image.png

Pulsar客户端连接集群的两种方式:

  • Pulsar Client -> Broker
  • Pulsar Client -> Proxy
1.1 Pulsar Proxy
  • Pulsar Proxy的作用及应用场景

    • 部分场景无法知道Broker地址,如云环境或者Kubernetes环境
    • Proxy提供类似GateWay代理能力,解耦客户端和Broker,保障Broker安全
1.2 Pulsar Broker
  • Pulsar Broker无状态组件,负责运行两个模块

    • Http服务器

      • 暴露了restful接口,提供生产者和消费者topic查找api
    • 调度分发器

      • 异步的tcp服务器,通过自定义二进制协议进行数据传输
  • Pulsar Broker 作为数据层代理

    • Bookie通讯

      • 作为Ledger代理负责和Bookie进行通讯
    • 流量代理

      • 消息写入Ledger存储到 Bookie
      • 消息缓存在堆外,负责快速响应
1.3 Pulsar Storage
  • Pulsar数据存储Segment在不同存储中的抽象

    • 分布式Journal系统(Bookeeper)中为Journal/Ledger
    • 分布式文件系统(GFS/HDFS)中为文件
    • 普通磁盘中为文件
    • 分布式 Blob存储中为Blob
    • 分布式对象存储中为对象
  • 定义好抽象之后,即可实现多介质存储

image.png

  • L1(缓存):

    • Broker使用堆外内存短暂存储消息
    • 适用于Tail-Read读场景
  • L2(Bookkeeper):

    • Bookkeeper 使用Qurom写,能有效降低长尾,latency低
    • 适用于Catch-Up较短时间内的较热数据

image.png

  • L3(S3等冷存):

    • 存储成本低,扩展性好
    • 适用于Catch-Up长时间内的冷数据
1.4 Pulsar lO 连接器
  • Pulsar lO 分为输入(Input)和输出(Output)两个模块,输入代表数据从哪里来,通过Source 实现数据输入。输出代表数据要往哪里去,通过Sink 实现数据输出。
  • Pulsar提出了IO(也称为Pulsar Connector),用于解决 Pulsar与周边系统的集成问题,帮助用户高效完成工作。
  • 目前Pulsar lO支持非常多的连接集成操作:例如HDFS、Spark、Flink、Flume、ES、HBase等。
1.5 Pulsar Functions(轻量级计算框架)
  • Pulsar Functions是一个轻量级计算框架,提供一个部署简单、运维简单、API简单的FAAS平台。
  • Pulsar Functions提供基于事件的服务,支持有状态与无状态的多语言计算,是对复杂的大数据处理框架的有力补充。
  • 使用Pulsar Functions,用户可以轻松地部署和管理function,通过function 从 Pulsar topic读取数据或者生产新数据到Pulsar topic。

image.png

2. Bookkeeper 介绍

2.1 Bookeeper 整体架构

image.png

image.png

2.2 Bookkeeper 基本概念
  • Ledger:BK的一个基本存储单元,BK Client的读写操作都是以Ledger为粒度的
  • Fragment:BK的最小分布单元(实际上也是物理上的最小存储单元),也是 Ledger的组成单位,默认情况下一个Ledger会对应的一个Fragment(一个Ledger也可能由多个Fragment组成)
  • Entry:每条日志都是一个 Entry,它代表一个 record,每条record都会有一个对应的entry id
2.3 新建 Ledger
  • Ensemble:可以控制一个 Ledger 的读写带宽;
  • Write Quorum:控制一条记录的复本数;
  • Ack Quorum:写每条记录需要等待的 Ack 数 ,控制时延;
  • 增加 Ensemble,可以增加读写带宽(增加了可写的机器数);
  • 减少 Ack Quorum,可以减长尾时延。
2.4 读/写一致性
  • 写:每条记录会被 writer 赋予一个严格递增的 id,写成功更新Last-Add-Confirm指针。LAC 与 LAP(Pushed)差值为正在写数据
  • 读:所有的 Reader 都可以安全读取 Entry ID 小于或者等于 LAC 的记录
2.5 读写分离
  • 写入优化:写入时,不但会写入到Journal中还会写入到缓存(memtable)中,定期会做刷盘(刷盘前会做排序,通过聚合+排序优化读取性能)
  • 读取优化:先读Memtable,没命中再通过索引读磁盘;Ledger Device中会维护一个索引结构,存储在RocksDB中,它会将(Ledgerld, Entryld) 映射到(EntryLogld,文件中的偏移量)
2.6 Bookkeeper with pulsar
  • Partition<->Broker之间只是映射关系
  • Broker在扩缩容的过程中只需要更改映射即可

3. Pulsar 功能介绍

3.1 生产模式

image.png

3.2 消费模式

image.png

3.2.1 Exclusive 消费模式
  • 独占订阅(Stream流模型)

    • 独占订阅中,在任何时间,一个消费者组(订阅)中有且只有一个消费者来消费Topic中的消息。
3.2.2 Failover 消费模式
  • 故障切换(Stream流模型)

    • 使用故障切换订阅,多个消费者(Consumer)可以附加到同一订阅。但是,一个订阅中的所有消费者,只会有一个消费者被选为该订阅的主消费者。其他消费者将被指定为故障转移消费者。
3.2.3 Shared 消费模式
  • 共享订阅(Queue队列模型)

    • 使用共享订阅,在同一个订阅背后,用户按照应用的需求挂载任意多的消费者。订阅中的所有消息以循环分发形式发送给订阅背后的多个消费者,并且一个消息仅传递给一个消费者。
3.2.4 Key_Shared 消费模式
  • 按Key共享订阅(Queue队列模型)

    • 使用共享订阅,在同一个订阅背后,用户按照应用的需求挂载任意多的消费者。订阅中的所有消息以key-hash发送给订阅背后的多个消费者,并且一个消息仅传递给一个消费者。
3.3 Pulsar 多租户

image.png

3.4 Pulsar Plugin

image.png

  • 当前支持Plugin类型

    • KOP (Kafka on Pulsar)
  • ROP(RocketMQ on Pulsar)

  • AOP (AMQP on Pulsar)

  • Mop (MQTT on Pulsar)

  • 实现 Plugin需要支持的功能

    • 路由查询
    • Message Protocol
    • Offset & Msgld
3.5 Pulsar GEO Relication
  • 跨数据中心复制
  • 消费其他地域数据

4. Pulsar HA & Scale-up

5. Pulsar vs Kafka

  • 存储架构

    • 存储计算分离之后带来的优劣势
    • 多层架构,状态分离之后的优势
  • 运维操作

    • 应对突发流量变化,集群扩缩容是否便捷
    • 运维任务是否影响可用性
    • 集群部署是否灵活
  • 功能特性

    • 多语言&多协议
    • 多租户管理
    • 生产消费模式
  • 生态集成

5.1 存储计算分离
  • 分层架构优势

    • 流量代理层和数据存储层解耦
    • 流量代理层无状态,可快速扩缩容(k8s等弹性平台)
    • 流量代理层可以对接海量的客户端连接
    • 存储层负责数据存储,可以使用多级存储
  • 计算层

    • 对于写入的数据,可以做预处理,简单ETL
    • 可以做数据缓存,应对高扇出度场景
    • 无状态,扩缩容之后,能快速完成负载均衡Balance
  • 存储层

    • 按照数据冷热进行存储介质区分,降低成本
    • 历史数据可海量保存,数据无价
    • 可直接通过存储层接口读取数据,批式计算

四、课程总结

1. 消息队列概述

  • 应用场景(从消息到消息、事件、流融合的处理平台)
  • 主流消息队列

2. Kafka

  • 集群架构、高可用、集群扩缩容、运维调优

3. Pulsar

  • 集群架构、存储层分析、特性介绍、HA&集群扩缩容

4. 周边和生态

  • SQL、IO、Schema