这是我参与「第四届青训营 」笔记创作活动的第12天
Kafka 简介
Kafka 是一种分布式的,基于发布 / 订阅的消息系统。主要设计目标如下:
- 以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数时间复杂度的访问性能。
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传输。
- 支持 Kafka Server 间的消息分区,及分布式消费,同时保证每个 Partition 内的消息顺序传输。
- 同时支持离线数据处理和实时数据处理。
- Scale out:支持在线水平扩展。
Kafka 基础概念
概念一:生产者与消费者
生产者(也称为发布者)创建消息,而消费者(也称为订阅者)负责消费or读取消息。
概念二:主题(Topic)与分区(Partition)
在 Kafka 中,消息以主题(Topic) 来分类,每一个主题都对应一个「消息队列」,这有点儿类似于数据库中的表。但是如果我们把所有同类的消息都塞入到一个“中心”队列中,势必缺少可伸缩性,无论是生产者/消费者数目的增加,还是消息数量的增加,都可能耗尽系统的性能或存储。
我们使用一个生活中的例子来说明:现在 A 城市生产的某商品需要运输到 B 城市,走的是公路,那么单通道的高速公路不论是在「A 城市商品增多」还是「现在 C 城市也要往 B 城市运输东西」这样的情况下都会出现「吞吐量不足」的问题。所以我们现在引入分区(Partition) 的概念,类似“允许多修几条道”的方式对我们的主题完成了水平扩展。
概念三:Broker 和集群(Cluster)
一个 Kafka 服务器也称为 Broker,它接受生产者发送的消息并存入磁盘;Broker 同时服务消费者拉取分区消息的请求,返回目前已经提交的消息。
若干个 Broker 组成一个集群(Cluster),其中集群内某个 Broker 会成为集群控制器(Cluster Controller),它负责管理集群,包括分配分区到 Broker、监控 Broker 故障等。在集群内,一个分区由一个 Broker 负责,这个 Broker 也称为这个分区的 Leader;当然一个分区可以被复制到多个 Broker 上来实现冗余,这样当存在 Broker 故障时可以将其分区重新分配到其他 Broker 来负责。
概念四:多集群
随着业务发展,我们往往需要多集群,通常处于下面几个原因:
- 基于数据的隔离;
- 基于安全的隔离;
- 多数据中心(容灾)
pulsar简介
pulsar的关键特性如下:
- 云原生架构(计算与存储分离),无缝支持跨集群复制
- 比kafka更高的吞吐量和低延迟
- 无缝支持上百万个topics
- 支持多种消息订阅模式 (exclusive & shared & failover)
- 通过持久化存储BookKeeper保障消息的传递
- 轻量级Serverless计算框架Pulsar Functions提供了流式数据处理能力。
- 提供分层存储能力,释放BookKeeper的空间:将老数据or长期不用的数据放到AWS S3等
Pulsar架构模型类似于Client->Proxy->Server
pulsar的分层架构
与其他消息系统不同,Pulsar抽象为两层架构:
- 无状态服务层:处理消息的Broker组成
- 有状态存储层:BookKeeper存储节点组成,可以持久化的存储消息
Broker无状态层
与kafka不同,Pulsar Broker不存储实际的数据,而是将消息存储在BookKeeper中,仅仅拥有Topic/Partitions的代理权。它屏蔽了msg复杂的读写流程,保证了数据一致性和负载均衡。meta信息是存储在zookeeper中,消息存储到BookKeeper中。
BookKeeper
Pulsar用 Apache BookKeeper作为持久化存储。 BookKeeper是一个分布式的预写日志(WAL)系统,特性主要有:
- 支持创建多个独立的ledgers(Fragment/Segment)随着时间的推移,底层数据以 Ledger形式存储,Pulsar会为Topic创建多个ledgers。
- 为按条目复制的顺序数据提供了非常高效的存储。
- 保证了多系统挂掉时ledgers的读取一致性。
- 提供不同的Bookies(BookKeeper实例)均匀的IO分布的特性。
- 容量和吞吐量都能水平扩展。并且容量可以通过在集群内添加更多的Bookies立刻提升。
- Bookies被设计成可以承载数千的并发读写的ledgers。 使用多个磁盘设备,一个用于日志,另一个用于一般存储,这样Bookies可以将读操作的影响和对于写操作的延迟分隔开。
除了消息数据,cursors也会被持久化入BookKeeper。 Cursors是消费端订阅消费的位置。 BookKeeper让Pulsar可以用一种可扩展的方式存储消费位置
pulsar的订阅模式
- 独占订阅:一个消费组只有一个消费者订阅消息。
- 故障切换(Failover):多个消费者可以加入同一订阅,但是只有一个消费者被选为主消费者,其他消费者为故障转移者。
- 共享订阅:订阅组可以挂多个消费者,但一个消息只会传递给一个消费者。