不同数据库的读写操作

86 阅读3分钟

hbase: 写数据: 1685939261993(1).png

1Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server#zk   get /hbase/meta-region-server
2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey,查询出目标数据位于哪个 Region Server 中的哪个 Region 中。
  并将该 table 的 region 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。  #hbase scan 'hbase:meta'  查询到具体哪张表由哪个Region Server维护
3)与目标 Region Server 进行通讯;
4)将数据顺序写入(追加)到 WAL;
5)将数据写入对应的 MemStore,数据会在 MemStore 进行排序;
6)向客户端发送 ack;
7)等达到 MemStore 的刷写时机后,将数据刷写到 HFile。

读数据:

image.png

1Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey,查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
3)与目标 Region Server 进行通讯;
4)分别在 Block Cache(读缓存),MemStore 和 Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。
5)将从文件中查询到的数据块(Block,HFile 数据存储单元,默认大小为 64KB)缓存到Block Cache。
6)将合并后的最终结果返回给客户端。

doris xie.infoq.cn/article/4cc… 写入: 1685941059054(1).png

  1. FE 接收用户的写入请求,并随机选出 BE 作为 Coordinator BE。将用户的请求重定向到这个 BE 上。
  2. Coordinator BE 负责接收用户的数据写入请求,同时请求 FE 生成执行计划并对调度、管理导入任务 LoadJob 和导入事务。
  3. Coordinator BE 调度执行导入计划,执行对数据校验、清理之后。
  4. 数据写入到 BE 的存储层中。在这个过程中会先写入到内存中,写满一定数据后按照存储层的数据格式写入到物理磁盘上。

DeltaWriter 数据写入采用了类 LSM 树的结构,将数据先写到 Memtable 中,当 Memtable 数据写满后,会异步 flush 生成一个 Segment 进行持久化,同时生成一个新的 Memtable 继续接收新增数据导入。 Memtable 中采用了跳表的结构对数据进行排序,排序规则使用了按照 schema 的 key 的顺序依次对字段进行比较。这样保证了写入的每一个写入 Segment 中的数据是有序的

1685941733785.png 明细模型中Sort Key就是指定的用于排序的列(即 DUPLICATE KEY 指定的列),聚合模型中Sort Key列就是用于聚合的列(即 AGGREGATE KEY 指定的列),唯一主键模型中Sort Key就是指定的满足唯一性约束的列(即 UNIQUE KEY 指定的列),所以排序可能是按照多个key排序

读: 各种索引优化

clickhouse: 写入流程: blanklin030.github.io/2022/04/05/…

本地表写入,然后挂一个分布式表,shards配上一个轮询。 blog.csdn.net/m0_37899908…

也是lsm的,会用建表的ordery by字段排序,其实跟doris很像。

读: 各种索引优化