目录
1、Brokers 代理服务器
2、Clusters 集群
3、Metadata store 元数据存储
4、Configuration store 配置存储
5、Persistent storage 持久化存储
(1)Apache BookKeeper 存储实体
(2)Ledgers 分类账
(3)Journal storage 日志存储
6、Pulsar proxy(代理)
7、Service discovery 服务发现
从一个最高层级来看,Pulsar 实例可以由一个或多个 Pulsar 集群组成。在该 Pulsar 实例中的子集群可以从其他子集群中复制数据。
Pulsar 集群:
下图为一个 Pulsar 集群提供了说明:// 三个组件:Broke(理解为处理器)、BookKeeper(理解为存储器)、ZooKeeper(理解为协调器)
从更广泛的实例级别来看,一个实例级别的 ZooKeeper 集群可以调用配置存储,来处理涉及多个集群的协调任务,比如,异地备份。// 实例级别,可以理解为应用级别或应用层次
Brokers 是一个无状态组件,主要负责运行以下两个组件:
为了提高性能,broker 通常从被管理的 Ledger 缓存中进行消息分派,除非 backlog 日志(积压消息)超过了缓存的容量。如果因为 backlog 日志太大而导致缓存不可用,broker 将会开始从 BookKeeper 中读取消息,然后再进行分发。// BookKeeper 是 pulsar 的持久化存储, backlog 日志用来存储没有被消费的消息,Ledger 是比 BookKeeper 更小的存储分片
最后,为了支持全局主题的异地备份,broker 可以操作本地的复制器,该复制器会跟踪本地已经发布的数据,并使用 Pulsar Java 客户端库将这些数据推送到远程的区域。
对于怎样管理 Pulsar brokers,请参阅更详细的指南。
一个 Pulsar 实例由一个或多个 Pulsar Clusters 组成,集群依次包括下边几个部分:
通过异地备份,集群节点之间可以进行数据复制。
对于怎样管理 Pulsar clusters,请参阅更详细的指南。
Pulsar 元数据存储会保存 Pulsar 集群中的所有元数据,比如,主题元数据、schema、broker 加载的数据等。Pulsar 使用 Apache ZooKeeper 来进行元数据存储、集群配置和集群协调信息。Pulsar 元数据存储可以部署在单独的 ZooKeeper 集群上,也可以部署在已有的 ZooKeeper 集群上。一般情况下,你可以使用同一个 ZooKeeper 集群来进行 Pulsar 元数据存储和 BookKeeper 元数据存储。但是,当你把 Pulsar Brokers 连接到已有的 ZooKeeper 集群上时,你需要分别为 Pulsar 元数据存储和 BookKeeper 元数据存储单独部署一个 ZooKeeper 集群。// 为什么呢?会跟已有的 Zookeeper 的某些数据冲突吗?
Pulsar 还支持更多元数据后端服务,包括etcd 和 RocksDB (仅适用于单独部署的 Pulsar)。
在 Pulsar 实例中:// 集群配置和集群协调信息有哪些?
配置存储,存储 Pulsar 实例的所有配置信息,比如,集群配置、租户配置、命名空间配置、分区主题的相关配置等等。一个 Pulsar 实例(instance)可以由一个本地实例(cluster) 、或者多个本地实例,甚至多个跨区域的实例组成。所以,在一个 Pulsar 实例(instance)中,配置存储中的数据是可以跨多个集群进行共享的。 配置存储可以部署在单独的 ZooKeeper 集群上,也可以部署在已有的 ZooKeeper 集群上。// 这里单独的和已有的是相互对立的,单独的 ZooKeeper 实例可以理解为新的 ZooKeeper 实例
Pulsar 为应用程序提供可靠的消息传递服务。如果消息成功到达了 Pulsar Broker,它将被传递到其预定的目标。
这种可靠的消息传递要求没有被消费者确认消费的消息都能够被持久化的存储,直到它们被消费者消费,这种消息传递模式通常称为持久化消息传递。在 Pulsar 中,所有的消息都拥有 N 个备份被存储和同步在磁盘上,比如,跨两台服务器的 4 个备份,在每台服务器上都拥有多个 RAID 镜像卷。// 一条消息,多个备份
Pulsar 使用 Apache BookKeeper 对消息进行持久化存储。Apache BookKeeper 是一个分布式的预写日志(WAL)系统,为 Pulsar 提供了许多关键优势:// 预写日志,就是操作前先在日志中记录该操作,方便后续数据恢复或排错。BookKeeper 由多个 Bookies 组成。
除了消息数据以外,游标也持久化存储在 BookKeeper 中。游标是消费者的订阅位置。BookKeeper 使 Pulsar 能够以可扩展的方式存储消费者的消费位置。
目前,Pulsar 支持消息的持久化存储。这就解释了所有主题名称中的持久性。下面是一个示例:
persistent://my-tenant/my-namespace/my-topic
Pulsar 同时也支持非持久化(non-persistent)的消息主题。
你可以在下图中看到 Brokers 和 Bookies 是如何互动的:// Broker 把数据存储在多个 Bookie 上
Ledger 是一种通过单独的写,仅可以做追加的数据结构,它被分配到多个 BookKeeper 存储节点上,或者 Bookies 上。Ledger 上的数据(entries)可以被复制到多个 Bookies 上,它本身具有非常简单的语义:
// Ledger 由 Broker 进行操作,只能添加,不能修改,数据以 Ledger 为单位进行删除
Ledger 读取一致性
Bookkeeper 的主要优势在于,它可以在出现故障时保证 Ledgers 的读取一致性。由于 Ledger 只能通过单个线程进行写入,因此该线程可以非常有效地向 Ledger 中随意的添加数据,而无需和其他线程进行竞争。当程序奔溃后,Ledger 会执行一个恢复机制,该机制会确定 Ledger 的最终状态,并且确定最后提交到 Ledger 中的数据。所以,经过 Ledger 恢复机制,所有的 Readers 都能看到完全相同的内容。// Ledger 本身就是一个日志格式的文件,在介绍 Bookkeeper 也提到了
各个名词之间的关系:Bookkeeper -> Bookies -> Ledgers -> entries(具体数据)
Managed ledgers(单个主题的存储层)
考虑到 Bookkeeper Ledgers 提供了一个单独的日志抽象接口,因此,在 Ledgers 之上开发了一个库,称为 Managed ledgers,它表示单个主题的存储层。一个 Managed ledger 表示了该主题一连串消息的抽象,这些消息都是通过一个写入程序不断向后追加而保存的,同时还保存了多个游标的信息,每个游标都记录了与它们关联的消费者的消费位置。// 表示单个主题的消息和游标的抽象
在 Pulsar 内部,单个 Managed Ledger 使用多个 BookKeeper Ledgers 来存储数据。使用多个 Ledgers 进行数据存储,主要有两个原因:
当写入失败后,Ledger 不可以再进行写操作,需要重新创建新的 Ledger 。// 数据结构本身的限制
当 Ledger 中的所有游标都消费完了 Ledger 中的消息时,Ledger 可以被删除。这样做,可以允许 Ledgers 定期的回滚。// 空间重复利用
在 BookKeeper 中,日志文件用来存储 BookKeeper 的事务日志。在对 Ledger 进行更改之前,Bookie 需要确保将该事务写入持久(非易失性)存储。一但 Bookie(注意,不是 Broker)启动,就会创建一个新的日志文件,或者当达到日志文件大小的阈值时,也会创建一个新的日志文件。(使用 journalMaxSizeMB 配置日志文件的大小)
Pulsar 客户端与 Pulsar 交互的一种方法是直接连接到 Pulsar 的 Broker。但是,在某些情况下,因为客户端无法直接访问到 Broker 的地址,这种直接连接的方法,就变得不可行或者不可取。比如,如果你在云端环境或这 Kubernetes 等类似的平台上运行 Pulsar,客户端就无法直接连接到 Pulsar 的 Broker。
Pulsar proxy 为上述问题提供了解决方案,那就是使用 Pulsar proxy 作为集群中所有 Brokers 的唯一网关。运行 Pulsar proxy 后,所有客户端与 Pulsar 实例(cluster)的连接都会通过 Pulsar proxy 进行,而无需与 Brokers 直接通信。// 跟 Spring Cloud 很像,使用统一网关,屏蔽后台服务
为了提高性能和容错性,你可以运行任意多个的 Pulsar proxy 实例。
从架构上讲,Pulsar proxy 可以从 ZooKeeper 获取它需要的所有信息。当在一台机器上启动 proxy 时,你只需要为特定的集群(cluster-specific)提供元数据存储的连接(字符串形式),以及所有实例的配置存储集群的连接。下面是一个示例:// 需要配置两个属性
$ cd /path/to/pulsar/directory
$ bin/pulsar proxy \
--metadata-store zk:my-zk-1:2181,my-zk-2:2181,my-zk-3:2181 \
--configuration-metadata-store zk:my-zk-1:2181,my-zk-2:2181,my-zk-3:2181
Pulsar proxy docs(文献)
一些使用 Pulsar proxy 的文档,请点击这里。
关于 Pulsar proxy,有一些重要的点需要了解:
客户端使用一个单独的 URL 连接到 Pulsar Brokers 后,需要能够与整个 Pulsar 实例进行通讯。// 注意,Pulsar 实例中包含了一个或多个 Pulsar Cluster 集群。
你可以使用自己的服务发现系统。但是,当你使用自己的服务发现系统,需要满足一个要求,那就是当客户端向端点(endpoint)发出一个 HTTP 请求时,比如:http://pulsar.us-west.example.com:8080,客户端需要能够被重定向到期望集群的一个活跃的 Broker 上,无论该要求是通过 DNS、HTTP 或 IP 重定向,或是其他方式实现的。// 服务发现需要支持正确的重定向
下图描述了 Pulsar 的服务发现:
在上图中,Pulsar cluster 可通过单个的 DNS 名称:pulsar-cluster.acme.com 进行寻址。例如,Python 客户端可以像这样访问该 Pulsar cluster:
from pulsar import Client
client = Client('pulsar://pulsar-cluster.acme.com:6650')
注意事项
在 Pulsar 中,每一个主题仅由一个 Broker 处理。客户端发出的读取、更新或删除主题的初始请求可能会发送给一个与此主题不相关的 Broker(非正确的主题的代理)。如果该 Broker 无法处理此主题的请求,它会将请求重定向到合适的 Broker 进行处理。// 服务发现的核心就是支持正确的重定向。
点击回到首页