Apache Pulsar 深入
概述
Pulsar 是云原生消息平台,与 Kafka 最大的区别是存算分离:Broker 只管计算,BookKeeper 负责存储。这带来独立扩缩容、多租户、多层存储、跨地域复制等能力。本文讲透 Pulsar 架构与核心机制。
一、Pulsar 架构总览
1.1 核心组件
Pulsar 集群:
Broker(计算/路由)
BookKeeper(存储,Bookie 节点)
ZooKeeper(元数据协调)
组件独立部署 → 存算分离| 组件 | 职责 |
|---|---|
| Broker | 处理生产/消费请求 |
| Bookie | 存储消息数据 |
| ZooKeeper | 元数据/协调 |
| 分层存储 | 历史数据卸载到对象存储 |
1.2 与 Kafka 架构差异
Kafka:Broker 同时负责存储与计算
Pulsar:Broker 与 BookKeeper 分离
优势:
存储和计算独立扩缩容
更换 Broker 不影响数据
多层存储更自然二、BookKeeper 存储
2.1 存储模型
BookKeeper 概念:
Ledger:日志序列(Topic 分区数据)
Entry:单条消息
Bookie:存储节点
数据分布:
Ledger 分片(Fragment)跨 Bookie
Ensemble 冗余(多副本)写入流程:
Producer → Broker → BookKeeper
写入多个 Bookie(Quorum)
多数派确认后返回
读取:
从 Bookie 拉取(就近/纠删码)2.2 可靠性
多副本 + Quorum:
Write Quorum(例如 3 副本写 2 确认)
Ack Quorum(读恢复)
对比 Kafka ISR:
Pulsar 用 Quorum 机制
不需要"Leader 全同步"概念2.3 Bookie 特点
Bookie 特性:
无状态存储节点
可单独扩缩容
磁盘均衡自动
数据均衡(Auto Recovery)三、Segment-Centric 架构
3.1 Segment 概念
Topic 分区 → 多个 Segment(Ledger)
消息先写到活动 Segment
Segment 达到阈值 → 滚动新 Segment
旧 Segment 只读
类似 Kafka 的日志分段
但 Segment 是分布式存储单元好处:
存储容量接近无限
历史数据可无缝迁移
写性能稳定(顺序写)3.2 消费偏移
Cursor(游标):
记录消费位置
存于 BookKeeper(可靠)
回溯:
任意位置可读(日志模型)
支持时间/位置回溯四、多层存储
4.1 分层设计
存储分层:
热数据:BookKeeper(本地磁盘)
冷数据:对象存储(S3/GCS/HDFS)
阈值触发:
Segment 时间/大小达到阈值
自动卸载到对象存储4.2 价值
| 价值 | 说明 |
|---|---|
| 无限容量 | 历史不删,成本低 |
| 保留时长可长 | 支持长时间回溯 |
| 成本优化 | 冷热分存储 |
| 简化运维 | 不用频繁删数据 |
对比 Kafka:
Kafka 历史数据占 Broker 磁盘(删除策略)
Pulsar 可卸载对象存储 → 保留更久五、IO 隔离
5.1 为什么需要
问题:
读操作(消费)与写操作(生产)
竞争磁盘 IO
→ 相互影响性能
Pulsar 方案:
IO 分离
读写走不同路径/Bookie5.2 实现
隔离方式:
Broker 读写分离
存储层读写策略隔离
配合分层存储(热写冷读)
效果:
生产不被消费拖累
消费回溯不影响写入六、Geo-Replication 跨地域复制
6.1 内置跨地域复制
机制:
集群间异步复制
每个集群保留本地 + 远端数据
消费者可读任一集群
配置:
配置复制规则(集群间 Topic 复制)
消息带本地集群标记6.2 场景
场景:
多机房容灾
就近读写(低延迟)
数据合规(数据留在本地)
注意:
异步复制有延迟
冲突解决需业务设计七、多租户
7.1 租户模型
模型:
Tenant(租户)→ Namespace(命名空间)→ Topic
每个层可配:
存储配额
生产/消费权限
隔离策略| 概念 | 说明 |
|---|---|
| Tenant | 组织/业务单元 |
| Namespace | 策略隔离单元 |
| Topic | 消息主题 |
7.2 隔离能力
多租户隔离:
资源配额
认证授权(每租户)
策略独立(保留/复制)
数据隔离(Namespace 级)
→ 一套集群服务多个业务八、与 Flink/Spark 集成
8.1 Flink Pulsar Connector
能力:
Source/Sink
精确一次(事务)
动态分区发现
场景:
Pulsar → Flink 实时计算
Flink → Pulsar 输出8.2 协议兼容
Pulsar 协议兼容(KOP):
兼容 Kafka 协议
存量 Kafka 客户端可直连
→ 降低迁移成本
还有 AMQP/MQTT 协议兼容九、生产实践与选型
9.1 运维要点
| 维度 | 要点 |
|---|---|
| 组件 | Broker/Bookie/ZK 独立监控 |
| 容量 | Bookie 磁盘与 IO |
| 均衡 | Bookie 数据均衡任务 |
| 扩容 | 加 Bookie 即可扩存储 |
| 容灾 | 跨地域复制 + 演练 |
9.2 何时选 Pulsar
适合选 Pulsar:
多租户需求强
云原生/K8s 部署
需要长保留与多层存储
需要跨地域复制
不适合:
团队不熟、Kafka 已稳定
追求生态成熟度(Kafka 更全)十、小结
Pulsar 的核心是存算分离(BookKeeper)+ 多层存储 + 多租户 + 跨地域复制。与 Kafka 相比,它牺牲了简单性换取云原生的弹性与多租户能力。选型关键看场景:多租户/云原生/长保留选 Pulsar,生态成熟度/简单运维选 Kafka。