分布式消息流平台:不要只想着 Kafka,还有 Pulsar
摘要: Pulsar 作为一个云原生的分布式消息流平台,越来越频繁地出现在人们的视野中,大有替代 Kafka 江湖地位的趋势。
本文分享自华为云社区《MRS Pulsar:下一代分布式消息流平台全新发布!》,作者: Lothar。
Pulsar 的前世今生
Apache Pulsar 是一个发布-订阅消息系统,使用计算与存储分离的云原生架构。Pulsar 2018 年 9 月成为 ASF 顶级项目,近两年,随着社区不断发展和诸多企业的应用和贡献,Pulsar 作为一个云原生的分布式消息流平台,越来越频繁地出现在人们的视野中,大有替代 Kafka 江湖地位的趋势。
Pulsar 和 Kafka 的对比
Pulsar 和 Kafka 架构上最大的不同是,Kafka 由 Broker 进行消息的收发和持久化,数据存储在本地文件系统,由 Broker 统一管理。这也意味着数据和消息处理是耦合的。
Kafka 官网描述道:Kafka 重度依赖文件系统,用于存储或缓存消息。当 Broker 接收到消息时,会将消息追加写到本地磁盘上。这一架构决定了 Partition 和 Broker 的对应关系是相对固定的,只有在 partitionreassign 时才会发生数据迁移。Partition 的 Leader 在数据副本分布节点上产生,用于处理生产消费请求。
而 Pulsar 采用了计算存储分离架构,这也是 Pulsar 被称作云原生平台的主要原因。Pulsar 依赖 Apache BookKeeper 管理持久化数据,Apache BookKeeper 是可扩展、可容错、低延迟的日志存储服务,能够保证在强持久性下的低延迟读写。
*引自 Pulsar 官网介绍:https://pulsar.apache.org/docs/en/concepts-architecture-overview/
Broker 接收请求后,数据实际分布式存储在 BookKeeper 服务中。在数据的物理存储模型中某个 Topic 或 Partition 的数据并不固定存储在某个 Bookie 实例上。
Pulsar 将分布式日志划分为多个 Segment,每个 Segment 对应 BookKeeper 中的一个 Ledger。与 Kafka 将某一 Partition 的数据日志保存在某一固定目录下不同,Pulsar 通过划分 Segment 的方式,可以将同一 topic 或 partition 分布到不同的 Bookie 上。
Pulsar 的优势特性
灵活扩展
相信很多使用 Kafka 的客户都有类似的经历:
磁盘空间不足,只能调整数据 TTL,或扩容机器后向新的 Broker 中迁移 Partition
Topic 或 Partition 间数据分配不均匀,节点之间或磁盘之间使用不均衡,有的磁盘已经满了,而有的磁盘还有很多空间
Broker 机器故障,需要将数据迁移到其他节点后下电维修
Pulsar 的存算分离架构天然地避免了这些问题。PulsarBroker 本身是无状态的,当某个 Broker 故障时,另一个 Broker 可以立即接管对应的 Topic 而不需要迁移数据。BookKeeper 分布式日志保证了存储节点间的数据均衡,不会因某一个 Partitoin 或 Topic 数据过多而导致 IO 集中在某一节点上。
当集群需要扩容时,Broker 可以立即感知到新加入集群的 Bookie,并将新写入的数据存储到新添加的 Bookie 中。
多租户
Kafka 社区在 KIP-37 正在讨论加入 NameSpace 以实现多租户特性,而 Pulsar 已实现这一功能。在企业中,消息队列服务通常会被多个团队使用,在使用 Kafka 时,有时需要为每个团队维护一个 Kafka 集群。Pulsar 可以配置多个租户,每个租户可以有多个 NameSpace,管理员可以对 NameSpace 进行访问控制、配额管理。
更灵活的订阅模式
Kafka 对消息的划分分为两层:对于属于同一个 Group 的 KafkaConsumer,其获取到的消息是互斥的,即某一条消息只能被 Group 中的一个 Consumer 处理;对于不同的 Group,某一条消息将同时被两个 Group 处理,消息是共享的。
而 Pulsar 提供了更灵活的订阅模式:
独占式:
在任意时间,Topic 中的数据只能被 Group 中的一个 Consumer 消费,不允许其他 Consumer 获取消息
主备式:
多个 Consumer 同时消费同一个 Topic 时,只有一个 Consumer 被选为主 Consumer,其他 Consumer 则成为备 Consumer。当主 Consumer 故障时,发生主备倒换,备 Consumer 中的一个将升主,并继续消息的消费。
共享式:
与 Kafka 类似,使用共享模式,消息将循环分发给不同的 Consumer,当某个 Consumer 故障时,消息将被重新分配给其他 Consumer。
分层存储
Pulsar 另一个很有吸引里的特性是,流式数据可以转冷并存储在更廉价的存储介质上。通常为了保证性能,流式处理系统配备高性能的 SSD。对于 Kafka 来说,所有需要保留的消息都必须驻留在昂贵的 SSD 上。有些时候,数据写入一段时间后已不在会被使用,但仍需保留一段时间存档。Pulsar 支持将这种冷数据转储到离线存储系统中,BookKeeper 只需要保留一部分热数据,可以节省很多存储成本。该特性无疑是很有价值的,Kafka 社区同样在进行设计(KIP-405),但目前还没有实现。
Pulsar 的性能指标
Kafka 和 Pulsar 社区都针对性能进行了对比测试。综合来看,由于 Pulsar 数据落盘时,会进行同步 fsync,持久性要比 Kafka 更高,Pulsar 社区对此作出修改后进行对比测试,部分测试结果如下:
*引自 Pulsar 社区性能测试报告
在 100Partition 时,默认配置下 pulsar 的吞吐量距离 Kafka 差距明显,但当本地持久化等级设置为与 Kafka 相同时,吞吐量与 Kafka 基本持平。
*引自 Pulsar 社区性能测试报告
当 Partition 数增加到 2000 个时,Pulsar 默认本地持久度的吞吐量基本与 Kafka 持平。
更多细节请移步 SreamNative 的 benckmarking 测试报告:benchmarking pulsar kafka a more accurate perspective onpulsar performance.pdf
MRS 上的 Pulsar
MRS 已发布 Pulsar 的 POC 版本,客户可以一键式部署 Pulsar 服务,包括 Broker 和 Bookie 角色。支持在 Web UI 上修改 Pulsar 配置、启停、监控。
此外 MRS 还默认集成了 KoP。KoP 是 Pulsar 社区开源的一个插件,运行在 Pulsar 上,用以兼容 Kafka 协议。使用时,Kafka 客户端可以修改连接地址后直接切换到 Pulsar 集群上,而不需要修改业务对 Kafka 客户端的依赖。
在 MRS Pulsar 的商用版本正在规划中,我们将探索 Pulsar 在云上使用的更多可能,进一步发挥 Pulsar 存算分离的优势,降低成本,提升资源利用率,为客户创造更多价值,敬请期待。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/97c9e70b7c8c7711d450a5532】。文章转载请联系作者。
评论