这是我参与「第四届青训营-大数据场」笔记创作活动的的第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 集群上。 后续再继续补充有关消息落盘的过程,欢迎交流探讨。