在最高配置下,pulsar服务应该由一个或多个pulsar集群组成。
一个pulsar集群可以包括如下组件
在更高级的部署形式中,ZK还负责跨集群的协调任务,例如异地灾备
puslar消息brokers就是 一个无状态组件。主要负责运行如下两个组件。
处于性能考虑,消息通常从管理的ledger缓存中获取来分发。除非backlog(消息积压部分)超过了缓存限制,那么就会从bookKeeper中去读取
最后,为了支持全局主题的异地赋值。broker管理了一些复制器来跟踪本地区域发布的entry。然后推送到远端区域
一个pulsar服务可以由多个puslar 集群组成。一个集群由如下组成
集群可以进行异地数据复制,可以参考指南 clusters
pulsar元数据存储维护了所有pulsar集群的元数据,例如topic,sschema,broker加载数据,等等
pulsar使用zk来进行元数据存储,集群配置,和协调管理 。可以将一个zk集群用于pulsar元数据和BookKeeper元数据存储。
pulsar当然也支持一些别的元数据存储后端服务,例如etcd 和 rocksDB(只支持standalone)。
对于一个pulsar服务来说
configuration store 是一个ZK的Quornums机制(分布式协议),用于配置相关的任务 ,维护了pulsar实例的所有配置。例如集群,租户,命名空间,分区主题相关配置 。同时可以在pulsar实例下跨多个集群共享配置。
pulsar提供了可靠消息传递,如果消息成功抵达broker,将会被传递到预期的目标。这种可靠的消息传递机制,需要存储未ACK的数据直到消息被消费者ACK。这种消息机制被 成为持久化消息传递。在pulsar中所有消息 的N个副本都存储在磁盘上并同步。
apache bookKeeper是pulsar采用的持久化 消息方案。BookKeeper是一个分布式WAL(日志预写)系统。有如下优势
除了消息存储外,puslar数据游标也存储到bookKeeper中 。游标是消费者订阅的位置。BookKeeper使得pulsar可以以扩展的方式存储消费者消费的位置
broker和bookie关系
一个Ledger 就是一个只能追加的数据结构,同时有一个写入器被分配给了多个bookKeeper存储节点。Ledger条目可以被复制到多个bookies。 ledgers用于如下简单的语义
ledger可以理解成一个日志账目,里面存储一个个日志条目。是一些日志的集合
Bookkeeper的主要优势在于保证故障时的读一致性。由于一个ledger只能由一个单独的进程写入,那么对于ledger中 数据的添加就是非常高效的。发生故障后,ledger会进行恢复,恢复到最后提交的日志条目。恢复完后,所有ledger的读者都保证看到的是相同的内容
bk的ledger提供了 一种日志抽象。因此在这之上又延申了一个叫managed ledger的东西。这个玩意就是topic的存储层。一个managed ledger代表了一个消息流的抽象,其中包含一个末尾追加的writer和多个消费者游标
在内部,一个managed ledgers使用了多个bk ledger来存储数据。原因如下:
在bk中,journal文件包含BookKeeper 事务日子。在对ledger更新前,对应bookie需要确保该该leger相关的更新事务已经被持久化。当一个journal文件超过journalMaxSizeMB
,就会新建一个
pulsar分层存储 功能允许将旧的积压数据从BookKeeper移动到长期且更便宜的存储 。同时仍然允许被消费。新数据可以从内存返回。老数据就只能读数据盘
pulsar的消息由managed ledger管理。managed ledger管理了一系列segment。pulsar只能在最后的segment追加日志。 所有之前的segments都是封闭的。
分层存储机制如下:
pulsar broker的代理。如果采用pulsar proxy的部署方式 ,所有连接流量都会过这个代理