专业网站建设的公司,seo百度优化排名,苏州市网站优化,淘宝客手机网站什么是NewSQL 传统SQL的问题 升级服务器硬件 数据分片 NoSQL 的问题 优点 缺点 NewSQL 特性 NewSQL 的主要特性 三种SQL的对比 TiDB怎么来的 TiDB社区版和企业版 TIDB核心特性 水平弹性扩展 分布式事务支持 金融级高可用 实时 HTAP 云原生的分布式数据库 高度兼… 什么是NewSQL 传统SQL的问题 升级服务器硬件 数据分片 NoSQL 的问题 优点 缺点 NewSQL 特性 NewSQL 的主要特性 三种SQL的对比 TiDB怎么来的 TiDB社区版和企业版 TIDB核心特性 水平弹性扩展 分布式事务支持 金融级高可用 实时 HTAP 云原生的分布式数据库 高度兼容 MySQL OLTPOLAP自学 OLTP联机事务处理 OLAP联机分析处理 特性对比 设计角度区别 TiDB 整体架构 TiDB的优势 TiDB的组件 TiDB Server PDPlacement DriverServer TiKV Server TiSpark TiFlash TiKV整体架构 Region分裂与合并 Region调度 分布式事务 高可用架构 TiDB高可用 PD高可用 TiKV高可用 应用场景 MySQL分片与合并 直接替换MySQL 数据仓库 作为其他系统的模块 应用案例 TiDB与MySQL兼容性对比 TiDB不支持的MySql特性 自增ID SELECT 的限制 视图 默认设置差异 字符集 排序规则 大小写敏感 参数解释 timestamp类型字段更新 参数解释 外键支持 TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议具有数据强一致的高可用特性是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。
TiDB是 PingCAP公司自主设计、研发的开源分布式关系型数据库是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP的融合型分布式数据库产品具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。目标是为用户提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解决方案。TiDB 适合高可用、强一致要求较高、数据规模较大等各种应用场景。
什么是NewSQL
数据库发展至今已经有3代了 SQL传统关系型数据库例如 MySQL noSQL例如 MongoDB,Redis newSQL
传统SQL的问题
互联网在本世纪初开始迅速发展互联网应用的用户规模、数据量都越来越大并且要求7X24小时在线。
传统关系型数据库在这种环境下成为了瓶颈通常有2种解决方法
升级服务器硬件
虽然提升了性能但总有天花板。
数据分片 使用分布式集群结构 对单点数据库进行数据分片存放到由廉价机器组成的分布式的集群里可扩展性更好了但也带来了新的麻烦。
以前在一个库里的数据现在跨了多个库应用系统不能自己去多个库中操作需要使用数据库分片中间件。
分片中间件做简单的数据操作时还好但涉及到跨库join、跨库事务时就很头疼了很多人干脆自己在业务层处理复杂度较高。
NoSQL 的问题
后来 noSQL 出现了放弃了传统SQL的强事务保证和关系模型重点放在数据库的高可用性和可扩展性。
优点 高可用性和可扩展性自动分区轻松扩展 不保证强一致性性能大幅提升 没有关系模型的限制极其灵活
缺点 不保证强一致性对于普通应用没问题但还是有不少像金融一样的企业级应用有强一致性的需求。 不支持 SQL 语句兼容性是个大问题不同的 NoSQL 数据库都有自己的 api 操作数据比较复杂。
NewSQL 特性
NewSQL 提供了与 noSQL 相同的可扩展性而且仍基于关系模型还保留了极其成熟的 SQL 作为查询语言保证了ACID事务特性。
简单来讲NewSQL 就是在传统关系型数据库上集成了 NoSQL 强大的可扩展性。
传统的SQL架构设计基因中是没有分布式的而 NewSQL 生于云时代天生就是分布式架构。
NewSQL 的主要特性 SQL 支持支持复杂查询和大数据分析。 支持 ACID 事务支持隔离级别。 弹性伸缩扩容缩容对于业务层完全透明。 高可用自动容灾。
三种SQL的对比 图片
TiDB怎么来的
著名的开源分布式缓存服务 Codis 的作者PingCAP联合创始人 CTO 资深 infrastructure 工程师的黄东旭擅长分布式存储系统的设计与实现开源狂热分子的技术大神级别人物。即使在互联网如此繁荣的今天在数据库这片边界模糊且不确定地带他还在努力寻找确定性的实践方向。关注公z号码猿技术专栏回复关键词1111 获取阿里内部Java性能优化手册
直到 2012 年底他看到 Google 发布的两篇论文如同棱镜般折射出他自己内心微烁的光彩。这两篇论文描述了 Google 内部使用的一个海量关系型数据库 F1/Spanner 解决了关系型数据库、弹性扩展以及全球分布的问题并在生产中大规模使用。“如果这个能实现对数据存储领域来说将是颠覆性的”黄东旭为完美方案的出现而兴奋 PingCAP 的 TiDB 在此基础上诞生了。
TiDB社区版和企业版 TiDB分为社区版以及企业版企业版收费提供服务以及安全性的支持 图片
TIDB核心特性
水平弹性扩展 通过简单地增加新节点即可实现 TiDB 的水平扩展按需扩展吞吐或存储轻松应对高并发、海量数据场景 得益于 TiDB 存储计算分离的架构的设计可按需对计算、存储分别进行在线扩容或者缩容扩容或者缩容过程中对应用运维人员透明。
分布式事务支持
TiDB 100% 支持标准的 ACID 事务
金融级高可用 相比于传统主从 (M-S) 复制方案基于 Raft 的多数派选举协议可以提供金融级的 100% 数据强一致性保证且在不丢失大多数副本的前提下可以实现故障的自动恢复 (auto-failover)无需人工介入 数据采用多副本存储数据副本通过 Multi-Raft 协议同步事务日志多数派写入成功事务才能提交确保数据强一致性且少数副本发生故障时不影响数据的可用性。可按需配置副本地理位置、副本数量等策略满足不同容灾级别的要求。
实时 HTAP TiDB 作为典型的 OLTP 行存数据库同时兼具强大的 OLAP 性能配合 TiSpark可提供一站式 HTAP 解决方案一份存储同时处理 OLTP OLAP 无需传统繁琐的 ETL 过程 提供行存储引擎 TiKV、列存储引擎 TiFlash 两款存储引擎TiFlash 通过 Multi-Raft Learner 协议实时从 TiKV 复制数据确保行存储引擎 TiKV 和列存储引擎 TiFlash 之间的数据强一致。TiKV、TiFlash 可按需部署在不同的机器解决 HTAP 资源隔离的问题。
云原生的分布式数据库
TiDB 是为云而设计的数据库同 Kubernetes 深度耦合支持公有云、私有云和混合云使部署、配置和维护变得十分简单。TiDB 的设计目标是 100% 的 OLTP 场景和 80% 的 OLAP 场景更复杂的 OLAP 分析可以通过 TiSpark 项目来完成。TiDB 对业务没有任何侵入性能优雅的替换传统的数据库中间件、数据库分库分表等 Sharding 方案。同时它也让开发运维人员不用关注数据库 Scale 的细节问题专注于业务开发极大的提升研发的生产力
高度兼容 MySQL
兼容 MySQL 5.7 协议、MySQL 常用的功能、MySQL 生态应用无需或者修改少量代码即可从 MySQL 迁移到 TiDB。
提供丰富的数据迁移工具帮助应用便捷完成数据迁移大多数情况下无需修改代码即可从 MySQL 轻松迁移至 TiDB分库分表后的 MySQL 集群亦可通过 TiDB 工具进行实时迁移。
OLTPOLAP(自学)
OLTP(联机事务处理)
OLTP(Online Transactional Processing) 即联机事务处理OLTP 是传统的关系型数据库的主要应用主要是基本的、日常的事务处理记录即时的增、删、改、查比如在银行存取一笔款就是一个事务交易
联机事务处理是事务性非常高的系统一般都是高可用的在线系统以小的事务以及小的查询为主评估其系统的时候一般看其每秒执行的Transaction以及Execute SQL的数量。在这样的系统中单个数据库每秒处理的Transaction往往超过几百个或者是几千个Select 语句的执行量每秒几千甚至几万个。典型的OLTP系统有电子商务系统、银行、证券等如美国eBay的业务数据库就是很典型的OLTP数据库。
OLAP(联机分析处理)
OLAP(Online Analytical Processing) 即联机分析处理是数据仓库的核心部心支持复杂的分析操作侧重决策支持并且提供直观易懂的查询结果。典型的应用就是复杂的动态报表系统
在这样的系统中语句的执行量不是考核标准因为一条语句的执行时间可能会非常长读取的数据也非常多。所以在这样的系统中考核的标准往往是磁盘子系统的吞吐量带宽如能达到多少MB/s的流量。
特性对比
OLTP和OLAP的特性对比
—OLTPOLAP实时性OLTP 实时性要求高OLTP 数据库旨在使事务应用程序仅写入所需的数据以便尽快处理单个事务OLAP 的实时性要求不是很高很多应用顶多是每天更新一下数据数据量OLTP 数据量不是很大一般只读 / 写数十条记录处理简单的事务OLAP 数据量大因为 OLAP 支持的是动态查询所以用户也许要通过将很多数据的统计后才能得到想要知道的信息例如时间序列分析等等所以处理的数据量很大用户和系统的面向性OLTP 是面向顾客的用于事务和查询处理OLAP 是面向市场的用于数据分析数据库设计OLTP 采用实体 - 联系 ER 模型和面向应用的数据库设计OLAP 采用星型或雪花模型和面向主题的数据库设计
设计角度区别
—OLTPOLAP用户操作人员低层管理人员决策人员高级管理人员功能日常操作处理分析决策主要工作增、删、改查询DB 设计面向应用面向主题数据当前的最新的细节二维的分立的历史的聚集的多维集成的统一的存取读/写数十条记录读上百万条记录工作单位简单的事务复杂的查询用户数上千个上百个DB 大小100MB-GB100GB-TB
TiDB 整体架构
TiDB的优势
与传统的单机数据库相比TiDB 具有以下优势 纯分布式架构拥有良好的扩展性支持弹性的扩缩容 支持 SQL对外暴露 MySQL 的网络协议并兼容大多数 MySQL 的语法在大多数场景下可以直接替换 MySQL 默认支持高可用在少数副本失效的情况下数据库本身能够自动进行数据修复和故障转移对业务透明 支持 ACID 事务对于一些有强一致需求的场景友好例如银行转账 具有丰富的工具链生态覆盖数据迁移、同步、备份等多种场景
TiDB的组件
要深入了解 TiDB 的水平扩展和高可用特点首先需要了解 TiDB 的整体架构。TiDB 集群主要包括三个核心组件TiDB ServerPD Server 和 TiKV Server此外还有用于解决用户复杂 OLAP 需求的 TiSpark 组件。关注公z号码猿技术专栏回复关键词1111 获取阿里内部Java性能优化手册
在内核设计上TiDB 分布式数据库将整体架构拆分成了多个模块各模块之间互相通信组成完整的 TiDB 系统。对应的架构图如下 图片
architecture
TiDB Server
TiDB Server 负责接收 SQL 请求处理 SQL 相关的逻辑并通过 PD 找到存储计算所需数据的 TiKV 地址与 TiKV 交互获取数据最终返回结果。TiDB Server 是无状态的其本身并不存储数据只负责计算可以无限水平扩展可以通过负载均衡组件如 LVS、HAProxy 或 F5对外提供统一的接入地址。
PD (Placement Driver) Server
Placement Driver (简称 PD) 是整个集群的管理模块其主要工作有三个 一是存储集群的元信息某个 Key 存储在哪个 TiKV 节点 二是对 TiKV 集群进行调度和负载均衡如数据的迁移、Raft group leader 的迁移等 三是分配全局唯一且递增的事务 ID。
PD 通过 Raft 协议保证数据的安全性。Raft 的 leader server 负责处理所有操作其余的 PD server 仅用于保证高可用。建议部署奇数个 PD 节点
TiKV Server
TiKV Server 负责存储数据从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region每个 Region 负责存储一个 Key Range从 StartKey 到 EndKey 的左闭右开区间的数据每个 TiKV 节点会负责多个 Region。TiKV 使用 Raft 协议做复制保持数据的一致性和容灾。副本以 Region 为单位进行管理不同节点上的多个 Region 构成一个 Raft Group互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度这里也是以 Region 为单位进行调度。
TiSpark
TiSpark 作为 TiDB 中解决用户复杂 OLAP 需求的主要组件将 Spark SQL 直接运行在 TiDB 存储层上同时融合 TiKV 分布式集群的优势并融入大数据社区生态。至此TiDB 可以通过一套系统同时支持 OLTP 与 OLAP免除用户数据同步的烦恼。
TiFlash
TiFlash 是一类特殊的存储节点。和普通 TiKV 节点不一样的是在 TiFlash 内部数据是以列式的形式进行存储主要的功能是为分析型的场景加速。
TiKV整体架构
与传统的整节点备份方式不同的TiKV是将数据按照 key 的范围划分成大致相等的切片下文统称为 Region每一个切片会有多个副本通常是 3 个其中一个副本是 Leader提供读写服务。TiKV 通过 PD 对这些 Region 以及副本进行调度以保证数据和读写负载都均匀地分散在各个 TiKV 上这样的设计保证了整个集群资源的充分利用并且可以随着机器数量的增加水平扩展。 图片
Region分裂与合并
当某个 Region 的大小超过一定限制默认是 144MB后TiKV 会将它分裂为两个或者更多个 Region以保证各个 Region 的大小是大致接近的这样更有利于 PD 进行调度决策。同样当某个 Region 因为大量的删除请求导致 Region 的大小变得更小时TiKV 会将比较小的两个相邻 Region 合并为一个。
Region调度
Region 与副本之间通过 Raft 协议来维持数据一致性任何写请求都只能在 Leader 上写入并且需要写入多数副本后默认配置为 3 副本即所有请求必须至少写入两个副本成功才会返回客户端写入成功。
当 PD 需要把某个 Region 的一个副本从一个 TiKV 节点调度到另一个上面时PD 会先为这个 Raft Group 在目标节点上增加一个 Learner 副本复制 Leader 的数据。当这个 Learner 副本的进度大致追上 Leader 副本时Leader 会将它变更为 Follower之后再移除操作节点的 Follower 副本这样就完成了 Region 副本的一次调度。
Leader 副本的调度原理也类似不过需要在目标节点的 Learner 副本变为 Follower 副本后再执行一次 Leader Transfer让该 Follower 主动发起一次选举成为新 Leader之后新 Leader 负责删除旧 Leader 这个副本。
分布式事务
TiKV 支持分布式事务用户或者 TiDB可以一次性写入多个 key-value 而不必关心这些 key-value 是否处于同一个数据切片 (Region) 上TiKV 通过两阶段提交保证了这些读写请求的 ACID 约束。
高可用架构
高可用是 TiDB 的另一大特点TiDB/TiKV/PD 这三个组件都能容忍部分实例失效不影响整个集群的可用性。下面分别说明这三个组件的可用性、单个实例失效后的后果以及如何恢复。
TiDB高可用
TiDB 是无状态的推荐至少部署两个实例前端通过负载均衡组件对外提供服务。当单个实例失效时会影响正在这个实例上进行的 Session从应用的角度看会出现单次请求失败的情况重新连接后即可继续获得服务。单个实例失效后可以重启这个实例或者部署一个新的实例。
PD高可用
PD 是一个集群通过 Raft 协议保持数据的一致性单个实例失效时如果这个实例不是 Raft 的 leader那么服务完全不受影响如果这个实例是 Raft 的 leader会重新选出新的 Raft leader自动恢复服务。PD 在选举的过程中无法对外提供服务这个时间大约是3秒钟。推荐至少部署三个 PD 实例单个实例失效后重启这个实例或者添加新的实例。
TiKV高可用
TiKV 是一个集群通过 Raft 协议保持数据的一致性副本数量可配置默认保存三副本并通过 PD 做负载均衡调度。单个节点失效时会影响这个节点上存储的所有 Region。对于 Region 中的 Leader 结点会中断服务等待重新选举对于 Region 中的 Follower 节点不会影响服务。当某个 TiKV 节点失效并且在一段时间内默认 10 分钟无法恢复PD 会将其上的数据迁移到其他的 TiKV 节点上。
应用场景
MySQL分片与合并 图片
TiDB 应用的第一类场景是 MySQL 的分片与合并。对于已经在用 MySQL 的业务分库、分表、分片、中间件是常用手段随着分片的增多跨分片查询是一大难题。TiDB 在业务层兼容 MySQL 的访问协议PingCAP 做了一个数据同步的工具——Syncer它可以把黄东旭 TiDB 作为一个 MySQL Slave将 TiDB 作为现有数据库的从库接在主 MySQL 库的后方在这一层将数据打通可以直接进行复杂的跨库、跨表、跨业务的实时 SQL 查询。黄东旭提到“过去的数据库都是一主多从有了 TiDB 以后可以反过来做到多主一从。”
直接替换MySQL 图片
第二类场景是用 TiDB 直接去替换 MySQL。如果你的IT架构在搭建之初并未考虑分库分表的问题全部用了 MySQL随着业务的快速增长海量高并发的 OLTP 场景越来越多如何解决架构上的弊端呢?
在一个 TiDB 的数据库上所有业务场景不需要做分库分表所有的分布式工作都由数据库层完成。TiDB 兼容 MySQL 协议所以可以直接替换 MySQL而且基本做到了开箱即用完全不用担心传统分库分表方案带来繁重的工作负担和复杂的维护成本友好的用户界面让常规的技术人员可以高效地进行维护和管理。另外TiDB 具有 NoSQL 类似的扩容能力在数据量和访问流量持续增长的情况下能够通过水平扩容提高系统的业务支撑能力并且响应延迟稳定。
数据仓库 图片
TiDB 本身是一个分布式系统第三种使用场景是将 TiDB 当作数据仓库使用。TPC-H 是数据分析领域的一个测试集TiDB 2.0 在 OLAP 场景下的性能有了大幅提升原来只能在数据仓库里面跑的一些复杂的 Query在 TiDB 2.0 里面跑时间基本都能控制在 10 秒以内。当然因为 OLAP 的范畴非常大TiDB 的 SQL 也有搞不定的情况为此 PingCAP 开源了 TiSparkTiSpark 是一个 Spark 插件用户可以直接用 Spark SQL 实时地在 TiKV 上做大数据分析。
作为其他系统的模块 图片
TiDB 是一个传统的存储跟计算分离的项目其底层的 Key-Value 层可以单独作为一个 HBase 的 Replacement 来用它同时支持跨行事务。TiDB 对外提供两个 API 接口一个是 ACID Transaction 的 API用于支持跨行事务另一个是 Raw API它可以做单行的事务换来的是整个性能的提升但不提供跨行事务的 ACID 支持。用户可以根据自身的需求在两个 API 之间自行选择。例如有一些用户直接在 TiKV 之上实现了 Redis 协议将 TiKV 替换一些大容量对延迟要求不高的 Redis 场景。
应用案例 图片
TiDB与MySQL兼容性对比 TiDB支持MySQL 传输协议及其绝大多数的语法。这意味着您现有的MySQL连接器和客户端都可以继续使用。大多数情况下您现有的应用都可以迁移至 TiDB无需任何代码修改。 当前TiDB服务器官方支持的版本为MySQL 5.7 。大部分MySQL运维工具如PHPMyAdmin, Navicat, MySQL Workbench等以及备份恢复工具如 mysqldump, Mydumper/myloader等都可以直接使用。 不过一些特性由于在分布式环境下没法很好的实现目前暂时不支持或者是表现与MySQL有差异 一些MySQL语法在TiDB中可以解析通过但是不会做任何后续的处理 例如Create Table语句中Engine是解析并忽略。
TiDB不支持的MySql特性 存储过程与函数 触发器 事件 自定义函数 外键约束 临时表 全文/空间函数与索引 非 ascii/latin1/binary/utf8/utf8mb4 的字符集 SYS schema MySQL 追踪优化器 XML 函数 X-Protocol Savepoints 列级权限 XA 语法TiDB 内部使用两阶段提交但并没有通过 SQL 接口公开 CREATE TABLE tblName AS SELECT stmt 语法 CHECK TABLE 语法 CHECKSUM TABLE 语法 GET_LOCK 和 RELEASE_LOCK 函数
自增ID
TiDB 的自增列仅保证唯一也能保证在单个 TiDB server 中自增但不保证多个 TiDB server 中自增不保证自动分配的值的连续性建议不要将缺省值和自定义值混用若混用可能会收 Duplicated Error 的错误信息。
TiDB 可通过 tidb_allow_remove_auto_inc 系统变量开启或者关闭允许移除列的 AUTO_INCREMENT 属性。删除列属性的语法是alter table modify 或 alter table change。
TiDB 不支持添加列的 AUTO_INCREMENT 属性移除该属性后不可恢复。
SELECT 的限制 不支持 SELECT ... INTO 变量 语法。 不支持 SELECT ... GROUP BY ... WITH ROLLUP 语法。 TiDB 中的 SELECT .. GROUP BY expr 的返回结果与 MySQL 5.7 并不一致。MySQL 5.7 的结果等价于 GROUP BY expr ORDER BY expr。而 TiDB 中该语法所返回的结果并不承诺任何顺序与 MySQL 8.0 的行为一致。
视图
目前TiDB不支持 对视图进行UPDATE、INSERT、DELETE等写入操作 。
默认设置差异
字符集 TiDB 默认utf8mb4。 MySQL 5.7 默认latin1。 MySQL 8.0 默认utf8mb4。
排序规则 TiDB 中 utf8mb4 字符集默认utf8mb4_bin。 MySQL 5.7 中 utf8mb4 字符集默认utf8mb4_general_ci。 MySQL 8.0 中 utf8mb4 字符集默认utf8mb4_0900_ai_ci。
大小写敏感 关于lower_case_table_names的配置 TiDB 默认2且仅支持设置该值为 2。 MySQL 默认如下 Linux 系统中该值为 0 Windows 系统中该值为 1 macOS 系统中该值为 2
参数解释 lower_case_table_names0 表名存储为给定的大小和比较是区分大小写的 lower_case_table_names 1 表名存储在磁盘是小写的但是比较的时候是不区分大小写 lower_case_table_names2 表名存储为给定的大小写但是比较的时候是小写的
timestamp类型字段更新 默认情况下timestamp类型字段所在数据行被更新时该字段会自动更新为当前时间而参数explicit_defaults_for_timestamp控制这一种行为。 TiDB 默认ON且仅支持设置该值为 ON。 MySQL 5.7 默认OFF。 MySQL 8.0 默认ON。
参数解释 explicit_defaults_for_timestampoff数据行更新时timestamp类型字段更新为当前时间 explicit_defaults_for_timestampon数据行更新时timestamp类型字段不更新为当前时间。
外键支持 TiDB 默认OFF且仅支持设置该值为 OFF。 MySQL 5.7 默认ON。