本文作者:刘德志

腾讯专家工程师、TEG 技术工程事业群和计费零碎开发者

背景

Apache Pulsar 是下一代分布式音讯流平台,采纳计算存储分层架构,具备多租户、高统一、高性能、百万 topic、数据平滑迁徙等诸多劣势。越来越多的企业正在应用 Pulsar 或者尝试将 Pulsar 利用到生产环境中。

腾讯把 Pulsar 作为计费零碎的音讯总线来撑持千亿级在线交易。腾讯计费体量宏大,要解决的外围问题就是必须确保钱货统一。首先,保障每一笔领取交易不呈现错账,做到高统一、高牢靠。其次,保障计费承载的所有业务 7*24 可用,做到高可用、高性能。计费音讯总线必须具备这些能力。

Pulsar 架构解析

在一致性方面,Pulsar 采纳 Quorum 算法,通过 write quorum 和 ack quorum 来保障分布式音讯队列的正本数和强统一写入的应答数(A>W/2)。在性能方面,Pulsar 采纳 Pipeline 形式生产音讯,通过程序写和条带化写入升高磁盘 IO 压力,多种缓存缩小网络申请放慢生产效率。

Pulsar 性能高次要体现在网络模型、通信协议、队列模型、磁盘 IO 和条带化写入。上面我会一一具体解说。

网络模型

Pulsar Broker 是一个典型的 Reactor 模型,次要蕴含一个网络线程池,负责解决网络申请,进行网络的收发以及编解码,接着把申请通过申请队列推送给外围线程池进行解决。首先,Pulsar 采纳多线程形式,充分利用古代零碎的多核优势,把同一工作申请调配给同一个线程解决,尽量避免线程之间切换带来的开销。其次,Pulsar 采纳队列形式实现了网络解决模块及外围解决模块的异步解耦,实现了网络解决和文件 I/O 并行处理,极大地提高了整个零碎的效率。

通信协议 

信息(message)采纳二进制编码,格局简略;客户端生成二进制数据间接发送给 Pulsar 后端 broker,broker 端不解码间接发送给 bookie 存储,存储格局也是二进制,所以音讯生产生产过程没有任何编解码操作。音讯的压缩以及批量发送都是在客户端实现,这能进一步晋升 broker 解决音讯的能力。

队列模型

Pulsar 对主题(topic)进行分区(partition),并尽量将不同的分区调配到不同的 Broker,实现程度扩大。Pulsar 反对在线调整分区数量,实践上反对有限吞吐量。尽管  ZooKeeper 的容量和性能会影响 broker 个数和分区数量,但该限度下限十分大,能够认为没有下限。

磁盘 IO

音讯队列属于磁盘 IO 密集型零碎,所以优化磁盘 IO 至关重要。Pulsar 中的磁盘相干操作次要分为操作日志和数据日志两类。操作日志用于数据恢复,采纳齐全程序写的模式,写入胜利即可认为生产胜利,因而 Pulsar 能够反对百万主题,不会因为随机写而导致性能急剧下降。

操作日志也能够是乱序的,这样能够让操作日志写入放弃最佳写入速率,数据日志会进行排序和去重,尽管呈现写放大的状况,然而这种收益是值得的:通过将操作日志和数据日志挂在到不同的磁盘上,将读写 IO 拆散,进一步晋升整个零碎 IO 相干的解决能力。

条带化写入

条带化写入可能利用更多的 bookie 节点来进行 IO 分担;Bookie 设置了写缓存和读缓存。最新的音讯放在写缓存,其余音讯会批量从文件读取退出到读缓存中,晋升读取效率。

从架构来看,Pulsar 在解决音讯的各个流程中没有显著的卡点。操作日志长久化只有一个线程来负责刷盘,可能会造成卡顿。依据磁盘个性,能够设置多块盘,多个目录,晋升磁盘读写性能,这齐全可能满足咱们的需要。

测试

在腾讯计费场景中,咱们设置雷同的场景,别离对 Pulsar 和 Kafka 进行了压测比照,具体的测试场景如下。

压测数据如下:

以上数据能够看到,网络 IO 方面,3 个正本多分区的状况下,Pulsar 简直要把 broker 网卡出流量跑满,因为一份数据须要在 broker 端散发 3 次,这是计算存储拆散的代价。

Kafka 的性能数据有点让人悲观,整体性能没有下来,这应该和 Kafka 自身的正本同步机制无关:Kafka 采纳的是 follow 同步拉取的策略,导致整体效率并不高。

提早方面,Pulsar 在生产端体现更优越些,当资源没有达到瓶颈时,整个时耗 99% 在 10 毫秒以内,在垃圾回收(Garbage Collection,GC)和创立操作日志文件时会呈现稳定。

从压测的后果来看,在高统一的场景下,Pulsar 性能优于 Kafka。如果设置 log.flush.interval.messages=1 的状况,Kafka 性能体现更差,kafka 在设计之初就是为高吞吐,并没有相似间接同步刷盘这些参数。

此外,咱们还测试了其余场景,比方百万 Topic 和跨地区复制等。在百万 Topic 场景的生产和生产场景测试中,Pulsar 没有因为 Topic 数量增长而呈现性能急剧下降的状况,而 Kafka 因为大量的随机写导致系统疾速变慢。

Pulsar 原生反对跨地区复制,并反对同步和异步两种形式。Kafka 在同城跨地区复制中,吞吐量不高,复制速度很慢,所以在跨地区复制场景中,咱们测试了 Pulsar 同步复制形式,存储集群采纳跨城部署,期待 ACK 时必须蕴含多地应答,测试应用的相干参数和同城统一。测试后果证实,在跨城状况下,Pulsar 吞吐量能够达到 28万QPS。当然,跨城跨地区复制的性能很大水平依赖于以后的网络品质。

可用性剖析

作为新型分布式音讯流平台,Pulsar 有很多劣势。得益于 bookie 的分片解决以及 ledger 抉择存储节点的策略,运维 Pulsar 非常简单,能够解脱相似 Kafka 手动均衡数据搅扰。但 Pulsar 也不是美中不足,自身也存在一些问题,社区仍在改良中。

Pulsar 对 ZooKeeper 的强依赖

Pulsar 对 ZooKeeper 有很强的依赖。在极限状况下,ZooKeeper 集群呈现宕机或者阻塞,会导致整个服务宕机。ZooKeeper 集群奔溃的概率绝对小,毕竟 ZooKeeper 通过了大量线上零碎的考验,应用还是绝对宽泛的。但 ZooKeeper 梗塞的概率绝对较高,比方在百万 Topic 场景下,会产生百万级的 ledger 元数据信息,这些数据都须要与 ZooKeeper 进行交互。

例如,创立一次主题(topic),须要创立主题分区元数据、Topic 名、Topic 存储 ledger 节点;而创立一次 ledger 又须要创立和删除惟一的 ledgerid 和 ledger 元数据信息节点,一共须要 5 次 ZooKeeper 写入操作,一次订阅也须要相似的 4 次 ZooKeeper 写入操作,所以总共须要 9 次写入操作。如果同时集中创立百万级的主题,势必会对 ZooKeeper 造成很大的压力。

Pulsar 具备扩散 ZooKeeper 部署的能力,可能在肯定水平上缓解 ZooKeeper 的压力,依赖最大的是 zookeeperServer 这个 ZooKeeper 集群。从之前的剖析来看,写操作绝对可控,能够通过控制台创立 Topic。bookie 依赖的 ZooKeeper 操作频率最高,如果该 ZooKeeper 呈现阻塞,以后写入并不会造成影响。

能够依照同样的思路优化对 zookeeperServerzk 的依赖。至多对于以后的服务能够继续一段时间,给 ZooKeeper 足够的工夫进行复原;其次缩小 ZooKeeper 的写入次数,只用于必要的操作,比方 broker 选举等。像 broker 的负载信息,能够寻求其余存储介质,尤其是当一个 broker 服务大量主题时,这个信息会达到兆(M)级别。咱们正在和 Pulsar 社区携手优化 broker 负载性能。

Pulsar 内存治理稍简单

Pulsar 的内存由 JVM 的堆内存和堆外存形成,音讯的发送和缓存通过堆外内存来存储,缩小 IO 造成的垃圾回收(GC);堆内存次要缓存 ZooKeeper 相干数据,比方 ledger 的元数据信息和订阅者重推的音讯 ID 缓存信息,通过 dump 内存剖析发现,一个 ledger 元数据信息须要占用约 10K,一个订阅者者重推音讯 ID 缓存初始为 16K,且会持续增长。当 broker 的内存持续增长时,最终频繁进行整体垃圾回收(full GC),直到最终退出。

要解决这个问题,首先要找到能够缩小内存占用的字段,比方 ledger 元数据信息外面的 bookie 地址信息。每个 ledger 都会创建对象,而 bookie 节点十分无限,能够通过全局变量来缩小创立不必要的对象;订阅者重推音讯 ID 缓存能够把初始化管制在 1K 内,定期进行缩容等。这些操作能够大大晋升 Broker 的可用性。

和 Kafka 相比,Pulsar broker 的长处比拟多,Pulsar 可能主动进行负载平衡,不会因为某个 broker 负载过高导致服务不稳固,能够疾速扩容,升高整个集群的负载。

总结

总体来说,Pulsar 在高统一场景中,性能体现优异,目前已在腾讯外部宽泛应用,比方腾讯金融和大数据场景。大数据场景次要基于 KOP 模式,目前其性能曾经十分靠近 Kafka,某些场景甚至曾经超过 Kafka。咱们坚信,在社区和宽广开发爱好者的共同努力下,Pulsar 会越来越好,开启下一代云原生音讯流的新篇章。

相干浏览

  • 译文|Apache Pulsar 的分层存储
  • 译文|如何将 Pulsar 用作音讯队列
  • AMQP on Pulsar 的设计与利用一览