[From] http://kuaibao.qq.com/s/20180510G0UFL000?refer=cp_1026

最近TiDB掀起了一波分布式数据库的热潮,公司也在着手准备TiDB的落地工作,前几天也参与了几场公司针对TiDB的分享会,下面我们了解一下关于TiDB。

TiDB 是什么?

TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。

TiDB怎么来的?

著名的开源分布式缓存服务 Codis 的作者,PingCAP联合创始人& CTO ,资深 infrastructure 工程师的黄东旭,擅长分布式存储系统的设计与实现,开源狂热分子的技术大神级别人物。即使在互联网如此繁荣的今天,在数据库这片边界模糊且不确定地带,他还在努力寻找确定性的实践方向。

直到 2012 年底,他看到 Google 发布的两篇论文,如同棱镜般,折射出他自己内心微烁的光彩。这两篇论文描述了 Google 内部使用的一个海量关系型数据库 F1/Spanner ,解决了关系型数据库、弹性扩展以及全球分布的问题,并在生产中大规模使用。“如果这个能实现,对数据存储领域来说将是颠覆性的”,黄东旭为完美方案的出现而兴奋, PingCAP 的 TiDB 在此基础上诞生了。

TiDB架构

TiDB在整体架构基本是参考 Google Spanner 和 F1 的设计,上分两层为TiDBTiKV。 TiDB 对应的是 Google F1, 是一层无状态的 SQL Layer ,兼容绝大多数 MySQL 语法,对外暴露 MySQL 网络协议,负责解析用户的 SQL 语句,生成分布式的 Query Plan,翻译成底层 Key Value 操作发送给 TiKV , TiKV 是真正的存储数据的地方,对应的是 Google Spanner ,是一个分布式 Key Value 数据库,支持弹性水平扩展,自动的灾难恢复和故障转移(高可用),以及 ACID 跨行事务。值得一提的是 TiKV 并不像 HBase 或者 BigTable 那样依赖底层的分布式文件系统,在性能和灵活性上能更好,这个对于在线业务来说是非常重要。

▲ TiDB 整体架构

所以一套集群是又这样的3类角色共同组建而成。每个部分的解释如下:

TiDB Server

TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回结果。 TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(如LVS、HAProxy 或 F5)对外提供统一的接入地址。

PD Server

Placement Driver (简称 PD) 是整个集群的管理模块,其主要工作有三个: 一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁移等);三是分配全局唯一且递增的事务 ID。 PD 是一个集群,需要部署奇数个节点,一般线上推荐至少部署 3 个节点。

TiKV Server

TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range (从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region 。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,不同节点上的多个 Region 构成一个 Raft Group,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。 当然做这件事情,我是认真的,而不是简单试一下就完事了。我列了一个基本的计划,来看看是否能够满足一些痛点,改进一些情况。

TiDB开发语言

在 TiDB 研发语言的选择过程中,放弃了 Java 而采用 Go 。TiDB整个项目分为两层,TiDB 作为 SQL 层,采用 Go 语言开发, TiKV 作为下边的分布式存储引擎,采用 Rust 语言开发。在架构上确实类似 FoundationDB,也是基于两层的结构。 FoundationDB 的 SQL Layer 采用 Java ,底层是 C++ ,不过在去年,被 Apple 收购了。 在选择编程语言并没有融入太多的个人喜好偏向, SQL 层选择 Go 相对 Java 来说:

第一是 他们团队的背景使用 Go 的开发效率更高,而且性能尚可,尤其对于高并发程序而言,可以使用 goroutine / channel 等工具用更少的代码写出正确的程序;

第二是 在标准库中很多包对网络程序开发非常友好,这个对于一个分布式系统来说非常重要;

第三是 在存储引擎底层对于性能要求很高,Go 毕竟是一个带有 GC 和 Runtime 的语言,在 TiKV 层可以选择的方案并不多,过去基本只有 C 或 C++,不过近两年随着 Rust 语言的成熟,又在经过长时间的思考和大量实验,最终他们团队选择了 Rust( Rust是Mozilla开发的注重安全、性能和并发性的编程语言。“Rust”,由web语言的领军人物Brendan Eich(js之父),Dave Herman以及Mozilla公司的Graydon Hoare 合力开发。)。

TiDB 对比 NOSQL

TiDB 对于这些 NoSQL 来说,最大的特点是编程接口是 SQL,SQL对于开发者而言是更加灵活的操作数据库的方式,且对 MySQL 有着极高的兼容性—原业务的 MySQL切换到 TiDB 几乎一行代码都不用修改就可以完成。TiDB 在支持 SQL 的同时有没有丧失 HBase 这样的系统的弹性扩展能力,业务层不需要再去关心数据库的容量,不用去考虑分库分表,也不用像过去那样投入很大的运维力量,扩容只需简单加机器就好,存储节点故障对业务透明,而且数据库本身具有自我修复的能力,保证数据不会丢失。 对于 MongoDB 也是一样,更重要的是不需要改变用户已有的习惯和程序,而且为了定义未来的云上的数据库形态,TiDB 设计的目标是单集群需要可以 Scale 到 1000 以上物理节点的规模,支持 P 级别容量,万亿以上的行的结构化数据存储,在这个前提约束下的设计和技术选型和 MongoDB 很不一样,在大数据量的情况下 TiDB 的表现更稳定,扩展更加平滑。 TiDB 的 SQL 优化器是黄东旭他们从头开始实现的一个面向分布式存储设计的查询优化器,使用了很多学术界很新的查询优化技术和分布式计算框架的思想,保证 MySQL 兼容性的前提下比 MySQL 在复杂查询下表现要好得多。

与 MySQL 兼容性对比

TiDB 支持包括跨行事务,JOIN 及子查询在内的绝大多数 MySQL 的语法,用户可以直接使用现有的 MySQL 客户端连接。如果现有的业务已经基于 MySQL 开发,大多数情况不需要修改代码即可直接替换单机的 MySQL。

包括现有的大多数 MySQL 运维工具(如 PHPMyAdmin, Navicat, MySQL Workbench 等),以及备份恢复工具(如 mysqldump, mydumper/myloader)等都可以直接使用。

不过一些特性由于在分布式环境下没法很好的实现,目前暂时不支持或者是表现与 MySQL 有差异。

一些 MySQL 语法在 TiDB 中可以解析通过,但是不会做任何后续的处理,例如 Create Table 语句中 Engine 以及 Partition 选项,都是解析并忽略。更多兼容性差异请参考具体的文档。

不支持的特性

存储过程

视图

触发器

自定义函数

外键约束

全文索引

空间索引

非 UTF8 字符集

TiDB 基本操作

下面具体介绍 TiDB 中基本的增删改查操作。

创建、查看和删除数据库

使用 CREATE DATABASE 语句创建数据库。语法如下:

CREATE DATABASE db_name [options];

例如,要创建一个名为 samp_db 的数据库,可使用以下语句:

CREATE DATABASE IF NOT EXISTS samp_db;

使用 SHOW DATABASES 语句查看数据库:

SHOW DATABASES;

使用 DROP DATABASE 语句删除数据库,例如:

DROP DATABASE samp_db;

创建、查看和删除表

使用 CREATE TABLE 语句创建表。语法如下:

CREATE TABLE table_name column_name data_type constraint;

例如:

CREATE TABLE person (

number INT(11),

name VARCHAR(255),

birthday DATE

);

如果表已存在,添加 IF NOT EXISTS 可防止发生错误:

CREATE TABLE IF NOT EXISTS person (

number INT(11),

name VARCHAR(255),

birthday DATE

);

使用 SHOW CREATE 语句查看建表语句。例如:

SHOW CREATE table person;

使用 SHOW FULL COLUMNS 语句查看表的列。 例如:

SHOW FULL COLUMNS FROM person;

使用 DROP TABLE 语句删除表。例如:

DROP TABLE person;

或者

DROP TABLE IF EXISTS person;

使用 SHOW TABLES 语句查看数据库中的所有表。例如:

SHOW TABLES FROM samp_db;

创建、查看和删除索引

对于值不唯一的列,可使用 CREATE INDEX 或 ALTER TABLE 语句。例如:

CREATE INDEX person_num ON person (number);

或者

ALTER TABLE person ADD INDEX person_num (number);

对于值唯一的列,可以创建唯一索引。例如:

CREATE UNIQUE INDEX person_num ON person (number);

或者

ALTER TABLE person ADD UNIQUE person_num on (number);

使用 SHOW INDEX 语句查看表内所有索引:

SHOW INDEX from person;

使用 ALTER TABLE 或 DROP INDEX 语句来删除索引。与 CREATE INDEX 语句类似,DROP INDEX 也可以嵌入 ALTER TABLE 语句。例如:

DROP INDEX person_num ON person;

ALTER TABLE person DROP INDEX person_num;

增删改查数据

使用 INSERT 语句向表内插入数据。例如:

INSERT INTO person VALUES("1","tom","20170912");

使用 SELECT 语句检索表内数据。例如:

SELECT * FROM person;

+--------+------+------------+

| number | name | birthday |+--------+------+------------+

| 1 | tom | 2017-09-12 |+--------+------+------------+

使用 UPDATE 语句修改表内数据。例如:

UPDATE person SET birthday='' WHERE name='tom';

SELECT * FROM person;

+--------+------+------------+

| number | name | birthday |+--------+------+------------+

| 1 | tom | 2017-10-10 |+--------+------+------------+

使用 DELETE 语句删除表内数据:

DELETE FROM person WHERE number=1;

SELECT * FROM person;

Empty set (0.00 sec)

创建、授权和删除用户

使用 CREATE USER 语句创建一个用户 tiuser,密码为 123456:

CREATE USER 'tiuser'@'localhost' IDENTIFIED BY '';

授权用户 tiuser 可检索数据库 samp_db 内的表:

GRANT SELECT ON samp_db.* TO 'tiuser'@'localhost';

查询用户 tiuser 的权限:

SHOW GRANTS for tiuser@localhost;

删除用户 tiuser:

DROP USER 'tiuser'@'localhost';

[转] 遇见 TiDB - 分布式关系数据库的更多相关文章

  1. 遇见 TiDB

    遇见 TiDB 文章来源:企鹅号 - 塔塔驿站 最近TiDB掀起了一波分布式数据库的热潮,公司也在着手准备TiDB的落地工作,前几天也参与了几场公司针对TiDB的分享会,下面我们了解一下关于TiDB. ...

  2. 性能跃升50%!解密自主研发的金融级分布式关系数据库OceanBase 2.0

    小蚂蚁说: 相信大家对蚂蚁金服自主研发的金融级分布式关系数据库OceanBase的故事不再陌生了.在刚刚过去的2018年天猫双11中,成交额2135亿再次创造了新纪录,而支撑今年双11的支付宝核心链路 ...

  3. 阿里云分布式关系数据库DRDS笔记

    1.Join左边的表查询数据越少,性能越好 2.广播表作为Join的驱动表 3.SQL的Limit优化 SELECT * FROM t_order o WHERE o.id IN ( SELECT i ...

  4. Pulsar云原生分布式消息和流平台v2.8.0

    Pulsar云原生分布式消息和流平台 **本人博客网站 **IT小神 www.itxiaoshen.com Pulsar官方网站 Apache Pulsar是一个云原生的分布式消息和流媒体平台,最初创 ...

  5. Web负载均衡与分布式架构

     参考帖子: Web负载均衡的几种实现方式 大型网站架构系列:负载均衡详解(上) DNS 原理入门 解决nginx负载均衡的session共享问题 什么是消息队列 Java应用架构的演化之路 Java ...

  6. (三)分布式数据库tidb-隔离级别详解

    tidb隔离级别详解: 1.TiDB 支持的隔离级别是 Snapshot Isolation(SI),它和 Repeatable Read(RR) 隔离级别基本等价,详细情况如下: ● TiDB 的 ...

  7. TiDB 压力测试报告

    (转载自公众号DBATech) 一.测试环境 1.tidb 集群架构: 测试使用最基本的TiDB架构.即 3个tidb-server节点+ 3个tikv节点 + 3个pd节点. 2.tidb集群的部署 ...

  8. TiDB基本简介

    一.TiDB整体架构 与传统的单机数据库相比,TiDB具有以下优势: 纯分布式架构,拥有良好的扩展性,支持弹性的扩缩容 支持SQL,对外暴露MySQL的网络协议,并兼容大多数MySQL的语法,在大多数 ...

  9. MySQL面试必考知识点:揭秘亿级高并发数据库调优与最佳实践法则

    做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离... 数据库的使用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多. 今天我们用10分钟 ...

随机推荐

  1. docker-compose up启动又停止,需要加tty为true

    如果docker-compose.yml如下,则用docker-compose up -d启动起来的容器可能会立即停止. version: '2' services: mir-http-repo: i ...

  2. UVa 10603 Fill (暴力BFS+优先队列)

    题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻, 某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和d ...

  3. [label][Node.js] Three content management systems base on Node.js

    1. Keystonejs http://keystonejs.com/ 2. Apostrophe http://apostrophenow.org/

  4. Postgres的TOAST技术

    一.介绍 首先,Toast是一个名字缩写,全写是The OverSized Attribute Storage Technique,即超尺寸字段存储技术,顾名思义,是说超长字段在Postgres的一个 ...

  5. Varnish 学习资料收集

    高性能HTTP加速器Varnish(安装配置篇) 利用Varnish构建Cache服务器笔记 Varnish代理服务器部署 Varnish基础概念详解 Varnish的配置语言VCL及其内置变量介绍 ...

  6. Solr相似度算法二:Okapi BM25

    地址:https://en.wikipedia.org/wiki/Okapi_BM25   In information retrieval, Okapi BM25 (BM stands for Be ...

  7. CSS3 线性渐变linear-gradient

    CSS3 Gradient 分为 linear-gradient(线性渐变)和 radial-gradient(径 向渐变).为了更好的应用 CSS3 Gradient,需要先了解一下目前的几种现代浏 ...

  8. .Net core 2.0的数据初始化

    在StartUp.cs里面,添加Seed方法 public static void Seed(IApplicationBuilder applicationBuilder) { using (var ...

  9. sqlserver排名函数

    在做开发的时候,排名函数是sqlserver经常用到的函数,在分页的时候需要用,分组的时候也要用,主要排名函数有row-number,rank(),dense-rank(),NTILE()接下来详细说 ...

  10. 一次MySQL线上慢查询分析及索引使用

    本文由作者郑智辉授权网易云社区发布. 0.前言 本文通过分析线上MySQL慢查询日志,定位出现问题的SQL,进行业务场景分析,结合索引的相关使用进行数据库优化.在两次处理问题过程中,进行的思考. 1. ...