TiDB4 初探

1、TiDB介绍

TiDB是一款开源的分布式数据库,底层为Key-Value数据库RocksDB,代码主要是用golang。支持事务,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。
对使用MySQL的使用者而言,比较看重其对MySQL兼容性,总不能迁移过程费劲、迁移后更费劲吧,还有就是一直困扰已久的水平扩展问题,另外TiDB还具备多副本的容灾机制,不需要像MyCat一样,在每个主库后面还需要挂在从库。

TiDB 整体架构
TiDB4 初探_第1张图片
与传统的单机数据库相比,TiDB 具有以下优势:

  • 纯分布式架构,拥有良好的扩展性,支持弹性的扩缩容
  • 支持 SQL,对外暴露 MySQL 的网络协议,并兼容大多数 MySQL 的语法,在大多数场景下可以直接替换 MySQL
  • 默认支持高可用,在少数副本失效的情况下,数据库本身能够自动进行数据修复和故障转移,对业务透明
  • 支持 ACID 事务,对于一些有强一致需求的场景友好,例如:银行转账
  • 具有丰富的工具链生态,覆盖数据迁移、同步、备份等多种场景

TiDB主要包含TiDB Server、PD Server以及数据存储节点,存储节点又分为TIKV Server 和 TiFlash。
TiDB Server:SQL 层,对外暴露 MySQL 协议的连接 endpoint,负责接受客户端的连接,执行 SQL 解析和优化,最终生成分布式执行计划。TiDB 层本身是无状态的,实践中可以启动多个 TiDB 实例,通过负载均衡组件(如 LVS、HAProxy 或 F5)对外提供统一的接入地址,客户端的连接可以均匀地分摊在多个 TiDB 实例上以达到负载均衡的效果。TiDB Server 本身并不存储数据,只是解析 SQL,将实际的数据读取请求转发给底层的存储节点 TiKV(或 TiFlash)。

**PD Server:**整个 TiDB 集群的元信息管理模块,负责存储每个 TiKV 节点实时的数据分布情况和集群的整体拓扑结构,提供 Dashboard 管控界面,并为分布式事务分配事务 ID。PD 不仅存储元信息,同时还会根据 TiKV 节点实时上报的数据分布状态,下发数据调度命令给具体的 TiKV 节点,可以说是整个集群的“大脑”。此外,PD 本身也是由至少 3 个节点构成,拥有高可用的能力。建议部署奇数个 PD 节点。

存储节点

**TiKV Server:**负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range(从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region。TiKV 的 API 在 KV 键值对层面提供对分布式事务的原生支持,默认提供了 SI (Snapshot Isolation) 的隔离级别,这也是 TiDB 在 SQL 层面支持分布式事务的核心。TiDB 的 SQL 层做完 SQL 解析后,会将 SQL 的执行计划转换为对 TiKV API 的实际调用。所以,数据都存储在 TiKV 中。另外,TiKV 中的数据都会自动维护多副本(默认为三副本),天然支持高可用和自动故障转移。
TiFlash:TiFlash 是一类特殊的存储节点。和普通 TiKV 节点不一样的是,在 TiFlash 内部,数据是以列式的形式进行存储,主要的功能是为分析型的场景加速。

2、安装

官网介绍了几种测试环境中安装的方法(不能在生产环境中如此安装),反正只是玩玩(按照生产环境的模式,至少6台机器),肯定是怎么简单怎么来了,这里我选择了第二种,比较接近生产环境的架构。
TiDB4 初探_第2张图片

2.1 准备环境

准备一台部署主机,确保其软件满足需求:

  • 推荐安装 CentOS 7.3 及以上版本

  • Linux 操作系统开放外网访问,用于下载 TiDB 及相关软件安装包

如果是虚拟机,内存尽可能大一些(最好4G或以上),因为TiDB每个模块都会有各自单独的进程,另外还包括了监控模块,虚拟机上最好不要安装其他软件,如k8s(两者都用到的etcd,可能会冲突导致安装失败)
1、下载并安装TiUP

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

2、安装 TiUP 的 cluster 组件:

tiup cluster

3、如果机器已经安装 TiUP cluster,需要更新软件版本:

tiup update --self && tiup update cluster

4、由于模拟多机部署,需要通过 root 用户调大 sshd 服务的连接数限制:

在这里插入代码片修改 /etc/ssh/sshd_config 将 MaxSessions 调至 20。
重启 sshd 服务:
service sshd restart

5、创建并启动集群
首先创建一个集群模板,命名为 topo.yaml,其中的host都修改成当前服务器的IP,目录程序会自动创建

# # Global variables are applied to all deployments and used as the default value of
# # the deployments if a specific deployment value is missing.
global:
 user: "tidb"
 ssh_port: 22
 deploy_dir: "/tidb-deploy"
 data_dir: "/tidb-data"
 
# # Monitored variables are applied to all the machines.
monitored:
 node_exporter_port: 9100
 blackbox_exporter_port: 9115
 
server_configs:
 tidb:
   log.slow-threshold: 300
 tikv:
   readpool.storage.use-unified-pool: false
   readpool.coprocessor.use-unified-pool: true
 pd:
   replication.enable-placement-rules: true
 tiflash:
   logger.level: "info"
 
pd_servers:
 - host: 10.0.1.1
 
tidb_servers:
 - host: 10.0.1.1
 
tikv_servers:
 - host: 10.0.1.1
   port: 20160
   status_port: 20180
 
 - host: 10.0.1.1
   port: 20161
   status_port: 20181
 
 - host: 10.0.1.1
   port: 20162
   status_port: 20182
 
tiflash_servers:
 - host: 10.0.1.1
 
monitoring_servers:
 - host: 10.0.1.1
 
grafana_servers:
 - host: 10.0.1.1

创建集群

tiup cluster deploy <cluster-name> <tidb-version> ./topo.yaml --user root -p
  • 参数 cluster-name 表示设置集群名称
  • 参数 tidb-version 表示设置集群版本,可以通过 tiup list tidb 命令来查看当前支持部署的 TiDB 版本
Do you want to continue? [y/N]:  y
Input SSH password:

6、管理集群
启动集群

tiup cluster start <cluster-name>

访问集群

# mysql -h 127.0.0.1 -P 4000 -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 96
Server version: 5.7.25-TiDB-v4.0.1 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| INFORMATION_SCHEMA |
| METRICS_SCHEMA     |
| PERFORMANCE_SCHEMA |
| mysql              |
| test               |
| test2              |
+--------------------+
6 rows in set (0.00 sec)

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| students       |
+----------------+
1 row in set (0.00 sec)

mysql> show create table students;
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                                                                  |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| students | CREATE TABLE `students` (
  `student_id` int(11) NOT NULL AUTO_INCREMENT,
  `student_name` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`student_id`),
  KEY `idx_student_name` (`student_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=90002 |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> insert into students values(60002,'JACK');
Query OK, 1 row affected (0.01 sec)

3、小结

TiDB对大部分MySQL的语法还是兼容的,不仅仅是普通的DDL、DML,TiDB中的数据可以直接通过mysqldump导出为SQL文件,并在MySQL中导入,同样MySQL导出的文件也可以直接在TiDB中导入,关于MySQL迁移到TiDB,TIDB也有自己的一套工具,相对来讲还是比较齐全的。

你可能感兴趣的:(数据库)