当前位置: 代码迷 >> 综合 >> 学而时习之数据结构篇: TiDB NewSQL数据库到底 New 在哪里?
  详细解决方案

学而时习之数据结构篇: TiDB NewSQL数据库到底 New 在哪里?

热度:46   发布时间:2023-12-02 12:52:32.0

新版任你发, 我用 MySQL 8

周日烈日当空, 张大胖静静看着TiDB文档, 嘴中喃喃自语道: 从我刚毕业工作的时候就用MySQL 5, 遇到小型业务场景就单机搞定, 遇到中型业务就主从节点分离, 遇到大型业务就引入分布式事务并且使用水平扩容方式分库分表,
现在我用 MySQL8, 再加上上面的方式感觉能应付大多数业务场景, 我为什么要去学NewSQL TiDB ? 它能给我带来什么? 能让我早点下班吗?

2018年4月19日 MySQL 发布 8.0.11 (General Availability) , 延续并完善了 5.7 时 SQL + NoSQL 的技术路线,原来 NoSQL 也可以是 SQL。

Mysql 8.0 详细版本更新

在这里插入图片描述

MySQL 官方宣布, MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在这些方面带来了更好的性能:读/写工作负载、IO 密集型工作负载、以及高竞争(”hot spot”热点竞争问题)工作负载。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIiBV8FR-1630234225500)(http://showdoc-home-sample.com:4399/server/index.php?s=/api/attachment/visitFile/sign/4892e1def7497268f6e0342df3efccc2)]

万丈高楼平地起, 辉煌只能靠自己,这一切的改变并没有让 MySQL 脱离时代的局限性, 它依然不是分布式数据库, 不支持原生分布式事务, 不能水平扩展。更和时髦的 NewSQL 概念扯不上关系, 称得上是名副其实的 OldSQL。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qFtU77sY-1630234225505)(http://showdoc-home-sample.com:4399/server/index.php?s=/api/attachment/visitFile/sign/c871c965f2f0c98a21f3040e5e02b6b7)]

TiDB 快速上手

想快速上手大致分三个步骤:

  • 部署 TiDB 数据库
  • 部署依赖 MySQL 的业务项目以及执行相关初始化SQL
  • 执行该项目的测试用例

部署 TiDB 数据库

以下示例基于 Mac 环境

TiDB 是一个分布式系统。最基础的 TiDB 测试集群通常由 2 个 TiDB 实例、3 个 TiKV 实例、3 个 PD 实例和可选的 TiFlash 实例构成。通过 TiUP Playground,可以快速搭建出上述的一套基础测试集群,步骤如下:

1.下载并安装 TiUP。

curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh

  1. 声明全局环境变量。
    1. TiUP 安装完成后会提示对应 profile 文件的绝对路径。在执行以下 source 命令前,需要根据 profile 文件的实际位置修改命令。

source .bash_profile

  1. 在当前 session 执行以下命令启动集群。
    1. 接执行 tiup playground 命令会运行最新版本的 TiDB 集群,其中 TiDB、TiKV、PD 和 TiFlash 实例各 1 个:

tiup playground

  1. 使用任意MySQL图形化工具连接
    1. jdbc:mysql://127.0.0.1:4000
    2. 用户名 root , 密码为空

详细步骤请参考官方文档

部署依赖 MySQL 的业务项目以及执行相关初始化SQL

如果你有现成测试用例充足且基于MySQL的项目,建议跳过这一步,没有的话我推荐个基于SpringBoot的模版项目 cdk8s/sculptor-boot-backend

1.先用 git clone 到本地

https://github.com/cdk8s/sculptor-boot-backend.git

2.设置本机 hosts 文件的域名映射, 推荐使用 SwitchHosts! 管理

除了 sso, redis, mysql, sculptor, websocket 其他都是冗余的, 与本次演示无关。

127.0.0.1 sso.cdk8s.com
127.0.0.1 redis.cdk8s.com
127.0.0.1 mysql.cdk8s.com
127.0.0.1 postgresql.cdk8s.com
127.0.0.1 sculptor.cdk8s.com
127.0.0.1 xxl.cdk8s.com
127.0.0.1 websocket.cdk8s.com
127.0.0.1 elasticsearch.cdk8s.com
127.0.0.1 mongodb.cdk8s.com
127.0.0.1 rabbitmq.cdk8s.com
  1. 执行项目中的初始化 SQL

执行下列目录中的所有SQL, 注意先执行 schema 前缀的DDL,再执行 data 前缀的初始化SQL
sculptor-boot-biz/src/main/resources/h2db/*.sql

  1. 请摁下去启动项目的念头, 看下一步

执行该项目的测试用例

  1. 修改 cdk8s/sculptor-boot-backend 单元测试配置项
  • sculptor-boot-biz/src/test/resources
    • application.yml
      • 修改 active: ‘junitmysql’
    • application-junitmysql.yml
      • 修改 mysql/redis 的连接配置
  1. 执行所有 controller 测试用例

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o4P3w18r-1630234225516)(http://showdoc-home-sample.com:4399/server/index.php?s=/api/attachment/visitFile/sign/75f504d319bcb9bcae7f78f12c5e1968)]

可以看到除了几个业务自定义异常外(为了避免脏数据,特地设计的), 大部分数据库操作是成功的!

  1. 执行完测试用例, 就大功告成!

TiDB 官宣

TiDB 是 PingCAP 公司自主设计、研发的 开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。目标是为用户提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解决方案。TiDB 适合高可用、强一致要求较高、数据规模较大等各种应用场景。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Otyi5jNx-1630234225519)(http://showdoc-home-sample.com:4399/server/index.php?s=/api/attachment/visitFile/sign/8b431ab4dbff84e9d3dabd1d993cd746)]

五大核心特性

  • 一键水平扩容或者缩容

    得益于 TiDB 存储计算分离的架构的设计,可按需对计算、存储分别进行在线扩容或者缩容,扩容或者缩容过程中对应用运维人员透明。

  • 金融级高可用

    数据采用多副本存储,数据副本通过 Multi-Raft 协议同步事务日志,多数派写入成功事务才能提交,确保数据强一致性且少数副本发生故障时不影响数据的可用性。可按需配置副本地理位置、副本数量等策略满足不同容灾级别的要求。

  • 实时 HTAP

    提供行存储引擎 TiKV、列存储引擎 TiFlash 两款存储引擎,TiFlash 通过 Multi-Raft Learner 协议实时从 TiKV 复制数据,确保行存储引擎 TiKV 和列存储引擎 TiFlash 之间的数据强一致。TiKV、TiFlash 可按需部署在不同的机器,解决 HTAP 资源隔离的问题。

  • 云原生的分布式数据库

    专为云而设计的分布式数据库,通过 TiDB Operator 可在公有云、私有云、混合云中实现部署工具化、自动化。

  • 兼容 MySQL 5.7 协议和 MySQL 生态

    兼容 MySQL 5.7 协议、MySQL 常用的功能、MySQL 生态,应用无需或者修改少量代码即可从 MySQL 迁移到 TiDB。提供丰富的数据迁移工具帮助应用便捷完成数据迁移。

TiDB 相比 MySql 差异在哪 ?

TiDB 作为开源 NewSQL 数据库的典型代表之一,同样支持 SQL,支持事务 ACID 特性。在通讯协议上,TiDB 选择与 MySQL 完全兼容,
并尽可能兼容 MySQL 的语法。
因此,基于 MySQL 数据库开发的系统,大多数可以平滑迁移至 TiDB,而几乎不用修改代码。对用户来说,迁移成本极低,过渡自然。
然而,仍有一些 MySQL 的特性和行为,TiDB 目前暂时不支持或表现与 MySQL 有差异。除此之外,TiDB 提供了一些扩展语法和功能,为用户提供更多的便利。
TiDB 仍处在快速发展的道路上,对 MySQL 功能和行为的支持方面,正按 路线图 的规划在前行。

在这里插入图片描述

区别点详述及应对方案

(1) 字符集支持

TiDB 目前支持以下字符集:

tidb> SHOW CHARACTER SET;
+---------|---------------|-------------------|--------+
| Charset | Description   | Default collation | Maxlen |
+---------|---------------|-------------------|--------+
| utf8    | UTF-8 Unicode | utf8_bin          |      3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_bin       |      4 |
| ascii   | US ASCII      | ascii_bin         |      1 |
| latin1  | Latin1        | latin1_bin        |      1 |
| binary  | binary        | binary            |      1 |
+---------|---------------|-------------------|--------+
5 rows in set (0.00 sec)

注意:TiDB 的默认字符集为 utf8mb4,MySQL 5.7 中为 latin1,MySQL 8.0 中修改为 utf8mb4。
当指定的字符集为 utf8 或 utf8mb4 时,TiDB 仅支持合法的 UTF8 字符。对于不合法的字符,会报错:incorrect utf8 value,
该字符合法性检查与 MySQL 8.0 一致。对于 MySQL 5.7 及以下版本,会存在允许插入非法 UTF8 字符,但同步到 TiDB 报错的情况。
此时,可以通过 TiDB 配置 “tidb_skip_utf8_check” 跳过 UTF8 字符合法性检查强制写入 TiDB。

(2) 系统时区

在 MySQL 中,系统时区 system_time_zone 在 MySQL 服务启动时通过 环境变量 TZ 或命令行参数 --timezone 指定。

对于 TiDB 而言,作为一个分布式数据库,TiDB 需要保证整个集群的系统时区始终一致。因此 TiDB 的系统时区在集群初始化时,
由负责初始化的 TiDB 节点环境变量 TZ 决定。集群初始化后,固定在集群状态表 mysql.tidb 中:

tidb> select VARIABLE_VALUE from mysql.tidb where VARIABLE_NAME='system_tz';
+----------------+
| VARIABLE_VALUE |
+----------------+
| Asia/Shanghai  |
+----------------+
1 row in set (0.00 sec)

Tip

看来 TiDB 在兼容性上是很有优势的, 适合已经成型的互联网业务从MySQL 迁移到 TiDB, 或者对稳定性, 可用性要求比较高的金融业务。张大胖会用MySQL 肯定学TiDB 也是很容易的, 但是有没有这个业务场景用, 花不花的起运维费用, 这得另算了, 总之多学点没坏处 !

用官方的一句话结尾, TiDB 是一款定位于在线事务处理/在线分析处理的融合型数据库产品,实现了一键水平伸缩,强一致性的多副本数据安全,分布式事务,实时 OLAP 等重要特性。同时兼容 MySQL 协议和生态,迁移便捷,运维成本极低。

  相关解决方案