kudu架构

转载:https://blog.csdn.net/weixin_43230682/article/details/108126757

https://www.jianshu.com/p/8498c168c384

1. Table 
表(Table)是数据库中用来存储数据的对象,是有结构的数据集合。kudu中的表具有 schema(纲要)和全局有序的primary key(主键)。kudu中一个table会被水平分成多个被称之为 tablet 的片段。 

2. Tablet 
一个 tablet 是一张 table连续的片段,tablet是kudu表的水平分区,类似于HBase 的 region。每个 tablet存储着一定连续 range的数据(key),且tablet 两两间的 range 不会重叠。一张表的所有 tablet包含了这张表的所有key 空间。 tablet 会冗余存储。放置到多个 tablet server上,并且在任何给定的时间点,其中一个副本被认为是 leader tablet,其余的被认之为follower tablet。每个 tablet 都可以进行数据的读请求,但只有Leader tablet 负责写数据请求。 

3. Tablet Server 
tablet server 集群中的小弟,负责数据存储,并提供数据读写服务 一个 tablet server 存储了table表的tablet,向kudu client 提供读
取数据服务。对于给定的 tablet,一个 tablet server 充当 leader,其他 tablet server 充当该 tablet 的 follower 副本。 只有 leader 服务写请求,然而 leader 或 followers 为每个服务提供读请求 。一个 tablet server 可以服务多个 tablets ,并且一个 tablet 可以被多个 tablet servers 服务着。 

4. Master Server 
集群中的老大,负责集群管理、元数据管理等功能。

数据分区策略

Kudu对表进行横向分区,Kudu表会被横向切分存储在多个tablets中。不过相比与其他存储引擎,Kudu提供了更加丰富灵活的数据分区策略。一般数据分区策略主要有两种,一种是Range Partitioning,另一种分区策略是Hash Partitioning

  • Range Partitioning: 按照字段值范围进行分区,HBase 就采用了这种方式,优势是在数据进行批量读的时候,可以把大部分的读变成同一个 tablet 中的顺序读,能够提升数据读取的吞吐量。并且按照范围进行分区,我们可以很方便的进行分区扩展。其劣势是同一个范围内的数据写入都会落在单个 tablet 上写的压力大,速度慢
  • Hash Partitioning: 按照字段的Hash值进行分区,Cassandra采用了这个方式,由于是Hash分区,数据的写入会被均匀的分散到各个 tablet 中写入速度快。但是对于顺序读的场景这一策略就不太适用了,因为数据分散,一次顺序读需要将各个 tablet 中的数据分别读取并组合,吞吐量低。并且 Hash 分区无法应对分区扩展的情况。

Kudu支持用户对一个表指定一个范围分区规则和多个 Hash 分区规则

 


作者:xiaogp
链接:https://www.jianshu.com/p/8498c168c384
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

kudu 写流程 
当 Client 请求写数据时,先根据主键从 Master Server 中获取要访问的目标 Tablets,然后到依次对应的 Tablet 获取数据。 

因为 KUDU 表存在主键约束,所以需要进行主键是否已经存在的判断,这里就涉及到之前说的索引结构对读写的优化了。一个Tablet中存在很多个RowSets,为了提升性能,我们要尽可能地减少要扫描的 RowSets数量。 

首先,我们先通过每个 RowSet 中记录的主键的(最大最小)范围,过滤掉一批不存在目标主键的 RowSets,

然后在根据 RowSet 中的布隆过滤器,过滤掉确定不存在目标主键的 RowSets,

最后再通过 RowSets 中的 B-树索引,精确定位目标主键是否存在。 

如果主键已经存在,则报错(主键重复),否则就进行写数据(写 MemRowSet)。

kudu 读流程 
数据读取过程大致如下:先根据要扫描数据的主键范围,定位到目标的Tablets,然后读取 Tablets 中的RowSets。 
在读取每个 RowSet 时,先根据主键过滤要 scan 范围,然后加载范围内的base data,再找到对应的delta stores,应用所有变更,最后union上MemRowSet中的内容,返回数据给 Client。 

原文地址:https://www.cnblogs.com/to-here/p/14694911.html