暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

新年新气象,学学TiDB(一)

程序员达叔 2020-01-01
417

TiDB 是 PingCAP 公司设计的开源分布式 HTAP (Hybrid Transactional and Analytical Processing) 数据库,结合了传统的 RDBMS 和 NoSQL 的最佳特性。TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性。TiDB 的目标是为 OLTP (Online Transactional Processing) 和 OLAP (Online Analytical Processing) 场景提供一站式的解决方案。


一、TiDB 具备如下特性:

  • 高度兼容 MySQL

    大多数情况下,无需修改代码即可从 MySQL 轻松迁移至 TiDB,分库分表后的 MySQL 集群亦可通过 TiDB 工具进行实时迁移。

  • 水平弹性扩展

    通过简单地增加新节点即可实现 TiDB 的水平扩展,按需扩展吞吐或存储,轻松应对高并发、海量数据场景。

  • 分布式事务

    TiDB 100% 支持标准的 ACID 事务。

  • 真正金融级高可用

    相比于传统主从 (M-S) 复制方案,基于 Raft 的多数派选举协议可以提供金融级的 100% 数据强一致性保证,且在不丢失大多数副本的前提下,可以实现故障的自动恢复 (auto-failover),无需人工介入。

  • 一站式 HTAP 解决方案

    TiDB 作为典型的 OLTP 行存数据库,同时兼具强大的 OLAP 性能,配合 TiSpark,可提供一站式 HTAP 解决方案,一份存储同时处理 OLTP & OLAP,无需传统繁琐的 ETL 过程。

  • 云原生 SQL 数据库

    TiDB 是为云而设计的数据库,支持公有云、私有云和混合云,配合 TiDB Operator 项目 可实现自动化运维,使部署、配置和维护变得十分简单。

TiDB 的设计目标是 100% 的 OLTP 场景和 80% 的 OLAP 场景,更复杂的 OLAP 分析可以通过 TiSpark 项目来完成。

TiDB 对业务没有任何侵入性,能优雅的替换传统的数据库中间件、数据库分库分表等 Sharding 方案。同时它也让开发运维人员不用关注数据库 Scale 的细节问题,专注于业务开发,极大的提升研发的生产力。


看到这里,肯定有同学跃跃欲试,想把mysql换成Tidb了,别急,一定要先充分了解好两者之间的差异↓


二、与MySQL兼容性对比:

TiDB 支持 MySQL 传输协议及其绝大多数的语法。这意味着您现有的 MySQL 连接器和客户端都可以继续使用。大多数情况下您现有的应用都可以迁移至 TiDB,无需任何代码修改。

当前 TiDB 服务器官方支持的版本为 MySQL 5.7。大部分 MySQL 运维工具(如 PHPMyAdmin, Navicat, MySQL Workbench 等),以及备份恢复工具(如 mysqldump, Mydumper/myloader)等都可以直接使用。

不过一些特性由于在分布式环境下没法很好的实现,目前暂时不支持或者是表现与 MySQL 有差异。一些 MySQL 语法在 TiDB 中可以解析通过,但是不会做任何后续的处理,例如 Create Table
 语句中 Engine
,是解析并忽略。


三、不支持的特性

  • 存储过程与函数

  • 触发器

  • 事件

  • 自定义函数

  • 外键约束

  • 全文函数与索引

  • 空间函数与索引

  • 非 ascii
    /latin1
    /binary
    /utf8
    /utf8mb4
     的字符集

  • BINARY
     之外的排序规则

  • 增加主键

  • 删除主键

  • SYS schema

  • MySQL 追踪优化器

  • XML 函数

  • X Protocol

  • Savepoints

  • 列级权限

  • CREATE TABLE tblName AS SELECT stmt
     语法

  • CREATE TEMPORARY TABLE
     语法

  • XA
     语法(TiDB 内部使用两阶段提交,但并没有通过 SQL 接口公开)

  • CHECK TABLE
     语法

  • CHECKSUM TABLE
     语法


四、与MySQL有差异的特性

自增 ID

TiDB 中,自增列只保证自增且唯一,并不保证连续分配。TiDB 目前采用批量分配 ID 的方式,所以如果在多台 TiDB 上同时插入数据,分配的自增 ID 会不连续。

在集群中有多个 tidb-server 实例时,如果表结构中有自增 ID,建议不要混用缺省值和自定义值,否则在如下情况下会遇到问题。

假设有这样一个带有自增 ID 的表:

create table t(id int unique key auto_increment, c int);


TiDB 实现自增 ID 的原理是每个 tidb-server 实例缓存一段 ID 值用于分配(目前会缓存 30000 个 ID),用完这段值再去取下一段。

假设集群中有两个 tidb-server 实例 A 和 B(A 缓存 [1,30000] 的自增 ID,B 缓存 [30001,60000] 的自增 ID),依次执行如下操作:

  1. 客户端向 B 插入一条将 id
     设置为 1 的语句 insert into t values (1, 1)
    ,并执行成功。

  2. 客户端向 A 发送 Insert 语句 insert into t (c) (1)
    ,这条语句中没有指定 id
     的值,所以会由 A 分配,当前 A 缓存了 [1, 30000] 这段 ID,所以会分配 1 为自增 ID 的值,并把本地计数器加 1。而此时数据库中已经存在 id
     为 1 的数据,最终返回 Duplicated Error
     错误。

另外,从 TiDB 3.0.4 版本开始,TiDB 将通过系统变量 @@tidb_allow_remove_auto_inc
 控制是否允许通过 alter table modify
 或 alter table change
 来移除列的 auto_increment
 属性,默认是不允许移除。

时区

MySQL 默认使用本地时区,依赖于系统内置的当前的时区规则(例如什么时候开始夏令时等)进行计算;且在未导入时区表数据的情况下不能通过时区名称来指定时区。

TiDB 不需要导入时区表数据也能使用所有时区名称,采用系统当前安装的所有时区规则进行计算(一般为 tzdata
 包),且无法通过导入时区表数据的形式修改计算规则。


由于篇幅限制,这里仅列出部分主要差异特性,完整版请到pingcap官网查看。


下一篇,我们将开始走进科学,看看TiDB的实现原理,敬请期待~

文章转载自程序员达叔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论