赞
踩
本文作者为 StreamNative 软件工程师李鹏辉与 Overstock 数据工程师 Devin G. Bost。中文博客内容由 StreamNative 翻译并整理。
阅读本文需要大约 12 分钟。
关于 Apache Pulsar
Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性。
GitHub 地址:http://github.com/apache/pulsar/
Apache Pulsar 的性能通常指与读写消息相关的吞吐量和延迟。在使用 Pulsar 时,用户可以通过配置一些参数来控制系统读写消息的方式。我将会出一个系列,来介绍 Apache Pulsar 在读写消息方面的性能调优,这是本系列的第一篇。
本文深入介绍一些关于 Apache Pulsar 的基础概念,包括 Pulsar 的架构、存储层、Apache BookKeeper 等。了解 BookKeeper 有助于更深入地了解 Pulsar 的调优过程。
首先,我们来了解一下关于 Pulsar 的基础概念。我们至少需要知道 Apache Pulsar 如何收发消息(即生产和消费消息)。
本文中的基础概念和术语有助于更好地了解 Apache Pulsar 的工作方式。
在 Pulsar 中,数据的基本单元即为消息。Producer 发送消息到 broker,然后 broker 通过流控制发送消息到 consumer。想要深入了解 Pulsar 的消息流控制,参阅 Pulsar 消息流控制官方文档[1]。
消息中不仅包含 producer 写入 topic 的数据,还包含一些重要的元数据。
在 Pulsar 中,消息有两种类型:批消息与单条消息。单条消息的序列即为批消息。(关于批处理消息的详细内容,我会在 1.5.1 章节介绍。)
Topic 是一个消息目录或者说存放消息的命名空间,也就是消息发布(生产)的位置。一个 topic 可以有一个或多个 producer 和/或 consumer。Producer 向 topic 写入消息,consumer 从 topic 消费消息。图 1 展示了三者之间如何协同工作。
图 1. Producer 和 Consumer 的工作机制
Apache Pulsar 使用 Apache BookKeeper 作为存储层。Apache BookKeeper 针对实时工作负载进行优化,是一项可扩展、可容错、低延迟的存储服务。客户端发布的消息存储在 BookKeeper 的服务器实例中,即 bookie。
Entry 和 ledger 是 BookKeeper 中的基本术语。Entry 中包含写入 ledger 的数据,也包含一些重要的元数据。Ledger 是 BookKeeper 中的基本存储单元。一系列的 entry 组成一个 ledger,entry 被顺序写入 ledger。
Journal 文件包含 BookKeeper 中的消息写入日志。在更新 ledger 前,bookie 确保已经将更新的交易(交易日志 entry)写入非易失存储。在 bookie 第一次运行或旧的 journal 文件大小达到指定阈值时,会创建新的 journal 文件。
Entry log 文件用于管理 BookKeeper 客户端写入的 entry。来自不同 ledger 的 entry 会被依次写入一个或多个 entry log 中,而偏移量则作为指针保存在 ledger 缓存中,以进行快速查找。
当第一次启动 bookie 或当旧的 entry log 文件大小达到指定阈值时,会创建新的 entry log 文件。当活跃 ledger 不再使用旧的 entry log 文件时,垃圾收集器线程(Garbage Collector Thread)就会删除这些文件。
Bookie 使用 RocksDB 作为 entry 索引数据库。RocksDB 基于 log-structured merger(LSM)树,具有高性能、可嵌入、持久性、键值存储等特性。了解 LSM 树的机制能够帮助我们更好地了解 BookKeeper 的机制。更多关于 LSM 树设计原理等的信息,参阅 LSM 树设计 pdf 文档[2]。
当 BookKeeper 客户端向 ledger 写入 entry 时,bookie 就会将此 entry 写入 journal,并在写入完成后发送响应给客户端。后台线程将 entry 写入到 entry log。当 bookie 的后台线程将数据 flush 到 entry log 时,会同时更新索引。此过程如图 2 所示。
图 2. 当 BookKeeper 客户端向 Ledger 写入 Entry 时的工作机制
当从 ledger 读取 entry 时,bookie 首先从索引数据库中找到 entry 的位置,然后从 entry log 中读取数据。
更多关于 BookKeeper 架构的信息,参阅 BookKeeper 概念[3]。
在 Pulsar 中,broker 是一个无状态服务器,用于协助读写数据。一个 topic 不能同时被多个 broker 管理,但是 topic 可以存储在多个 bookie 服务中。
Broker 使用一个 managed ledger 作为 topic 的后端存储平台。如图 3 所示,managed ledger 可以拥有多个 ledger 和多个游标。Managed ledger 中的 ledger 是 topic 中 entr
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。