2019独角兽企业重金招聘Python工程师标准>>>

上篇文章中,我们介绍了与 TiKV 处理读写请求相关的基础知识,下面将开始详细的介绍 TiKV 的读写流程。Enjoy~

作者:唐刘 @siddontang

RawKV

TiKV 提供两套 API,一套叫做 RawKV,另一套叫做 TxnKV。TxnKV 对应的就是上面提到的 Percolator,而 RawKV 则不会对事务做任何保证,而且比 TxnKV 简单很多,这里我们先讨论 RawKV。

Write

当进行写入,譬如 Write a = 1,会进行如下步骤:

  1. Client 找 PD 问 a 所在的 Region

  2. PD 告诉 Region 相关信息,主要是 Leader 所在的 TiKV

  3. Client 将命令发送给 Leader 所在的 TiKV

  4. Leader 接受请求之后执行 Raft 流程

  5. Leader 将 a = 1 Apply 到 KV RocksDB 然后给 Client 返回写入成功

Read

对于 Read 来说,也是一样的操作,唯一不同在于 Leader 可以直接提供 Read,不需要走 Raft。

TxnKV

Write

对于 TxnKV 来说,情况就要复杂的多,不过大部分流程已经在 Percolator 章节进行说明了。这里需要注意的是,因为我们要快速的 seek 到最新的 commit,所以在 RocksDB 里面,我们会先将 TS 使用 bigendian 生成 8 字节的 bytes,然后将这个 bytes 逐位取反,在跟原始的 key 组合存储到 RocksDB 里面,这样就能保证最新的提交存放到前面,seek 的时候就能直接定位了,当然 seek 的时候,也同样会将对应的 TS 按照相同的方式编码处理。

譬如,假设一个 key 现在有两次提交,commitTS 分别为 10 和 12,startTS 则是 9 和 11,那么在 RocksDB 里面,key 的存放顺序则是:

Write CF:a_12 -> 11
a_10 -> 9Data CF:a_11 -> data_11
a_9 -> data_9

另外,还需要注意的是,对于 value 比较小的情况,TiKV 会直接将 value 存放到 Write CF 里面,这样 Read 的时候只要走 Write CF 就行了。在写入的时候,流程如下:

PreWrite:Lock CF: W a -> Lock + DataCommit:
Lock CF: R a -> Lock + 10 + Data
Lock CF: D aWrite CF: W a_11 -> 10 + Data

对于 TiKV 来说,在 Commit 阶段无论怎样都会读取 Lock 来判断事务冲突,所以我们可以从 Lock 拿到数据,然后再写入到 Write CF 里面。

Read

Read 的流程之前的 Percolator 已经有说明了,这里就不详细解释了。

SQL Key Mapping

我们在 TiKV 上面构建了一个分布式数据库 TiDB,它是一个关系型数据库,所以大家需要关注的是一个关系型的 table 是如何映射到 key-value 上面的。假设我们有如下的表结构:

CREATE TABLE t1 {id BIGINT PRIMARY KEY,name VARCHAR(1024),age BIGINT,content BLOB,UNIQUE(name),INDEX(age),
}

上面我们创建了一张表 t1,里面有四个字段,id 是主键,name 是唯一索引,age 是一个索引。那么这个表里面的数据是如何对应到 TiKV 的呢?

在 TiDB 里面,任何一张表都有一个唯一的 ID,譬如这里是 11,任何的索引也有唯一的 ID,上面 name 就是 12,age 就是 13。我们使用前缀 t 和 i 来区分表里面的 data 和 index。对于上面表 t1 来说,假设现在它有两行数据,分别是 (1, “a”, 10, “hello”) 和 (2, “b”, 12, “world”),在 TiKV 里面,每一行数据会有不同的 key-value 对应。如下:

PK
t_11_1 -> (1, “a”, 10, “hello”)
t_11_2 -> (2, “b”, 12, “world”)Unique Name
i_12_a -> 1
i_12_b -> 2Index Age
i_13_10_1 -> nil
i_13_12_2 -> nil

因为 PK 具有唯一性,所以我们可以用 t + Table ID + PK 来唯一表示一行数据,value 就是这行数据。对于 Unique 来说,也是具有唯一性的,所以我们用 i + Index ID + name 来表示,而 value 则是对应的 PK。如果两个 name 相同,就会破坏唯一性约束。当我们使用 Unique 来查询的时候,会先找到对应的 PK,然后再通过 PK 找到对应的数据。

对于普通的 Index 来说,不需要唯一性约束,所以我们使用 i + Index ID + age + PK,而 value 为空。因为 PK 一定是唯一的,所以两行数据即使 age 一样,也不会冲突。当我们使用 Index 来查询的时候,会先 seek 到第一个大于等于 i + Index ID + age 这个 key 的数据,然后看前缀是否匹配,如果匹配,则解码出对应的 PK,再从 PK 拿到实际的数据。

TiDB 在操作 TiKV 的时候需要保证操作 keys 的一致性,所以需要使用 TxnKV 模式。

结语

上面简单的介绍了下 TiKV 读写数据的流程,还有很多东西并没有覆盖到,譬如错误处理,Percolator 的性能优化这些,如果你对这些感兴趣,可以参与到 TiKV 的开发,欢迎联系我 tl@pingcap.com。

转载于:https://my.oschina.net/zhaiyuan/blog/2244654

TiKV 是如何存取数据的(下)相关推荐

  1. 引擎: 决定数据库存取数据的方式 = 不同的特点 = 不同的用户体验 数据类型: 规定了数据库可以存放哪些数据 约束: 限制存储数据的规则 键...

    Microsoft Windows [版本 10.0.17134.472] (c) 2018 Microsoft Corporation.保留所有权利. C:\Users\Administrator& ...

  2. 探索大数据背景下的基因研究

    基于高性能计算集群这样的新一代测序器和快速演化分析平台,基因研究领域已经被海量数据淹没.众多基因.癌症.医学研究机构和制药公司不断产生的海量数据,已不再能被及时的处理并恰当的存储,甚至通过常规通讯线路 ...

  3. 大数据背景下的信息资源管理

    摘要:随着网络信息化时代的日益普遍,我们正处在一个数据爆炸性增长的"大数据"时代,在我们的各个方面都产生了深远的影响.大数据是数据分析的前沿技术.简言之,从各种各样类型的数据中,快 ...

  4. 干货 | JuiceFS 在携程海量冷数据场景下的实践

    作者简介 妙成,携程云原生研发工程师,主要从事Elasticsearch.JuiceFS的研发运维,关注分布式数据库.NoSQL. 小峰, 携程云原生研发工程师,主要专注于数据库容器化领域,对分布式存 ...

  5. 大数据背景下的分布式存储

    随着人工智能.机器学习领域技术的持续进步,以及国家"新基建"战略的推进,新的技术和应用,加快了传统行业数字化转型,数据呈几何级增长.海量数据在被分析.挖掘中创造出无限价值. 互联网 ...

  6. 柯南君:看大数据时代下的IT架构(5)消息队列之RabbitMQ--案例(Work Queues起航)...

    二.Work Queues(using the Java Client) 走起 在第上一个教程中我们写程序从一个命名队列发送和接收消息.在这一次我们将创建一个工作队列,将用于分发耗时的任务在多个工作者 ...

  7. 大数据时代下的新生态、新洞察、新趋势 | 神策 2019 数据驱动大会

    10 月 22 日,以"矩•变"为主题的神策 2019 数据驱动大会在北京维景国际大酒店顺利举行,来自全球大数据各大行业的领袖人物聚首北京,融合国际前沿技术与行业实践,深入探讨大数 ...

  8. 在目前大数据时代下,怎么能成为一名合格的数据分析师

    "21世纪什么最贵,人才",在目前大数据时代下,什么最难找,什么最贵,实现数据价值的人,数据分析师. 但是对于数据分析师的认识,比较极端,但对数据分析师价值的认识正在回归理性.很多 ...

  9. 独家 | Michael I.Jordan:大数据时代下的安全实时决策堆栈与增强学习(视频+精华笔记)

    金秋九月,2017国际大数据产业技术创新高峰论坛暨大数据系统软件国家工程实验室第一次会议盛大开幕,大数据系统软件国家工程实验室作为大数据系统软件技术研发与工程化的国家级创新平台,将通过大数据系统软件技 ...

最新文章

  1. 关于在hdfs上对数据创建外部表的原因
  2. CN.Text开发笔记—利用反射将数据读入实体类
  3. keil 生成bin找不到afx文件_【学习笔记】Keil不能正确生成.bin文件的解决办法
  4. 错误:找不到或无法加载主类
  5. 使用SpringCloud搭建高可用服务注册中心
  6. css3 弹性盒模型 变化
  7. 小米蓝牙音响驱动_小米手机绝佳配件,20W无线闪充,支持唤醒小爱,只卖149
  8. 计算机仿真在机械应用,机械系统计算机仿真
  9. 分治法解决赛程安排问题
  10. linux cpan 参数配置,Perl学习笔记之CPAN使用介绍
  11. 计算机系统:异常控制流
  12. 我是如何记笔记的--谈谈自己的学习方法
  13. LDO和DCDC电路的区别以及PCB设计选择
  14. Html监听Fbx文件加载,Three.js 导入fbx
  15. 算法与数据结构-分治法
  16. 基于51单片机密码锁数码管显示步进电机开锁设计
  17. 软件测试实验——编写测试用例
  18. Android开发知识体系,技术实现
  19. webview 禁止苹果自动下拉_苹果手机如何拥有百变铃声?酷狗铃声1分钟搞定!-时尚呼吸...
  20. Windows PATH 环境变量的长度限制

热门文章

  1. useReducer使用和原理
  2. 理解vue中if和for指令不能同时使用
  3. linux打开文件vi,在Linux中使用vi打开文件时如何显示行号,及跳转到指定行
  4. mysql查询不确定的信息_mysql-非常复杂的查询,不确定是否可行.涉及...
  5. python百万并发压测_100W高并发(转载) - 橙子柠檬's Blog
  6. mysql报表慢_mysql慢查询日志报表工具mysqlsla
  7. 20201124:力扣第216场周赛(上)
  8. linux scp 隐藏文件,scp 客户端发现了隐藏 35 年的漏洞
  9. 数组占位符_Java基础 方法和数组
  10. 定时任务的选型及改造