一名开发者眼中的 TiDB 与 MySQL 选择
作者: angryart 原文来源:https://tidb.net/blog/60200e06
TiDB 长期霸榜国产数据库第一名,社区活跃人气旺盛。作为 TiDB 其中的一个粉丝,我把近年的学习调研实践归纳如下,TiDB 是一款通用性的数据解决方案,任何数据场景都可以使用它来解决问题,所以它与所有市场上所有的数据库产品 多多少少存在直接上的或者间接上的竞争关系。
那么市场竞争上谁是 TiDB 的第一梯队竞争对手, 本人认为是 MySQL 是其中一个,当然也可以是 Oracle、DB2 等等,主要是 MySQL 在中国深入人心,工程师信手拿来就能使用。
TiDB 与 MySQL 的对比
有些人直接称 TiDB 为大号的 MySQL,其实不对,为了工程师像使用 MySQL 使用 TiDB,TiDB 在接口层下了大量的功夫,在语法、表名、引用甚至元数据方面尽量与 MySQL 贴合,但是每个语句背后执行的都是不同的数据流程和服务流向。
类型上比较,MySQL 是纯粹单机式数据库,TiDB 是分布式数据库,TiDB 可以方便自由增加节点扩展存算能力,而 MySQL 增加节点增强性能,必须通过定向策略,例如中间件路由或者读写分离的方式,显得呆滞固化。
引擎上比较,MySQL 有 myisam、innodb、memory 等引擎 ,也可以通过插件支持更多的引擎例如 rocksdb,HandlerSocket 等等,而 TiDB 虽然只有两个引擎, 但是却能应对所有的应用场景。
架构上比较,MySQL 是偏紧密耦合,分为三层分别是接口层、服务层、存储层,接口层负责请求处理、授权认证、安全,服务层负责查询解析、分析、优化、缓存、系统内置函数,存储层负责数据的 存储和处理,统一体现在一个服务进程上。TiDB 则是松散耦合型,把数据库的关键组件抽象,根据本身分布式的特性,分别是计算层、存储层、协调层。
TiDB 计算层类似 MySQL 接口层,负责负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过协调层找到存储计算所需存储层数据的地址,与 存储层交互获取数据,最终返回结果。
TiDB 存储层负责存储数据,数据的存储容量没有上限,存储层上同一份数据一般有 3 个副本,满足高并发需求。协调层会对存储层中的数据做出负载均衡的处理。
TiDB 协调层负责集群的管理模块,经常干的事情有 3 个,一个是集群的元信息,一个是对存储层的数据进行调度和负载均衡,一个分配全局唯一且递增的事务 ID。
数据处理技术上,MySQL 是 B+ 树的组织存储结构,B+ 树适合读多写少,如果写多了,写的影响动作主要是插入、删除,会导致全局的平衡树下面的页频繁分裂或者合并,直接影响性能,影响读放大。TiDB 是 LSM 树的组织存储结构, 擅长写多读少,如果读多了,在内存扫描不到数据,就会去硬盘里面去寻找无序的 sst 文件,所以数据越多越大就会读放大。
TiDB 做了诸多优化,例如使用 RocksDB 作为背端存储, 优化 LSM 机制等等,协同提高数据全链条的处理性能,而且是存算分离的组织完成这个性能的。
产品方向上比较,MySQL 默认 innodb,擅长 OLTP 的业务场景,同时 MySQL 可以插件组装各式引擎,换言之 MySQL 是一个通用型的数据库产品支持所有的业务场景。而 TiDB 默认悲观事务,同样是以 OLTP 为重,同样是一个通用型的数据库产品。但是两者是不一样的,由于 MySQL 是单机型的结构,如果它要扩展,只能通过数据库中间件路由划分,如果数据满了需要停机停服,重新进行数据的割分。
TiDB 对业务无侵入性,扩展非常简单,发展至今安装与维护都非常成熟 ,通过 Tiup 就可以就可以对分布式集群进行组装维护的相关操作,并且支持在线升级,无缝迁移。
总结,TiDB 与 MySQL 没有对比性, 他们不是同一类的数据产品,但是从数据库的特性和市场方向上出发 ,他们又有了对比的维度指标。事实上,TiDB 努力向 MySQL 学习,甚至还聘请了 innodb 的内核开发工程师,努力调整 TiDB 的底盘,让 TiDB 从内向外都像 MySQL。
同类竞争产品
TiDB 是一款分布式数据库产品,以分布式为标识并能基于线下安装 ,国内同样竞比产品有 OceanBase,国外同比有 CockroachDB。TiDB 的商业经营主要集中在云数据库上,所以 PolarDB 也是 TiDB 的竞争对手。那么 TiDB 与 PolarDB、OceanBase、CockroachDB 有什么不同?
从数据库处理的流程开始讲,从任务开始到任务结束。
用户发起请求, 数据库客户端发起请求到指定的数据库集群。
目标数据库响应 指定的数据库集群指定一个节点响应用户的请求。
两者建立会话, 数据库集群其中一个节点与客户端产生会话。
对象请求解析, 数据库将接收的请求进行 语法检查,对象解析、转换对应的关系代数结构、并进行计划任务优化。
调度并且执行, 寻找最合适的副本 ,根据优先级进行,是内存、缓存、数据快照、存储等等。
监测任务状态, 观测数据库的执行中状态。
返回数据结果, 数据库服务端返回结果给数据库客户端
最关键的是第 2 步、第 4 步、第 5 步。
第 2 步是 哪一个节点响应数据库客户的请求,分布式数据库有两种系统架构,一种是中心化架构【master\slave】,一种是去中心化架构。中心化架构的负色职责分清,负责干活、负责指挥、负责接待用户,而去中心货架构则是每个节点角色平等,对待客户的请求,其中的一个节点会瞬间切换成负责接待,剩余的节点根据情况转化执行。
TiDB 在这里采用中心化的架构,节点角色之间的职责更加清晰,分工更加明确。
第 4 步和第 5 步是数据计算和数据存储的关键步骤,TiDB 在这里做了深度的松散解耦,数据计算用 TIDB,数据存储用 TIKV,两者是真正意义上的存算分离,要增加存储容量,可以增加没有 CPU 的硬盘服务器,要增加计算能力,可以增加没有硬盘的服务器。关于分布式的功能和作用则集中在一个 PD 的模块上。
OB 则是去中心架构,而且计算和存储高度耦合,所以 OB 又称为集中式的分布式架构,后面又称为单机式的分布式架构。
TiDB 比起同类产品在架构上更加高度松散耦合,与云计算技术更加紧密协作,珠联壁合。
TiDB vs MySQL
如果 TiDB 要做大做强,必须要撼动广大码农的工作使用习惯,广大码民对 MySQL 的使用已经深入人心了,不管是 TP 应用,还是 AP 应用,先不管性能,首先用 MySQL 完成业务代码的开发,这意味着 MySQL 经常被当 HTAP 数据库来用。下面我用 CH-benchmark 针对 TiDB6.0 以及 MySQL8.0 来做一个测试。
TPC-CH 由未经修改的 TPC-C 模型和事务、以及 TPC-H 查询的改编版本构成,TPC-CH 保持所有 TPC-C 实体和关系完全不变,并集成了 TPC-H 模型中的 SUPPLIER、REGION 和 NATION 表。这些表在 TPC-H 查询中频繁使用,并允许以非侵入的方式集成到 TPC-C 模型中。SUPPLIER 包含固定数量(10,000 条)的条目。因此,STOCK 中的一条记录可以通过 STOCK.S I ID × STOCK.S W ID mod 10, 000 = SUPPLIER.SU SUPPKEY 与其唯一的供应商(SUPPLIER 表中对应记录)关联起来。TPC-C 中的原始 CUSTOMER 表不包含引用自 NATION 表的外键。我们并没有改变原始模型,从而保持了与现有 TPC-C 的兼容性,所以外键是从字段 C STATE 的第一个字符开始计算的。TPC-C 规定第一个字符可以有 62 个不同的值(即大写字母、小写字母、数字),因此我们选择了 62 个国家来填充 NATION。根据 TPC-H 规范,主键 N NATIONKEY 是一个标识符。它的值被规定,从而使得与这些值相关联的 ASCII 值是一个字母或数字, 即 N NATIONKEY ∈ [48, 57]∪[65, 90]∪[97. 122]。因此,不需要额外的计算来跳过 ASCII 码中数字、大写字母和小写字母之间的间隔。不支持从字符转换到 ASCII 码的数据库系统可能会偏离 TPC-H 模式,使用单个字符作为 NATION 的主键。REGION 包含国家的五个地区。新表之间的关系使用简单的外键字段来建模:NATION.N REGIONKEY 和 SUPPLIER.SU NATIONKEY。
在 CH-Benchmark 中结合了 TPC-C 和 TPC-H 两种基准,它把原来 TPC-C 中的 9 个表和 TPC-H 中的 8 个表修改合并成了 12 个表,并将两者的伸缩模型也统一起来(Scaling TPC-H by the same factors of TPC-C)。
测试环境
硬件配置
测试配置
生成数据
我这里是通过 TiDB Bench 对数据进行压测,但是数据却是通过 CH-benchmark 去生成的。
安装 CH-benchmark
建表语句
导入数据
运行压测命令
192.168.2.x 上面安装 tiup bench
测试摘要
测试总结
保留对 MySQL8.0 和 TiDB6.0 的内部参数不变, 从 load data 数据插入、 tpmC 性能、以及 tpc-h 的性能数据表面来看,MySQL8.0 要比 TiDB6.0 要好,其实不然,TiDB 还有很多调优的空间。前面说了,毕竟他们是两个不同的产品线,但是这里证明 TiDB 的友好性,它是十分兼容 MySQL 的,如果你从单机版 TiDB 开始,随着你的业务扩大,你可以自由轻易的扩展。
我对 TiDB 的展望
软件开发的角度,TiDB 的解耦是完整的,如果 TiDB 的发展已经去到 7.0。我对 TiDB 的未来展望是三路发展,TiDB 模块源代码,可以做为分布式计算基础参考,派生更多的可能性,类似 presto 的路线延伸。TiKV 模块源代码,可以作为分布式存储参考,以后的发展方向可能是文件数据存储。PD 模块源代码的技术路径发展是轻量级的元数据存储的管理,三者兼进,帮助用户降低存储成本,提升计算弹性,通过分布式实现元数据最优存储,多姿多彩,发扬光大。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/90b59be1d7dd8f8be1c6f1266】。文章转载请联系作者。
评论