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. C++标准模板库(STL)之Set

    1.Set的用法 Set:集合,一个内部自动有序而且不重复元素的容器.使用set,要加头文件#include<set>和using namespace std; 1.1.Set的定义 se ...

  2. Intellij IDEA 自动清除无效 import

    打开偏好设置: 输入auto import: 注:想在以后的工程中都自动清除,可以在File中如下图操作:

  3. VNPY 文件目录结构

    VNPY ├─examples 可以运行起来的实际程序│ ├─CoinapiDataService│ ├─CryptoTrader│ ├─CtaBacktesting│ ├─CtaTrading│ ├ ...

  4. Python 安装包报错

    以管理员身份运行cmd (requests为为所安装的包名) >>pip install reuqestsCollecting reuqests Could not find a vers ...

  5. 小程序中data数据的处理方法总结(小程序交流群:604788754)

    WXML: <view class="container"> <view wx:for="{{list}}" wx:key="thi ...

  6. java按照指定格式输出系统时间使用SimpleDateFormat方法

    public class TimeThree { public static void main(String[] args) { SimpleDateFormat d = new SimpleDat ...

  7. 字符编码 ASCII、Unicode和UTF-8的关系

    摘抄自廖雪峰 教程 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机 ...

  8. oracle数据库自学笔记(持续更新中……)

    以前的项目都是使用mysql数据库开发的,如今进了新的公司,开始接触到了Oracle数据库,而自己以前没有接触过,就自己挤时间来学习一下. 一.关系型数据库的概念 关系型数据理论由E.F.Codd博士 ...

  9. 蒙层嵌套pdf以及连接后台

    一.在本地浏览pdf(直接将element-dialog 和 iframe相结合)需要将要浏览的pdf放入static文件夹下面 <el-button type="text" ...

  10. nginx 日志打印post请求参数

    在日志格式后面加上 $request_body 配置信息 log_format main '$remote_addr - $remote_user [$time_local] "$reque ...