kudu读写流程

这里写图片描述

  当创建Kudu客户端时,其会从主master上获取tablet位置信息,然后直接与服务于该tablet的服务器进行交谈。为了优化读取和写入路径,客户端将保留该信息的本地缓存,以防止他们在每个请求时需要查询主机的tablet位置信息。随着时间的推移,客户端的缓存可能会变得过时,并且当写入被发送到不是领导者的tablet服务器时,则将被拒绝。然后,客户端将通过查询主服务器发现新领导者的位置来更新其缓存。

读流程:

  • 1、客户端连接TMaster获取表的相关信息,包括分区信息,表中所有tablet的信息
  • 2、客户端找到需要读取的数据的tablet所在的TServer,Kudu接受读请求,并记录timestamp信息,如果没有显式指定,那么表示使用当前时间
  • 3、从内存中读取数据,也就是MemRowSet和DeltaRowSet中读取数据,根据timestamp来找到对应的mutation链表
  • 4、从磁盘中读取数据,从metadata文件中使用boom 
    filter快速模糊的判断所有候选RowSet是否含有此key。然后从DiskRowSet中读取数据,实际是根据B+树,判断key在那些DiskRowSet的range范围内,然后从metadata文件中,获取index来判断rowId在Data中的偏移,或者是利用validex来判断数据的偏移(只有一个key),根据读操作中包含的timestamp信息判断是否需要将base 
    data进行回滚操作从而获取数据

写流程:

Kudu插入一条新数据

  • 1、客户端连接TMaster获取表的相关信息,包括分区信息,表中所有tablet的信息;
  • 2、客户端找到负责处理读写请求的tablet所负责维护的TServer。Kudu接受客户端的请求,检查请求是否符合要求(表结构);
  • 3、Kudu在Tablet中的所有rowset(memrowset,diskrowset)中进行查找,看是否存在与待插入数据相同主键的数据,如果存在就返回错误,否则继续;
  • 4、写入操作先被提交到tablet的预写日志(WAL),并根据Raft一致性算法取得追随节点的同意,然后才会被添加到其中一个tablet的内存中,插入会被添加到tablet的MemRowSet中。为了在MemRowSet中支持多版本并发控制(MVCC),对最近插入的行(即尚未刷新到磁盘的新的行)的更新和删除操作将被追加到MemRowSet中的原始行之后以生成REDO记录的列表。
  • 5、Kudu在MemRowset中写入一行新数据,在MemRowset(1G或者是120s)数据达到一定大小时,MemRowset将数据落盘,并生成一个diskrowset用于持久化数据,还生成一个memrowset继续接收新数据的请求

Kudu对原有数据的更新

  • 1、客户端连接TMaster获取表的相关信息,包括分区信息,表中所有tablet的信息;
  • 2、Kudu接受请求,检查请求是否符合要求;

  • 3、因为待更新数据可能位于memrowset中,也可能已经flush到磁盘上,形成diskrowset。因 此根据待更新数据所处位置不同,kudu有不同的做法:

    • a. 当更新数据位于memrowset时,找到待更新数据所在行,然后将更新操作记录在所在行中一个mutation链表中;在memrowset将数据落盘时,Kudu会将更新合并到base data,并生成UNDO records用于查看历史版本的数据和MVCC,UNDO records实际上也是以DeltaFile的形式存放;
    • b. 当待更新数据位于DiskRowset时,找到待更新数据所在的DiskRowset,每个DiskRowset都会在内存中设置一个DeltaMemStore,将更新操作记录在DeltaMemStore中,在DeltaMemStore达到一定大小时,flush在磁盘,形成Delta并存在方DeltaFile中。

实际上Kudu提交更新时会使用Raft协议将更新同步到其他replica上去,当然如果在memrowset和diskrowset中都没有找到这条数据,那么返回错误给客户端;另外当DiskRowset中的deltafile太多时,Kudu会采用一定的策略对一组deltafile进行合并。

补充:

wal日志的作用是如果我们在做真正的操作之前,先将这件事记录下来,持久化到可靠存储中(因为日志一般很小,并且是顺序写,效率很高),然后再去执行真正的操作。这样执行真正操作的时候也就不需要等待执行结果flush到磁盘再执行下一步,因为无论在哪一步出错,我们都能够根据备忘录重做一遍,得到正确的结果。

转自:https://blog.csdn.net/weixin_39478115/article/details/78470269

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值