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. [LeetCode] 80. Remove Duplicates from Sorted Array II ☆☆☆(从有序数组中删除重复项之二)

    https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/discuss/27976/3-6-easy-lines-C% ...

  2. JAVA 把小数分成整数和小数

    在进行进制转换的时候,我们需要把小数分为整数和小数两部分. 这里介绍两种方法. 第一种举个例子:1.23分为1 和 0.23 第二种:1.23 分为 1 和23 有时需要具体情况具体分析自己需要哪种类 ...

  3. java自动化学习笔记

    1.需要的框架有哪些?分别有什么作用? 2.对比python/node.js框架查看异同

  4. C# Thread IsAlive 理解

    IsAlive的功能就是判断当前线程是否处于活动状态. public class Program { public static void Main(string[] args) { try { Wr ...

  5. ubuntu安装smartGit

    1.首先安装jdk:(http://www.cnblogs.com/xiaochou/p/install_mint.html 评论区) 2.下载和安装smartGit: http://www.synt ...

  6. [Oracle][DATAGUARD]关于REDO_TRANSPORT_USER参数

    大家可能已经知道,在Oracle的DATAGUARD(这里指的是PHYSICAL STANDBY)环境中,Primary端会把生成的REDO传到Standby端,然后由Standby端的MRP进程应用 ...

  7. python 使用selenium模块实现自动搜索百度百科词条(模拟人工搜索)

    目标:模拟人工搜索百度百科词条,爬取相关信息,自动删除上一个关键词,输入新关键词,继续搜索,直到循环结束. 代码: from selenium import webdriver from seleni ...

  8. redis应用--HyperLogLog

    如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站每个网页每天的 UV 数据,然后让你来开发这个统计模块,你会如何实现? 如果统计 PV 那非常好办,给每个网页一个独立的 Redis 计数器 ...

  9. 记一次JDK升级带来的连环反应

    公司之前有个很久以前的小项目,页面用到了flash. 现在要去掉flash, 前端使用公司自己开发的框架来展示数据, 使用该框架后台要引用一个jar包封装数据传递给前台. 但该框架是jdk1.8编译的 ...

  10. vue实现pc端上拉加载功能,不兼容移动端

    所用插件:Mock.js 这个只用到它简单的功能,拦截ajax请求. vue和axios,vue基础知识请看文档. axios类似于jquery的ajax方法. 以下是是该功能所有代码,其中mock的 ...