Pulsar | 青训营笔记

102 阅读3分钟

这是我参与「第四届青训营-大数据场」笔记创作活动的的第2天。

深入理解pulsar分层存储

单个pulsar集群由以下三部分组成:

  • 多个broker负责处理和负载均衡producer发出的消息,并将这些消息分派给consumer;broker和pulsar配置存储交互来处理相应的任务,并将消息存储在bookkeeper实例中(又称bookies);broker依赖zookeeper集群处理特定的任务,等等
  • 多个bookie的bookkepper集群负责消息的持久化存储
  • 一个zookeeper集群,用来处理多个pulsar集群之间的协调任务

在一些流数据用例场景中,用户希望将数据长时间存储在流中。虽然pulsar 对topic backlog的大小没有限制,但将所有数据存储在pulsar中较长时间,存储成本比较大。分层存储支持在不影响终端用户的条件下,将较旧的数据移动到长期存储中。

Pulsar为应用提供有保证消息传递,即未确认送达的消息需要持久化存储直到它们被确认送达,在Pulsar内部,所有消息都被保存并同步N份; 1)Apache BookKeeper Pulsar用 Apache BookKeeper作为持久化消息存储,BookKeeper是一个分布式的预写日志(WAL)系统,有如下几个特性特别适合Pulsar的应用场景:

  • 允许Pulsar创建多个独立的日志,这种独立的日志就是ledgers,随着时间的推移,Pulsar会为Topic创建多个ledgers;
  • 为按条目复制的顺序数据提供了非常高效的存储;
  • 保证了多系统挂掉时ledgers的读取一致性;
  • 提供了不同的Bookies之间IO均匀分布的特性;
  • 容量和吞吐量都能水平扩展,并且容量可以通过在集群内添加更多的Bookies立刻得到提升;
  • Bookies被设计成可以承载数千的并发读写的ledgers,通过使用多个磁盘设备,一个用于journal,另一个用于一般存储,这样Bookies可以将读操作的影响和对于写操作的延迟分隔开;

Ledgers Ledger是一个只追加的数据结构,并且只有一个写入器,这个写入器负责多个BookKeeper存储节点(就是Bookies)的写入,Ledger的条目会被复制到多个bookies;

  • Pulsar Broker可以创建ledeger,添加内容到ledger和关闭ledger;
  • 当一个ledger被关闭后,无论是明确关闭或者是因为写入器挂掉,这个ledger只会以只读模式打开;
  • 当ledger中的条目不再有用的时候,整个legder可以被删除(跨所有Bookies);

Pulsar 元数据存储维护一个 Pulsar 集群的所有元数据,例如topic、schema、broker负载等,Pulsar 使用Apache ZooKeeper进行元数据存储、集群配置和协调;Pulsar 元数据存储可以部署在单独的 ZooKeeper 集群上,也可以部署在现有的 ZooKeeper 集群上;您可以将一个 ZooKeeper 集群同时用于 Pulsar 元数据存储和BookKeeper 元数据存储,如果要部署连接到现有 BookKeeper 集群的 Pulsar broker,则需要分别为 Pulsar 元数据存储和 BookKeeper 元数据存储部署单独的 ZooKeeper 集群。

配置存储可以在 Pulsar 实例下的多个集群之间共享配置,配置存储可以部署在单独的 ZooKeeper 集群上,也可以部署在现有的 ZooKeeper 集群上。 后续再继续补充有关消息落盘的过程,欢迎交流探讨。