TiDB已经在项目中使用,从了解来看,它主要解决的是分布式事务的问题,而我们实际使用场景,却是大数据量下不需要关注分表;

最近实在忙加懒,一直没时间看TiDB的原理。今天看了下PingCAP3篇入门介绍,收获挺多;

首先TiDB的存储使用的是KV,名字叫TiKV,实际数据落地使用的是Facebook开源的RocksDB;

RocksDB只能支持单机存储,TiDB在此之上实现了副本机制,构成集群模式;但多副本模式下,数据一致性成为一个挑战,目前TiDB使用Raft协议保证副本间的数据一致性;具体是多副本中,一个Leader负责所有读/写操作,RocksDB的修改记录,通过Raft log的方式同步到其它副本;

TiDB中引入了Region的概念,一个Region最大64M;这里的Region与Hbase上面实现基本相同,按Key的Range进行划分。

结合上面的副本机制,也就是一个RocksDB分很多Region,每个Region分别有多个副本;

存储的原理基本清楚了,接下来的问题是,数据是以K-V的形式存储,如何支持SQL查询呢?

答案是TiDB实现了一个SQL层,管理SQL语法解析,查询计划等操作;关系数据库支持Insert, Delete, Updata, Select 4 种基本操作,最复杂的是Select操作,一般支持两种模式,一种是简单读取一行,这里面,每条KV记录都有一个RowID,如果有整数型Primary Key,TiDB会使用这个PK作为RowID,同时TiDB维护一个索引,也为KV存储,KEY为Prefix+键值,Value即为这个PK,因此可以单条记录查询。比如一条select * from xxx_tab where age = 18;

执行计划首先从Index prefix_18得到RowID,然后通过RowID查询到数据。第二种支持的是范围查询,TiDB的实现中,K-V中的Key是全局有序,按顺序排列的(相当于一个无限大的sorted map),因此通过上面单条记录查询的方法,定位到StartKey和EndKey很容易实现范围查询。

这点上看,与Hbase的Rowkey设计很类似;

TiDB通过PD(Placement Driver)来实现集群状态管理。

为什么进行集群状态管理?有很多方面考虑,如何管理节点的上下线操作?

如何实现Region Leader的负载均衡?如何保证集群中Region副本的数据正确?

这些都需要一个中心管理单元,这个单元即PD;PD会通过心跳来收集集群中Region,Raft Group(Leader管理)的状态信息,控制整个集群中 Region Leader在服务器上均匀分布,处理节点加入与掉线异常;

这里,PD里面会存储一个Region到Key Range的路由信息,在读取和写入时,通过查询PD,就可以知道自己要读取或查询的Region位置信息。当然这里实现是跟Hbase一致的,Client会缓存一份这个路由信息,避免对PD造成压力,而Client在查询失败时,会去主动拉取一份PD路由表。

另外TiDB中的分布式事务是参考Google Percolator事务模型实现的。通过Raft协议,可以实现对一个Key操作的一致性;但是一个事务操作中,如果涉及到改多个Key,而这多个Key可能在不同Region上面,这就需要分布式事务的保证。

一般简单的分布式事务实现是2PC,但2PC中需要一个协调者存在,Percolator中实现了协调者的高可用;

再简单说一下TiKV与RocksDB的关系,

TiKV 会将数据存储到 RocksDB,任何的数据都最终会转换成一个或者多个K-V 存放到 RocksDB 里面。

每个 TiKV 包含两个 RocksDB 实例,一个用于存储 Raft Log,我们后面称为 Raft RocksDB,而另一个则是存放用户实际的数据,我们称为 KV RocksDB。

NewSQL和TiDB入门的更多相关文章

  1. TiDB入门(四):从入门到“跑路”

    前言 前面三章基本把 TiDB 的环境弄好了,也做了一下简单测试,有兴趣的同学可以看一下: TiDB 入门(一):TiDB 简介 TiDB 入门(二):虚拟机搭建 TiDB-Ansible 部署方案 ...

  2. C#和NewSQL更配 —— TiDB入门(可能是C#下的全网首发)

    阅读目录 背景 TiDB是什么 环境部署 实战 性能测试 结语 一.背景 在上一篇尝试CockroachDB(传送门在此:http://www.cnblogs.com/Zachary-Fan/p/co ...

  3. 最火的分布式 HTAP 数据库 TiDB - 入门实践教程

    偶然在某篇博客看到了 TiDB,一个融合 OLTP 和 OLAP 的分布式开源数据库, GitHub 上 Star 很多,然后 watch 了,发现 commit 和 pull request 一直都 ...

  4. tidb入门

    由于目前的项目把mysql换成了TiDb,所以特意来了解下tidb.其实也不能说换,由于tidb和mysql几乎完全兼容,所以我们的程序没有任何改动就完成了数据库从mysql到TiDb的转换,TiDB ...

  5. 使用TiDB把自己写分库分表方案推翻了

    背景 在日益数据量增长的情况下,影响数据库的读写性能,我们一般会有分库分表的方案和使用newSql方案,newSql如TIDB.那么为什么需要使用TiDB呢?有什么情况下才用TiDB呢?解决传统分库分 ...

  6. 世界级的开源项目:TiDB 如何重新定义下一代关系型数据库

    著名的开源分布式缓存服务 Codis 的作者,PingCAP 联合创始人& CTO ,资深 infrastructure 工程师的黄东旭,擅长分布式存储系统的设计与实现,开源狂热分子的技术大神 ...

  7. 如何进行TIDB优化之Grafana(TiDB 3.0)关注监控指标

    前言 在对数据库进行优化前,我们先要思考一下数据库系统可能存在的瓶颈所在之外.数据库服务是运行在不同的硬件设备上的,优化即通过参数配置(不考虑应用客户端程序的情况下),而实现硬件资源的最大利用化.那么 ...

  8. 京东云TiDB SQL优化的最佳实践

    京东云TiDB SQL层的背景介绍 从总体上概括 TiDB 和 MySQL 兼容策略,如下表: SQL层的架构 用户的 SQL 请求会直接或者通过 Load Balancer 发送到 京东云TiDB ...

  9. OneAPM 技术公开课:北京,北京!

    随着互联网行业的高速发展,数据库已经是绝大多数 IT 应用的核心因素,虽然数据库种类繁多,但是多层体系结构以及 SOA 的发展,使得应用逻辑的实现前移.数据库的性能与其功能相比较,变得越来越重要了. ...

随机推荐

  1. js给图层添加动态样式

    需求:需要在视窗内随意点击对应位置,图层从上到下匀速运动到指定位置 html <img id="moveDot" class="moveDot" src= ...

  2. struts1与struts2的区别。

    1) 两个框架都是MVC的WEB框架, 2) struts1是老牌框架,应用很广泛,有很好的群众基础,使用它开发风险很小,成本低,Struts2核心设计思想主要源自Webwork,实现更优雅,更容易扩 ...

  3. typescript初入门

    1.通过npm安装 typescript 进入终端窗口安装typescript: npm install -g  typescript 查看typescript版本号: tsc -v 2.编译代码:t ...

  4. 关于C++中Hash的应用

    本文只介绍我们在C++中如何使用Hash这种数据结构达到我们编程的目的,有关Hash的概念和实现不做详谈. C++11新增了一类散列容器包括unordered_set, unordered_map, ...

  5. vue做的第二个app

    用vue做应用最好的还是组件的复用上次做饿了吗的app封装了一个评分star的组件只要引入组件传入size大小和score分数就行了,这次做豆瓣直接就就用上了不用重复写代码.不过vue做单页应用全部挂 ...

  6. Python_Mix*函数名的使用以及第一类对象,闭包,迭代器,for循环的内部机制

    一:函数名的应用(第一类对象) 函数名的命名规范和变量是一样的,函数名其实就是变量名, 0)函数名可以赋值给其他变量 def func(): #定义一个名为func的函数 print('my ange ...

  7. vs2017 重新生成报错 MSB4057 BuildDependsOn DependsOnTargets ContainerPrepareForLaunch 解决办法

    环境: win10 vs2017 .net core 删除引用的包: Microsoft.VisualStudio.Azure.Containers.Tools.Targets

  8. Django基础-01

    Django 是基于 Python,所有的 Django 代码都是用Python写成的. Django 特点 强大的数据库功能 拥有强大的数据库操作接口(QuerySet API),如需要也能执行原生 ...

  9. python-之-深浅拷贝二(元组)

    元组比较特殊 1.----元组本身为不可变类型 import copy v1 = (1, 2, 3, 4) v2 = copy.copy(v1) print(id(v1), id(v2)) v3 = ...

  10. 阶段01Java基础day25网络编程

    26.01_网络编程(网络编程概述) A:计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源 ...