热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一文简单理解pulsar和优于kafka的两个痛点

前段时间浪尖推荐过一套奈学的pulsar课程,很多粉丝问浪尖pulsar到底值不值得学习,会不会替代kafka。浪尖个人2018年的时候就接触了puls

前段时间浪尖推荐过一套奈学的pulsar课程,很多粉丝问浪尖pulsar到底值不值得学习,会不会替代kafka。浪尖个人2018年的时候就接触了pulsar,而且贡献了一点点代码到社区里,解决了一个和flink整合的bug。今天是整理一篇文章来简单介绍下pulsar。

1. pulsar的架构

首先,我们先看下pulsar官网给出的pulsar架构,如下图:

从架构图中,pulsar集群主要四大模块:

1)一个或者多个broker节点。

  • broker负责处理和负载均衡从producer接收到的消息。

  • broker也负责分发消息给consumer。

  • broker也负责和pulsar的配置存储同步,以应对多变的协调任务。

  • broker负责将消息存储到BookKeeper集群中。

  • broker也依赖zookeeper集群,负责元数据存储,集群配置,协调任务。

  • broker是无状态的,跟kafka的broker不同之处就是broker本书不会负责数据存储,数据存储是交给了BookKeeper。

  • 等等

2)BookKeeper集群。

消息队列本身理论上讲不需要持久化消息,它只需要完成消息的接收和投递,但是理想的消费者机会可以认为不存在。

pulsar支持临时消息存储的。

消息持久化投递-衍生出来的目的就是为了保证那些未确认送达的消息被再次消费处理的需求。

Pulsar用BookKeeper来做持久化层,这种计算存储-分离的系统还有很多,比如JanusGraph,nebula等。BookKeeper是一个分布式的预写日志(wal)系统。

BookKeeper以下几个特性,比较适合Pulsar的应用场景:

  • 能让Pulsar创建多个独立的日志,这种独立的日志就是ledgers. 随着时间的推移,Pulsar会为Topic创建多个ledgers。

  • 为按条目复制的顺序数据提供了非常高效的存储。

  • 保证了多系统挂掉时ledgers的读取一致性。

  • 提供不同的Bookies之间均匀的IO分布的特性。

  • 容量和吞吐量都能水平扩展。并且容量可以通过在集群内添加更多的Bookies立刻提升。

  • Bookies被设计成可以承载数千的并发读写的ledgers。使用多个磁盘设备,一个用于日志,另一个用于一般存储,这样Bookies可以将读操作的影响和对于写操作的延迟分隔开。

  • 除了消息数据,cursors也会被持久化入BookKeeper。Cursors是消费端订阅消费的位置。BookKeeper让Pulsar可以用一种可扩展的方式存储消费位置。

brokers和bookies是交互过程如下:

着重介绍下ledger

ledger是一个只追加的数据结构,并且只有一个写入器,这个写入器负责多个BookKeeper存储节点(就是Bookies)的写入。ledger的条目会被复制到多个bookies。Ledgers本身有着非常简单的语义:

  • Pulsar Broker可以创建ledeger,添加内容到ledger和关闭ledger。

  • 当一个ledger被关闭后,除非明确的要写数据或者是因为写入器挂掉导致ledger关闭,这个ledger只会以只读模式打开。

  • 最后,当ledger中的条目不再有用的时候,整个legder可以被删除(ledger分布是跨Bookies的)。

  • 读一致性。由于ledger只能被一个进程(也就是写入器进程)写入,这样这个进程就不会在写入时不会有冲突,从而保证了写入的高效。在一次故障之后,ledger会启动一个恢复进程来确定ledger的最终状态并确认提交到日志的是哪一个条。这就保证了所有ledger读进程读取到相同的内容。

  • Managed ledgers 。

    由于BookKeeper提供了单一的日志抽象,在ledger的基础上pulsar提供了一个叫做managed ledger的库,用于表示单个topic的存储层。managed ledger即消息流的抽象,有一个写入器进程不断在流结尾添加消息,并且有多个cursors消费这个流,每个cursor有自己的消费位置。

    一个managed ledger在内部用多个BookKeeper ledgers保存数据,这么做有两个原因:

    • 在故障之后,原有的某个ledger不难再写了,需要创建一个新的。

    • ledger在所有cursors消费完它所保存的消息之后就可以被删除了,这样可以实现ledgers的定期翻滚从头写。

3)zookeeper集群

pulsar主要依赖zookeeper做它擅长的,元数据存储,集群配置和一些协调任务。由于BookKeeper也需要zookeeper,所以企业中这两个zookeeper在负载不是很大的情况下,也可以共享的。

唠唠Zookeeper的观察者

对于pulsar实例:

  • 配置和仲裁存储:

    存储租户,命名域和其他需要全局一致的配置项。

  • 每个集群有自己独立的zookeeper保存集群内部的配置和协调信息,例如归属信息,broker负载报告,BookKeeper ledger信息(这个是BookKeeper自身的依赖)等等。

4)client模块

Pulsar 通过“订阅”,抽象出了统一的: producer-topic-subscription-consumer 消费模型。Pulsar 的消息模型既支持队列模型,也支持流模型。

生产者没啥好介绍的,重点介绍一下,消费者的订阅模式。pulsar也有topic的概念,每个topic对应着BookKeeper中的一个分布式日志。生产者发送消息到指定topic,然后bookKeeper会讲消息存储到多个节点上。topic的消息可以被反复订阅。

跟kafka一样,一个topic可以被多个消费者组消费,不同的是pulsar的每个消费者组可以拥有自己不同的消费方式:独占(Exclusive),故障切换(Failover)或共享(Share)。

  • 独占订阅(Stream 流模型)

    一个消费者组

  • 有且仅有一个消费者消费topic的消息。任何新加消费者都不被允许。独占模式消费者体现互斥性。

  • 故障切换(Stream 流模型)


    多个消费者可以添加到同一个消费者组订阅中,但是一个订阅中的所有消费者,只能有一个活跃的消费者作为主消费者。其他消费者是备胎型消费者。

    顺序性和安全性有点保证。

  • 共享订阅(Queue 队列模型)


    该模式同一个订阅组可以按照需要挂在多个消费者。topic中的所有消息以循环分发的形式发送给订阅组内的多个消费者,一个消息仅传递给一个消费者。

    当消费者断开连接时,所有传递给它但是未被确认(ack)的消息将被重新分配和组织,以便发送给该订阅上剩余的剩余消费者。

    无顺序性。

2. pulsar vs kafka

对于很多粉丝关心的pulsar使用的优点,浪尖也不准备特别细致的介绍,这里主要从故障转移和扩容两个生产痛点介绍下。

a)broker故障

broker故障导致该节点所存储的分区不可用,这个在生产中常见的问题对于kafka来说是相当棘手。在isr列表不为空的情况下,还是能完成分区leader的切换的。但是还要完成副本增加的数据同步的过程,同时邀请ack大于1,才能保证数据不丢失。

pulsar的broker故障,由于broker无状态的(broker只是个代理,存储由BookKeeper负责),所以只牵涉到所有权被其他broker接管的问题。因为它不需要重新复制数据,所以所有权转移立即发生而不会牺牲主题分区的可用性。

b)扩容

kafka集群容量受限于做弱的机器最小的磁盘,当然这种不均衡很少发生,企业中kafka的机器配置往往最硬的。

kafka扩容感觉管理过kafka的朋友都应该体会过其复杂,扩容难点:

1)主要在于增加机器之后,数据需要rebalance到新增的空闲节点,即把partitions迁移到空闲机器上。kafka提供了bin/kafka-reassign-partitions.sh工具,完成parttition的迁移。

2)kafka的集群的数据量加大,数据rebalance的时间较长。

成长型的企业,这点确实会让kafka集群运维管理大佬深恶痛绝。

但是pulsar扩容就相当简单了,broker可以根据需要无影响扩容,存储只需要对BookKeeper集群扩容即可,无需人工去迁移数据,不干扰线上应用。

单就扩容这点,pulsar完虐kafka,pulsar甚至可以存储全量数据。


推荐阅读
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • 在CentOS系统中部署与配置ZooKeeper详解 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文详细介绍了如何在Apache Kafka中进行Topic级别的配置,包括创建、修改和删除配置参数的具体步骤,并提供了详细的配置属性表。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • 本文探讨了使用Python进行微服务架构设计的合理性和适用性。首先,介绍了微服务的基本概念及其在现代软件开发中的重要性。接着,通过具体的业务场景,详细分析了Python在微服务架构设计中的优势和挑战。文章还讨论了在实际应用中可能遇到的问题,并提出了相应的解决方案。希望本文能够为从事Python微服务开发的技术人员提供有价值的参考和指导。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
author-avatar
浅浅的醉意_942_932
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有