概况
Pravega 是一款开源的流存储项目,可实现流并充当用于存储或提供连续、无界数据的出色基元。此开源项目由 Dell Technologies 推动并设计。
基本概念
Stream:Pravega 存储的抽象,类似于 Kafka 的 topic,是一种可持久化、可伸缩、仅附加、字节大小无限制的序列,具有高性能和强一致性的特性。在同一个 scope 内 stream 具有命名唯一性,stream 由一个或多个 segment 组成。用户可以在创建 stream 时配置降层策略(RetentionPolicy
)和伸缩策略(ScalingPolicy
)。
Scope:scope 是 stream 的命名空间,将 stream 进行分类和隔离。在多租户场景下,每一个租户拥有一个 scope。例如,具体应用、商业部门等可以划分 scope。
Segment:Pravega 最底层的存储单元,对应 BookKeeper 中的 ledger。stream 由 segment 组成,segment 是 stream 的分片,类似但不局限于 Kafka 的 partition。事件(event)存储在 segment 里。一个 stream 的 segment 的数量可以根据到达数据量和伸缩策略改变,同时也是该 stream 读取时的最大并行度。
事件(event):Pravega IO 操作的最小单位,类似于 Kafka 的 message。事件是 stream 中的可以表示为一组字节的任何事物。例如:来自温度传感器的读数,网站点击和日志数据等。
图5 Stream, segment, event关系示意图
路由键(Routing key):事件所拥有的属性,路由键会通过一致性散列算法(consistent hashing)将事件读写到对应的 segment,因此相同的路由键会将事件路由到相同的 segment,由相同的读客户端读取。路由键是 Pravega 许多读写语义特性的基础。
写客户端(Writer):写客户端是一个可以创建事件并将事件写入一个或多个 stream 中的应用,所有的事件数据都通过附加到 stream 的尾部来写入。
读客户端(Reader):读客户端是一个可以从一个或多个 stream 中读取事件的应用。Pravega 会以负载均衡方式分配 stream 中的 segment 给指定的 Reader。读客户端可以从 stream 中的任何一点读取,比如头部、尾部、中间任何一点。
读者组(Reader Group):读者组由读客户端组成,读者组本质上是为了实现同一个组内读客户端的并行化以及不同组的 stream 读取扇出,类似于 Kafka 的 Consumer Group。同一个读者组内的读客户端可以一起并行读取给定的一组 segment 内的事件。读者组由name
字符串唯一标识。
架构
