本文翻译自 Saket Jain 的系列博客《Choosing Apache Pulsar Over Kafka》。文章讲述了 Apache Pulsar 的优势、常用配置并针对 Linux 系统给予了相应调优建议,值得推荐。
作者:Anshul Singh,译者:傅腾
注:为了行为顺畅,有部分调整。翻译不易,有任何问题,都可以小窗公众号私信,或者直接联系 Pulsar Bot :)
第一部分:探索 Pulsar 的优势
Apache Pulsar是一个开源的分布式消息传递和流处理平台,旨在成为云原生和高度可扩展的系统。它提供了统一的解决方案,既可以进行流处理,又可以进行消息队列处理,使其成为构建实时应用程序、数据管道和微服务架构的多功能工具。
主要特点
- 云原生: 专为在云环境中部署和管理而设计,提供易用性和集成性。
- 高可扩展性: 高效处理大规模数据量,水平扩展以满足不断增长的需求。
- 低延迟: 以最小的延迟传递消息,实现实时应用和数据处理。
- 高吞吐量: 能够处理每秒数百万条消息,适用于高负荷工作。
- 统一流和消息队列: 支持发布-订阅和点对点消息传递模式。
- 多租户: 允许多个租户在独立的命名空间下安全地共享同一个Pulsar集群。
- Geo-Replication:在地理上分散的区域复制数据,用于灾难恢复和高可用性。
- 分层存储: 利用不同的存储技术进行高效的数据生命周期管理和成本优化。
- 开源: 自由和开源软件,促进了一个充满活力的社区和持续改进。
架构
组件
- Brokers: 负责存储和管理消息,形成分布式集群以实现高可用性和可扩展性。
- Bookies: 可扩展的长期消息持久化存储系统。
- ZooKeeper: 用于协调和管理Pulsar集群的外部服务。
- Producers: 将消息发布到指定主题的应用程序。
- Consumers: 订阅特定主题并消费消息的应用程序。
- Topics: 用于组织消息的命名类别,可分为多个分区以方便并行处理。
- Functions: 用于流原生(stream-native)的数据处理的无服务计算(Serverless)的框架。
简单工作流程
- Producers: 将消息发布到选择的主题。
- Brokers: 将消息存储在集群中的分区中。
- Bookies: 将消息持久存储。
- Consumers: 订阅特定主题并接收发布的消息。
- Functions: 实时处理流原生数据以进行消息操作。
使用 Apache Pulsar 的好处
- 可扩展性和高可用性: 处理大规模数据量,并提供容错能力以实现不间断运行。
- 云原生设计: 简化在云环境中的部署和管理。
- 统一流计算和消息队列: 通过单一平台满足实时流计算和消息队列的双重需求。
- 灵活性和开放性: 适应各种用例并与各种技术集成。
- 降低成本: 通过分层存储和多租户优化资源利用。
- 充满活力的社区:提供支持并促进持续创新。
使用案例
Apache Pulsar适用于各种应用,包括:
- 实时分析: 用于欺诈检测、日志分析和传感器数据的流处理。
- 微服务通信: 实现微服务之间可靠且可扩展的通信。
- 物联网数据管理:处理物联网设备产生的大量数据。
- 事件驱动应用程序: 根据事件触发实时工作流程。
- 数据管道: 实现高效的数据移动和处理。
有关架构的更多详细信息,请访问:https://pulsar.apache.org/docs/3.1.x/concepts-architecture-overview/[1]
Apache Pulsar 和 Kafka 之间的比较
Apache Pulsar和Apache Kafka都是领先的开源分布式消息系统。它们通常用于构建实时应用程序、流数据管道和微服务架构。虽然它们有许多相似之处,但也有关键的差异,这些差异可以使其中一个平台在某些情况下更适合。
Apache Pulsar的主要优势
- 流和消息队列的统一: Pulsar可以处理高速实时流式传输(如Kafka)和传统的消息队列模式,从而消除了使用多个系统的需求。这降低了复杂性并简化了基础设施。
- 可选分区: 与Kafka不同,Pulsar中的分区不是强制性的。这提供了更大的灵活性,并避免了低吞吐量主题的不必要开销。
- 分布式日志:Pulsar使用分布式日志进行消息存储,从而实现高效的消息重放(replay)和长期保留。这对于需要访问历史数据的应用程序至关重要。
- 无状态 Brokers: Pulsar brokers是无状态的,这简化了扩展并使其更具容错性,也减少了操作开销并提高了系统的可用性。
- 分层存储Tiered Storage:Pulsar提供分层存储,允许将较旧的消息移动到更便宜、长期存储中,同时保持对最新数据的高性能。这降低了存储成本并提高了资源利用率。
- Quorum-Based 复制: Pulsar提供基于 quorum-based的复制,确保在broker故障的情况下仍然保持数据的一致性和可用性。这对于关键任务的应用程序至关重要。
- 地理感知复制: Pulsar支持地理感知复制,使您能够在地理上分散的区域之间复制数据。这增强了灾难恢复能力,并提高了地理分布应用的性能。
- 更高的吞吐量和更低的延迟:基准测试显示,Pulsar比Kafka具有更高的吞吐量和更低、更一致的延迟。这对于需要高性能和实时处理的应用程序至关重要。
- 云原生设计:Pulsar被设计为云原生,使其在云环境中更易于部署和管理。这对于希望利用云的可扩展性和弹性的组织来说是一个优势。
其他考虑因素
- 社区和生态系统:尽管Kafka拥有更大的社区和生态系统,但Pulsar的社区正在迅速增长,并提供强大的支持。此外,Pulsar与Kafka API的兼容性简化了迁移过程,并降低了学习曲线。
- 成熟度:Kafka是一个比Pulsar更成熟的项目。然而,Pulsar在近年来已经显著成熟,并且现在是一个可靠且适用于生产工作负载的解决方案。
特性对比
表现
- 吞吐量:基准测试显示,Pulsar 通常比 Kafka 具有更高的吞吐量。
- 延迟:与Kafka相比,Pulsar通常具有更低且更一致的延迟。
社区和生态系统
- Kafka: 拥有更大、更成熟的社区,提供更广泛的库和集成。
- Pulsar: 庞大的社区,强大的支持。与Kafka API兼容,便于迁移和学习。
成熟情况
- Kafka: 有大量的生产实践和更成熟的项目案例。
- Pulsar: 在生产实践中迅速成熟开始积累大量案例。
如何选择合适的平台
选择Apache Pulsar和Apache Kafka取决于您的具体需求。考虑以下因素:
- 消息传递要求:如果您同时需要流式传输和消息队列功能,Pulsar提供更好的灵活性。
- 性能需求:如果高吞吐量和低延迟至关重要,Pulsar可能是更好的选择。
- 云化部署: 如果您在云中部署,Pulsar的云原生设计可能具有优势。
- 现有基础设施:如果您已经拥有Kafka生态系统,迁移到Pulsar可能需要额外的努力。
- 社区和支持:如果您需要全面的支持,Kafka的更大社区和生态系统可能会更有帮助。
第二部分:设置 Apache Pulsar 集群
本章节详细介绍了在裸机服务器上部署Apache Pulsar集群的步骤,包括安装、配置和初步使用。
您需要在集群中的每台机器上安装Pulsar二进制包,包括运行ZooKeeper和BookKeeper的机器。要开始在裸机上部署Pulsar集群,您需要通过以下方式之一下载二进制tarball发布版本:
- 直接下载 Pulsar 3.1.1 二进制发布版[2]
- 从 Pulsar 官网下载 downloads page[3]
- 从GitHub上的Pulsar releases page[4] 下载
- 使用wget命令:
wget https://archive.apache.org/dist/pulsar/pulsar-3.1.1/apache-pulsar-3.1.1-bin.tar.gz
- 译者注:国内还可以从各大高校和云厂商维护的镜像服务处下载,如腾讯云的镜像地址[5]。
ZooKeeper
对于运行ZooKeeper的机器,建议使用性能较低的机器或虚拟机。Pulsar仅在周期性协调和配置相关任务中使用ZooKeeper,而不用于基本操作。例如,如果在亚马逊网络服务(AWS)上运行Pulsar,可能只需要一个t2.small实例。
Bookies 和 Brokers
对于运行bookie和Pulsar broker的机器,需要更强大的机器。例如,在AWS部署中,i3.4xlarge实例可能是合适的。在这些机器上,您可以使用以下内容:
- 快速的CPU和10Gbps的网络接口卡(用于Pulsar Brokers)
- 配备RAID控制器和带有电池备份写缓存(BBWC)的小型且快速的固态硬盘(SSD)或硬盘驱动器(HHD)(用户BookKeeper bookies)
硬件
- 最少6台机器,具备以下要求:
- 8 CPUs
- 8 GB RAM
- 快速固态硬盘 SSDs
软件
- ZooKeeper
- BookKeeper
- Apache Pulsar
参考:https://pulsar.apache.org/docs/next/deploy-bare-metal/[6]
集群设置
1. 设置ZooKeeper
- 在每台服务器上编辑
conf/zoo.cfg
文件 - 更新服务器地址和端口,示例:
server.1=:2888:3888
server.2=:2888:3888
server.3=:2888:3888
- 设置数据目录
mkdir -p data/zookeeper
# (其他服务器请使用echo 2、3、4,这是Zookeeper服务器的ID,必须是唯一的)
echo 1 > data/zookeeper/myid
- 使用
bin/pulsar-daemon start zookeeper
启动ZooKeeper服务器
2. 初始化集群元数据
您可以使用 initialize-cluster-metadata
命令来初始化此元数据,该命令是 pulsar
CLI工具的一部分。此命令可以在Pulsar集群中的任何机器上运行,因此可以从ZooKeeper、broker或bookie机器初始化元数据。以下是一个
- 示例:
bin/pulsar initialize-cluster-metadata \
--cluster pulsar-cluster-1 \
--metadata-store zk::2181,:2181 \
--configuration-metadata-store zk::2181,:2181 \
--web-service-url http://:8080 \
--web-service-url-tls https://:8443 \
--broker-service-url pulsar://:6650 \
--broker-service-url-tls pulsar+ssl://:6651
3. 设置BookKeeper
- 在每台服务器上编辑
conf/bookkeeper.conf
文件
- 设置ZooKeeper连接字符串(metadataServiceUri)。
- 配置 ledger storage directories存储目录(
ledgersRootPath
)。 - 调整bookie 端口( bookiePort )。
- 示例:
metadataServiceUri=zk://:2181/ledgers
- 使用
bin/pulsar-daemon start bookie
(在后台启动)和bin/pulsar bookie
(在前台启动)启动BookKeeper服务器 - 使用
bin/bookkeeper shell bookie-sanity
验证BookKeeper是否正在运行
4. 设置Pulsar代理
- 在每台服务器上编辑
conf/broker.conf
文件
- 指定ZooKeeper连接字符串(metadataStoreUrl)。
- 设置BookKeeper服务URL(configurationMetadataStoreUrl)。
- 配置端口和地址。
- 调整broker内存分配(
brokerMaxMemory
)。
- 例子:
metadataStoreUrl=zk::2181,:2181,:2181
configurationMetadataStoreUrl=zk::2181,:2181,:2181
- 还需要指定集群名称(与您在初始化集群元数据时提供的名称相匹配):
clusterName=pulsar-cluster-1
- 此外,您需要在初始化集群的元数据时匹配broker和Web服务端口(尤其是当您使用与默认端口不同的端口时)
brokerServicePort=6650
brokerServicePortTls=6651
webServicePort=8080
webServicePortTls=8443
- 如果您在单节点集群中部署Pulsar,您应该在conf/broker.conf中更新复制设置为1。
- 创建ledger时要使用的bookies数量:
managedLedgerDefaultEnsembleSize=1
- 每条消息存储的副本数量:
managedLedgerDefaultWriteQuorum=1
- 保证的副本数量(在写入完成之前等待的确认数):
managedLedgerDefaultAckQuorum=1
- 使用
bin/pulsar-daemon start broker
(在后台启动)和bin/pulsar broker
(在前台启动)启动BookKeeper服务器 - 使用
bin/pulsar-admin clusters get-clusters
验证Pulsar是否正在运行。
现在设置已完成,我们可以通过创建主题来进行测试:
5. 创建一个主题
- 使用
bin/pulsar-admin topics create
,指定主题类型(persistent
),定义主题名称(persistent://my-topic
)。
例子:
bin/pulsar-admin topics create persistent://my-topic
6. 生产信息
- 使用
bin/pulsar-client produce
,设置主题名称(--topics
),提供消息内容(--message
)。
例子:
bin/pulsar-client produce persistent://my-topic \
--message "Hello Pulsar!"
7. 消费消息
- 使用
bin/pulsar-client consume
,定义订阅名称(--subscription
),指定主题名称(--topics
)。
例子:
bin/pulsar-client consume persistent://my-topic \
--subscription my-subscription
8. 配置更改摘要
- ZooKeeper:
conf/zoo.cfg
: 服务器地址、端口、leader选举、配置管理。 - BookKeeper:
conf/bookkeeper.conf
: ZooKeeper连接字符串,ledger存储,bookie集合大小。 - Pulsar Brokers:
conf/broker.conf
: ZooKeeper连接字符串,BookKeeper服务URL,端口,地址,内存分配。
第三部分:Linux 系统级调优
以下是先前提到的调优参数的详细分解,包括它们的使用方式和对Apache Pulsar性能的影响:
内存
- brokerMaxMemory: 设置每个Pulsar broker进程分配的最大堆大小。增加此值可以改善内存缓存并减少磁盘I/O,但需要更多的物理内存。
- Transparent Huge Pages (THP): 为了提高性能,启用大的连续内存块。这可以使Pulsar的消息缓冲和ledger缓存受益。然而,在某些情况下,THP可能会导致内存碎片问题。
虚拟化
- 虚拟机中禁用THP: 在客户虚拟机中禁用THP可以避免与主机系统设置冲突和潜在的性能问题。
CPU
- CPU 调度器: CPU调度器有两种模式,分别为 “性能模式”和“需求模式”。性能模式可以优先考虑为Pulsar进程分配CPU资源,而需求模式则根据当前的工作负荷动态调整CPU资源分配。建议根据业务需求选择最合适的调度器模式。
在Linux中,设置Apache Pulsar的CPU调度器有两种主要方法:使用cpufreq-set命令和修改系统配置方法。
- 使用cpufreq-set命令。 此命令允许您为特定的CPU或系统中的所有CPU设置CPU调度器。以下是使用方法:
- 将所有CPU的调度策略设置为“performance”:
sudo cpufreq-set -c 0-$(nproc) -g performance
- 将特定CPU(例如,CPU 0)的调度策略设置为“on demand”:
sudo cpufreq-set -c 0 -g ondemand
修改系统配置:这涉及编辑系统配置文件以设置所有进程的默认调度程序。这种方法需要更高级的知识,可能不适用于所有情况。
这里是如何修改系统配置的方法:
- 对于基于Ubuntu的系统:
- 编辑位于sysfs文件系统中的文件 /𝚜𝚢𝚜/𝚍𝚎𝚟𝚒𝚌𝚎𝚜/𝚜𝚢𝚜𝚝𝚎𝚖/𝚌𝚙𝚞/𝚌𝚙𝚞𝟶/𝚌𝚙𝚞𝚏𝚛𝚎𝚚/𝚜𝚌𝚊𝚕𝚒𝚗𝚐_𝚐𝚘𝚟𝚎𝚛𝚗𝚘𝚛
- 将文件内容更改为所需的调度程序(例如,“performance”或“ondemand”)。
- 重复步骤1和2,对系统中的所有CPU执行(例如,/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor)。
对于其他系统:
- 定位适用于您特定系统的配置文件(例如,在Fedora上为/etc/sysconfig/cpupower)。
- 编辑文件并使用特定于配置文件的语法设置所需的调度程序。
- 请查阅您特定系统的文档以获取详细说明。
网络
- net.ipv4.tcp_keepalive_time: 控制发送保持活动探测以维持网络连接的时间间隔。调整此值可以提高网络稳定性和消息传递延迟。
- net.ipv4.tcp_mtu_probing: 启用路径MTU发现,优化Pulsar通信的网络吞吐量。
磁盘 I/O
- 高性能 SSDs: 利用读写速度高、延迟低的固态硬盘,最小化磁盘I/O瓶颈,提高消息处理效率。
- vm.dirty_background_ratio/vm.dirty_ratio: 这些参数控制系统将脏数据写入磁盘的程度。调整这些值可以优化Pulsar的ledger存储的写入性能。
文件系统
- ext4: 这个广泛使用的文件系统为Pulsar的数据存储需求提供了良好的性能和稳定性。配置挂载选项,如noatime以禁用不必要的文件访问时间戳和barrier=0以提高写入性能。
- NFS: 避免使用NFS,因为它固有的延迟和性能限制,特别是对于像Pulsar这样的写入密集型工作负载。
资源限制
- user/group resource limits: 用户/组资源限制:为运行Pulsar进程的用户和组账户设置适当的CPU、内存和磁盘I/O限制。这可以防止其他应用程序占用资源并影响Pulsar的性能。
监控和日志记录
- Prometheus/Grafana: 监控关键指标,如消息吞吐量、延迟和资源消耗,有助于识别瓶颈并优化性能。
- Detailed logging: 启用详细日志记录为在Pulsar集群中进行故障排除和调试问题提供了有价值的信息。
安全
- 防火墙规则: 为Pulsar通信协议(例如TCP)和集群内用于安全通信的ZooKeeper和BookKeeper使用的端口打开必要的防火墙端口。
- ZooKeeper/BookKeeper 安全性: 为ZooKeeper和BookKeeper实施适当的安全措施,如身份验证和授权,以保护您的Pulsar集群免受未经授权的访问。
附加说明
- 始终请参考官方Apache Pulsar文档,以获取有关配置选项及其具体使用指南的最新信息。
- 尝试不同的调整参数,找到适合您特定环境和工作负载特征的最佳配置。
- 监控性能指标和分析日志对于识别性能瓶颈并相应调整调优参数至关重要。
通过了解这些调优参数的使用和影响,您可以优化Apache Pulsar的性能,并确保它在您的Linux环境中运行高效稳定。
参考链接
- 有关Bookkeeper的详细信息,请访问:https://pulsar.apache.org/reference/#/3.1.x/config/reference-configuration-bookkeeper[7]
- Broker配置:https://pulsar.apache.org/reference/#/3.1.x/config/reference-configuration-broker[8]
- 有关Zookeeper配置的信息,请访问:https://pulsar.apache.org/reference/#/3.1.x/config/reference-configuration-zookeeper[9]'
参考资料
[1]
https://pulsar.apache.org/docs/3.1.x/concepts-architecture-overview/: https://pulsar.apache.org/docs/3.1.x/concepts-architecture-overview/
[2]
Pulsar 3.1.1 二进制发布版: https://archive.apache.org/dist/pulsar/pulsar-3.1.1/apache-pulsar-3.1.1-bin.tar.gz
[3]
downloads page: https://pulsar.apache.org/download/
[4]
releases page: https:///apache/pulsar/releases/latest
[5]
镜像地址: https://mirrors.cloud.tencent.com/apache/pulsar/
[6]
https://pulsar.apache.org/docs/next/deploy-bare-metal/: https://pulsar.apache.org/docs/next/deploy-bare-metal/
[7]
https://pulsar.apache.org/reference/#/3.1.x/config/reference-configuration-bookkeeper: https://pulsar.apache.org/reference/#/3.1.x/config/reference-configuration-bookkeeper
[8]
https://pulsar.apache.org/reference/#/3.1.x/config/reference-configuration-broker: https://pulsar.apache.org/reference/#/3.1.x/config/reference-configuration-broker
[9]
https://pulsar.apache.org/reference/#/3.1.x/config/reference-configuration-zookeeper: https://pulsar.apache.org/reference/#/3.1.x/config/reference-configuration-zookeeper