PingCAP刘奇:如何构建一个NewSQL数据库

2023-11-11

PingCAP刘奇:如何构建一个NewSQL数据库

75  0

【编者按】6月24日,由香港主办、开源社群主导的国际技术会议,香港开源年会2016 (HKOSCon)在港召开。PingCAP 联合创始人兼CEO刘奇应邀出席,与大家分享了《How to Build a NewSQL Database》的英文主题演讲。

以下为他的演讲实录:

大家好,我是PingCAP CEO刘奇。今天我将和大家分享一下如何构建一个NewSQL数据库。

首先,来介绍下我自己。和你们当中很多人一样,我是一名开源Hacker,一名架构工程师,并长期致力于创建新一代数据库。我曾投身于以下几个开源项目的工作,包括TiKV、TiDB 和Codis,这些项目都已在Github上发布。今天,我的演讲将涉及下列话题:

  1. 简要介绍NewSQL;
  2. 如何建立一个NewSQL数据库;
  3. 以及roadmap。

▌为什么我们需要一个新的数据库?

在正式开始前,我先问一个问题:你们熟悉数据库吗?熟悉的朋友请举手。谢谢!

另外,有谁知道MySQL吗?谢谢,比我预期的人数要少一些。

那么,现有数据库存在哪些问题呢?

  • 像MySQL、Oracle、PostgreSQL这样的关系数据库,它们的问题是很难扩展。尽管我们有分片技术,还有youtube/vitess和MySQL proxy等,但它们都不支持分布式事务以及cross-node join连接。

  • 像HBase、MongoDB以及Redis这样的NoSQL数据库:它们可扩展,但不支持SQL,同时也舍弃了事务的一致性。

因此,新一代数据库将会是怎样的?在我看来,其主要特征应该是:

  • 支持SQL;
  • 具有可扩展性;
  • 支持事务执行四要素/ACID Transaction;
  • 高可用。

首先,它必须支持SQL,因为这数十年来我们一直在使用SQL,而且许多应用程序都使用SQL,故而不能轻易将其舍弃。

第二,必须有良好的扩展性,也就是说只需通过接入更多的机器就可以扩展其容量或使之实现负载均衡。

第三,必须支持事务的ACID属性,这一点也恰恰是关系数据库的主要特征之一。有了强大的一致性作保障,开发者便可以用较短的代码编写出正确的程序。

最后,即使是在计算机陷入故障,甚至是整个数据中心瘫痪的情况下,它也应该能够保持其较高的可用性。同时,它还应当可以自动修复。

总之,新一代数据库应该既有很好的可扩展性,又能保留关系数据库的主要特征。

▌NewSQL是什么?

你可能会好奇,这样的数据库真的存在吗?它听起来似乎太过完美和理想化了。这个问题的答案是肯定的,这样的数据库的确存在,它就是NewSQL。那什么是NewSQL数据库?先来看一看维基百科给出的解释:

NewSQL是指这样一类新式的关系型数据库管理系统,它针对OLTP实现读-写工作负载,追求提供和NoSQL系统相同的扩展性能,且仍然保持传统数据库支持的ACID特性。

从上述定义来看,我们不难发现NewSQL的扩展性与NoSQL相当,并同时保留了ACID特性。而这恰恰是我们需要的。

▌建立一个NewSQL数据库

今天我将向大家展示如何建立一个这样的数据库。我们受到全球最大数据库Google Spanner 和 F1 的启发,将其分为两个层级:

  • KV层:这一层属于底层存储系统,负责提供跨数据中心的同步以及强一致性事务。
  • SQL层:这一层使能够满足我们对传统SQL数据库可用性以及功能性的支持。

▌建立NewSQL数据库

这就是我们在PingCAP所从事的工作,当然是开源的。其中,我们的数据库分为两层,即KV层和SQL层。就KV层来看,我们有TiKV;对于SQL层,则有TiDB。而我将在稍后介绍其中的关键技术。这里的Ti是Titanium(钛)的缩写,我们都知道钛作为一种抗腐蚀性的化学元素,被广泛应用于高端科技当中。

■TiKV的特性

  • 异地备份:我们利用Raft来支持异地备份。Raft是一种一致性算法,它在容错性和性能方面相当于Paxos算法。我们的实现参考应用广泛的etcd,它已经通过了广泛测试并具有较高的稳定性。

  • 水平扩展性:由于Raft支持 membership 变更,我们利用其这一特性来实现水平扩展。

  • 一致性的分布式事务:这种事务模型的创建是受到了 Google Percolator(来自一篇2006发表的论文)的启发,主要是一个优化的两阶段提交协议。该模型借助一个时间戳分配器来给各项事务分配单调递增的时间戳,因此可检测到冲突。

  • 协处理器支持:与 HBase 类似,我们运用协处理器架构执行服务器代码来进行分布式计算。

  • 追求更高的性能和更低的延迟,用编程语言 Rust 进行了编写。你们当中有谁知道 Rust 吗?很不错。你们应该尝试一下,它真的相当有趣。

✦TiKV架构

图片描述

从上图中可以看出,它经过了高度分层。

从底层往上看。底层是RocksDB,它是一个持久的内嵌式KV存储引擎。RocksDB的最初设计重点在于其极高的性能,可以轻松对读放大、写放大以及空间放大进行优化。

上面一层是Raft KV,这一层用来实现分布式。

再往上是MVCC,即多版本并发控制(Multi-version concurrency control)。我相信你们当中很多人对此都很熟悉。TiKV是一个多版本数据库,而MVCC则支持我们的无锁读以及事务的ACID属性。

接下来的事务(Transaction)层,我之前已经介绍过了。

然后是KV API,这是一组程序接口,它允许开发者对数据的输入和输出。

同样,协处理器(Coprocesser)在前面也提过了。

最后是Placement Driver,这是一个尤为重要的部分,因为它可协助进行异地备份,水平扩展以及一致性的分布式事务。稍后我将对其细节进行进一步补充。

✦TiKV 软件栈

图片描述

让我们来看一下软件栈。首先,我们会发现客户端与TiKV相连。同时我们还能看见几个Node。而在每个Node当中都有Store,每一个物理磁盘存一个store。在每个 Store 当中,我们又划出许多Region。而Region是数据迁移的基本单位,并且经由Raft备份。每个Region都被同步到多个节点。一个 Raft group 由一个 Region 的数个备份组成。如你所见,每个 Region 在三个不同的节点上有三个备份。

✦驱动程序配置

PD,又称 placement driver,这一名称来源自Spanner的原文。它是集群管理器,提供了该集群的上帝视角。它由两个部分构成:rebalancer和timestamp allocator。PD对Region副本进行周期性检测,平衡负载,并自动处理数据迁移。当它检测到负载过高时,将会重新平衡数据。

■TiDB 
- 以TiKV为基础的NewSQL:它将TiKV转变成了一个NewSQL数据库。

  • 异步schema改变:你可以在不停止也不影响正在进行的操作的前提下,添加新的列以及索引。本质上看,它是一个多阶段协议。 
    与MySQL协议兼容:TiDB服务器遵从MySQL协议,并且遵循其SQL语法。换句话说就是在大多情况下,你能够在不更改任何一行代码的同时,通过用TiDB替换MySQL来增强你的应用。TiDB适用于MySQL应用和管理工具,比phpMyAdmin、Navicat以及WordPress。同时,很多ORM也可以在TiDB上很好的工作,例如Hibernate、GORM、ActiveRecord、SQLAlchemy等。

✦TiDB的架构

让我们来看一下TiDB的架构:

图片描述

MySQL客户端:顶层是一组MySQL客户端,这些客户端向下一层发送请求。在这里你仍然可以使用你所熟悉的MySQL驱动程序。

负载平衡器:这一层属于可选层,例如HAProxy 以及 LVS。

TiDB服务器:它是无状态的,一个客户端可以同任何一个TiDB服务器相连接。在TiDB服务器内部,最顶层提供MySQL协议支持;下一层是SQL Plan层,往往被用以将MySQL请求转换成TiDB SQL Plan;底层则是KV API以及分布式SQL API。如果较底层的存储引擎支持协处理器,TiDB SQL层将会使用比KV API更为高效的DistSQL API。TiDB支持插件式存储引擎,早期支持HBase。同时作为试验性存储引擎,我们还支持CockroachDB。但我们推荐TiKV为默认存储引擎。

✦TiDB如何使SQL与KV相匹配

让我们用一个例子来展示一个SQL 表是如何映射成KV对的。

假设我们的数据库里有一张简单的用户表。它有一行三列:nickname、email和age。此处的nickname类型是字符串,且nickname是主键。

nickname email age
bob bob@gmail.com 30

如果我们映射这张表到KV对,Key就分成了三个部分:table、row key、column。而这时的KV对排列如下:

Key (table/row key/column) Value
user/bob/nickname nil
user/bob/email bob@gmail.com
user/bob/age 30

现在,我们得到了一个典型的SQL statement:按用户名bob筛选email和age;如果映射为KV操作的话,则表达如下:

  • email = kv.Get( ” user/bob/email ” )
  • age = kv.Get( ” user/bob/age ” )

这就是在一个使用字符串的通用KV数据库中的存储方式。在TiDB内部,每个表,每一列都有一个唯一的ID。所以TiDB使用表ID以及列ID来取代字符串。因此在TiDB中,表id是1,nickname列id为2,email列id为3,age列id则为4,而这一TiDB表显示如下:

Key (table id/row id/column id) Value
1/bob/2 nil
1/bob/3 bob@gmail.com
1/bob/4 30

以上就是我今天演讲的全部内容。谢谢大家。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PingCAP刘奇:如何构建一个NewSQL数据库 的相关文章

  • TiDB 的数据迁移工具现已开源

    TiDB 是国内 PingCAP 团队开发的一个分布式 SQL 数据库 xff0c 支持包括传统 RDBMS 和 NoSQL 的特性 现已将 DM xff08 data migration platform xff0c 该数据迁移工具 xf
  • TiDB在Centos7上通过源码编译安装

    这里难以编译安装的是tikv tidb的三大部分tidb pd tikv中tidb pd均是采用go语言编写 xff0c 安装go语言包即可编译 xff0c 唯独tikv是采用rust语言写的 xff0c 他的编译是最复杂的 而且编译环境非
  • TIDB使用时的注意点笔记

    场景 xff1a 虽然TiDB号称完全兼容MySQL 5 7 协议 MySQL 5 7 常用的功能及语法 xff0c 但是其与MySQL数据库仍然存在一些差异 xff0c 可能会导致下游TiDB环境故障 以下是我们使用TiDB时需要重点关注
  • TiDB-部署(tiup方式)

    一 环境 ip xff08 非真实 xff09 功能配置192 168 1 1中控机 xff08 监控等位置所在 xff09 最低192 168 1 2TIDB PD TIFLUSH 如果机器多可以分开 高192 168 1 3TIKV 1
  • TIDB-Error 1105: Out Of Memory Quota问题解决

    一 背景 复杂sql查询报错 二 原因 单条s q l使用内存默认为1G 三 解决 tiup cluster edit config tidb test server configs tidb mem quota query 4294967
  • rocksdb 编译安装 日志

    Compilation RocksDB s library should be able to compile without any dependency installed although we recommend installin
  • 猿创征文

    猿创征文 国产数据库实战之TiDB 数据库快速入门 一 系统检查 1 检查系统版本 2 查看本地IP地址 3 TiDB集群介绍 二 快速部署本地测试集群 1 安装 TiUP工具 2 声明全局环境变量 3 快速部署TiDB 集群 三 连接 T
  • 从etcd看Raft协议

    首先 什么是etcd 看官方的定义 A highly available key value store for shared configuration and service discovery 翻译过来就是 用于配置共享和服务发现的K
  • 猿创征文

    猿创征文 国产数据库实战之TiDB 数据库快速入门 一 系统检查 1 检查系统版本 2 查看本地IP地址 3 TiDB集群介绍 二 快速部署本地测试集群 1 安装 TiUP工具 2 声明全局环境变量 3 快速部署TiDB 集群 三 连接 T
  • 大数据时代的Tcaplus游戏存储

    大数据时代的Tcaplus游戏存储 shiweizhang 2015 10 27 1 7k浏览 游戏开发数据分析场景 想免费获取内部独家PPT资料库 观看行业大牛直播 点击加入腾讯游戏学院游戏开发行业精英群711501594 摘要 大数据具
  • TIDB简介及TIDB部署、原理和使用介绍

    TiDB简介及TiDB部署 原理和使用介绍 从MySQL架构到TiDB 数据库分类 介绍TiDB数据库之前 先引入使用场景 如今的数据库种类繁多 RDBMS 关系型数据库 NoSQL Not Only SQL NewSQL 在数据库领域均有
  • 香橙派4和树莓派4B构建K8S集群实践之八: TiDB

    目录 1 说明 2 准备工作 3 安装 3 1 参考Tidb官方 v1 5安装说明 3 2 准备存储类 3 3 创建crd 3 4 执行operator 3 5 创建cluster dashboard monitor容器组 3 6 设置访问
  • PingCAP 创始人刘奇:开源分布式数据库如何搞定 OLTP

    7月28日 以 科技 洞见未来 为主题的 QingCloud Insight 2016 大会将在北京召开 连接云计算产业链上下游 展示 IT 领域最新研发成果 作为 NewSQL 技术的代表 PingCAP 联合创始人 CEO 刘奇将在本次
  • rust官网

    https doc rust lang org std result enum Result html https doc rust lang org std option enum Option html method unwrap 学习
  • TiDB介绍

    目录 TiDB 简介 一 四大核心应用场景 二 TiDB 整体架构 三 TiDB 数据库的存储 Key Value Pairs 键值对 本地存储 RocksDB Raft 协议 Region MVCC 分布式 ACID 事务 参考 TiDB
  • 共识算法 --- PBFT、Raft和Paxos

    目录 一 Raft共识算法 1 什么是Raft 2 Raft的工作流程 3 Raft的相关应用 4 Raft的缺陷 5 Raft中三个子问题 5 1 Leader选举 Election 5 1 1 节点的三种角色 5 1 2 选举过程 5
  • okyo Cabinet简介

    http idning github io ssd cache html http blog 163 com zbr 4690 blog static 126613593200910312346337 http blog chinaunix
  • 【TIDB】TIDB数据类型详解

    TIDB的数据类型 文章目录 TIDB的数据类型 1 数值类型 2 日期和时间类型 3 字符串类型 3 SET 类型 4 JSON类型 1 数值类型 1 整数类型 2 浮点类型 3 定点类型 decamal 20 6 2 日期和时间类型 3
  • /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found错误的解决

    http www cnblogs com weinyzhou p 4983306 html 在安装cmake3 5 1运行 bootstrap的时候出现如下提示 code class hljs asciidoc has numbering
  • 分布式一致性协议Raft原理与实例

    thesecretlivesofdat 分布式一致性协议Raft原理与实例 标签 分布式算法 2015 09 30 20 43 3519人阅读 评论 15 收藏 举报 分类 Hadoop 7 版权声明 本文为博主原创文章 未经博主允许不得转

随机推荐

  • ExtJS Sencha CMD 打包异常报错分析处理 - 2

    今天使用 sencha app build testing 进行编译 然后运行的时候 出现错误 app js dc 1666874035180 81578 Uncaught TypeError t 1 is not a function a
  • yar框架的并行原理分析(libcurl+epoll)

    yar是一个轻量级的php rpc框架 有意思的是它的并行 其实就是libcurl作为网络库提供http请求 然后用epoll做为事件监听来实现整个异步并行调用的 在此基础上 就是如何利用zend api来对整个逻辑的封装了 我们先抛开ze
  • 平衡小车调试总结及心得

    目录 一 知识点 1 PID控制算法 2 平衡原理 二 硬件 1 编码器 2 电机 3 PWM 4 陀螺仪MPU6050 三 PID调节过程 1 理论部分 1 1直立环 1 2速度环 串级PID 1 3 纯比例控制 2 调参步骤 2 1大致
  • sql注入之万能密码总结

    sql注入之万能密码总结 万能密码 万能密码原理 万能密码 asp aspx万能密码 PHP万能密码 jsp 万能密码 万能密码 啊这 一般用来ctf登录的时候试试 这是sqli labs用的时候 我来记录一下 万能密码原理 原验证登陆语句
  • Python基础——函数的基本使用

    文章目录 一 定义 二 属性 三 操作 1 函数的参数 2 函数返回值 3 函数多个返回值 4 多个return语句 5 函数调用函数 6 函数的联系及注释 7 局部变量和全局变量 8 数据的传递 9 lambda表达式 一 定义 1 语法
  • 【TensorFlow】TensorFlow函数精讲之 tf.nn.relu()

    tf nn relu 函数是将大于0的数保持不变 小于0的数置为0 函数如图1所示 ReLU函数是常用的神经网络激活函数之一 图1 ReLU函数图像 下边为ReLU例子 import tensorflow as tf v tf consta
  • 自动控制原理与动态系统的建模与分析

    1 开环系统和闭环系统 反馈控制 1 1开环控制 开环控制系统是指无被控量反馈的系统 即在系统中控制信息的流动未形成闭合回路 1 2 闭环控制 有被控量反馈的控制 即系统的输出信号沿反馈通道又回到系统的输入端 构成闭合通道 也叫做反馈控制
  • go get国内解决办法汇总

    go作为Google大佬的亲儿子 go开发过程中除了SDK自带的包外还经常会需要用到大佬提供的其他包 这些包都在golang org下 而下载这些包需要访问大佬的服务器 国内开发者就会遇到各种的问题 今天就给大家总结一下有哪些途径安装这些包
  • Android Studio Flutter 开发配置

    近来比较闲 就研究下Flutter 开发 在此记录下studio 配置过程 时间是2023 7 19 在 Windows 操作系统上安装和配置 Flutter 开发环境 1 首先下载 Flutter SDKhttps storage flu
  • 基于51单片机水塔水箱液水位WIFI监控报警设计proteus仿真原理图PCB

    功能 0 本项目采用STC89C52作为单片机系统的控制MCU 1 WIFI实时上传当前水位状态 2 通过液位传感器检测液位 检测到最低液位和最高液位时 超过设定阈值将声光报警 3 通过状态指示灯显示当前液位情况 三种颜色 红色代表低于下限
  • python urllib下载文件怎么停止_python下载文件的三种方法

    Python开发中时长遇到要下载文件的情况 最常用的方法就是通过Http利用urllib或者urllib2模块 当然你也可以利用ftplib从ftp站点下载文件 此外Python还提供了另外一种方法requests 下面来看看三种方法是如何
  • unity利用高阶贝塞尔曲线进行的轨道移动

    之前想做一个按照固定的路线进行移动的demo 就想到了路径的曲线 然后就想到了贝塞尔曲线 先上贝塞尔通用公式 借鉴网上的代码和相应的函数公式 组成了一个demo 通用的贝塞尔曲线工具类 using System Collections us
  • elasticsearch基础6——head插件安装和web页面查询操作使用、ik分词器

    文章目录 一 基本了解 1 1 插件分类 1 2 插件管理命令 二 分析插件 2 1 es中的分析插件 2 1 1 官方核心分析插件 2 1 2 社区提供分析插件 2 2 API扩展插件 三 Head 插件 3 1 安装 3 2 web页面
  • Python 基础知识5 元组操作

    元组 与列表不同之处 1 使用 定义 2 定以后元组的元素不能修改 元组定义 只有一个元素时元素后加 号 否则为整型 tup1 hello world 120 123 tup2 1 5 4 2 3 tup3 a b c d tup4 pri
  • Maven项目中读取src/main/resources目录下的配置文件

    在Maven项目的开发中 当需要读取src 下的配置文件时 该怎么做 我们假设Resources下有一个文件名为kafka properties的配置文件 为什么用kafka properties 因为这是在做kafka项目的时候碰到的问题
  • global::System.Runtime.Versioning.TargetFrameworkAttribute 特性重复

    visual studio code 反编译 报错 global System Runtime Versioning TargetFrameworkAttribute 特性重复 在 csproj文件内添加
  • itk.js读取.nii.gz文件,vtk.js进行渲染

    我们只需要用到itk中的 readImageArrayBuffer 从这个api我们可以看出 我们需要的是一个ArrayBuffer的数据 那么 我们通过 vtk js中的vtkHttpDataAccessHelper的方法把数据转换成Ar
  • 提高接口并发量,防止崩溃

    思路 对高并发的接口 单独配置线程池 需考虑线程池内的线程数量 以及tomcat总线程数量与CPU的关系 线程池的配置 接口如何配置单独的线程池 异步任务 Async myExecutors 对实时性要求高的 分析下 实时就是同步 每一次请
  • 如何卸载FF推荐?

    很多小伙伴们都发现 近一段时间 自己的电脑中时常会弹出一个叫 FF新推荐 的广告弹窗 扰民不说显示的内容也很猥亵 按理说 电脑上开启拦截软件后 一般的广告弹窗是不会出现的 那么这个能跳过安全工具拦截的家伙是何背景 能否永久地关闭它 今天小编
  • PingCAP刘奇:如何构建一个NewSQL数据库

    PingCAP刘奇 如何构建一个NewSQL数据库 75 0 0 编者按 6月24日 由香港主办 开源社群主导的国际技术会议 香港开源年会2016 HKOSCon 在港召开 PingCAP 联合创始人兼CEO刘奇应邀出席 与大家分享了 Ho