开发者学堂课程【NoSQL 数据库 Kudu 教程:了解 kudu 数据模型】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/723/detail/12913
了解 kudu 数据模型
内容介绍:
一、 table 与 schema
二、 kudu 底层数据模型
三、 tablet 发现过程
一、table 与 schema
Kudu 设计是面向结构化存储的,因此, Kudu 的表需要用户在建表时定义它的 Schema 信息,这些 Schema 信息包含:列定义(含类型), Primary Key 定义(用户指定的若干个列的有序组合)。这一点与 HBase 不相同, HBase 当中需要组件列、族,列可以动态的扩展,而 Kudu 中必须指定清楚,尤其是 Primary Key 组件,因为 Kudu 根据组件来进行数据的唯一性判断。 Kudu 提供了 Alter 命令来增删列,但位于 Primary Key 中的列是不允许被删除的。将删除组件这一列时,此时数据的唯一性就很难被判断。
从用户使用角度来看, Kudu 是一种存储结构化数据表的存储系统。在一个 Kudu 集群中可以定义任意数量的 table ,每个 table 都需要预先定义好 schema 。每个 table 的列数是确定的,每一列都需要名字和类型,每个表中可以把其中一列或多列定义为主键。这么看来, Kudu 更像关系型数据库,而不像 HBase 、 Cassandra 和 MongoDB 这些 NoSQL 数据库。不过 Kudu 目前还不能像关系型数据一样支持二级索引。
Kudu 使用确定的列类型,而不是类似于 NoSQL 的“ everything is byte ”。带来好处:确定的列类型使 Kudu 可以进行类型特有的编码,可以提供元数据给其他上层查询工具。
二、kudu 底层数据查询
进行数据存储,就会想到文件存储系统。 Kudu 的底层数据查询,未采用 HDFS 这样的较高抽象层次的分布式文件系统,而是自行开发了一套可基于 Table / Tablet / Replica 视图级别的底层存储系统。
如图,在 Kudu 中,定义任何一张表,一个物理层面的 Table 表,它会被分成多个 Tablet (表中的水平划分,相当于 HBase 中的区域划分,它有相当的规则,比如根据列的哈希值进行划分等),每个 Tablet 会被分为两大块,MetaData (Tablet 的元数据信息,用来记录 Tablet 是属于哪个Table )和 RowSet , RowSet 又分为 MemRowSet 和 DiskRowSet ,它会存在于内存和磁盘当中,在内存当中,MemRowSet 主要用于新数据的插入及数据的更新,它的优点在于内存中数据更新的快,缺点在于内存不会无限制的存储。一个 MemRowSet 写满后会将数据刷到磁盘形成若干个 DiskRowSet ,默认是1 G 或者120 S 。在磁盘中的 DiskRowSet 可能会有多个,每刷新一个就会生成一个。在 DiskRowSet 中,又做了划分,首先是 BloomFile ,根据一个DiskRowSet 中的 key 生成一个 bloom filter ,用于快速模糊定位某个 key 是否在 DiskRowSet 中;接下来是 AdhocIndex ,是主键的索引,用于定位 key 在 DiskRowSet 中的具体哪个偏移位置。 BaseData 是 MemRowSet flush 下来的数据,按列存储,按主键有序。 UndoFile 是基于 BaseData 之前时间的历史数据,通过在 BaseData 上 apply UodoFile 中的记录,可以获得历史数据。 RedoFile 是基于 BaseData 之后时间的变更记录,通过在 BaseData 上 apply RedoFile 中的记录,可获得较新的数据。 DeltaMem 用于 DiskRowSet 中数据的变更,先写到内存中,写满后 flush 到磁盘形成 RedoFile 。
在 Kudu 中,把 DiskRowSet 分为了两部分: base data 、 delta stores 。 base data 负责存储基础数据,delta stores 负责存储 base data 中的数据变更。
如上图所示,数据从 MemRomSet 刷到磁盘后就形成了一份 DiskRowSet (只包含 base data),每份 DiskRowSet 在内存中都会有一个对应的 DeltaMlemStore, 负责记录此 DiskRow Set 后续的数据变更(更新、删除)。DeltaMemStore 内部维护一个 B ﹣树索引,映射到每个 row offset 对应的数据变更。 DeltaMemStore 数据增长到一定程度后转化成二进制文件存储到磁盘,形成一个DeltaFile ,随着 base data 对应数据的不断变更, DeltaFile 逐渐增长。
三、tablet 发现过程
当创建 Kudu 客户端时,其会从主服务器务上获取 tablet 位置信息,然后直接与服务于该 tablet 的服务器进行交谈。
为了优化读取和写入路径,客户端将保留该信息的本地缓存,以防止他们在每个请求时需要查询主机的 tablet 位置信息。随着时间的推移,客户端的缓存可能会变得过时,并且当写入被发送到不再是 tablet 领导者的 tablet 服务器时,则将被拒绝。然后客户端将通过查询主服务器发现新领导者的位置来更新其缓存。