# NewSQL-TiDB 分布式数据库技术入门

# 第一章 数据库架构演变

# 第一节 什么是数据?

    数据是指对客观事件进行记录并可以鉴别的符号,是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合。它是可识别的、抽象的符号。
    它不仅指狭义上的数字,还可以是具有一定意义的文字、字母、数字符号的组合、图形、图像、视频、音频等,也是客观事物的属性、数量、位置及其相互关系的抽象表示。例如,“012...”、“阴、雨、下降、气温”、“学生的档案记录、货物的运输情况”等都是数据。数据经过加工后就成为信息。
    在计算机科学中,数据是指所有能输入计算机并被计算机程序处理的符号的介质的总称,是用于输入电子计算机进行处理,具有一定意义的数字、字母、符号和模拟量等的通称。计算机存储和处理的对象十分广泛,表示这些对象的数据也随之变得越来越复杂。
1
2
3

# 第二节 什么是数据库管理系统(DBMS)?

# 1.概述

基于不同数据的类型及重要程度,选择不同的数据库管理系统。

# 2.类型

第一代数据库架构-RDBMS:

​ 传统:Oracle、MSSQL

​ 互联网:MySQL、PG

第二代:RDBMS + NoSQL:

​ Memcached

​ Redis

​ MongoDB

​ Eelasticsearch

​ Hbase

​ Hadoop

​ Spark

第二点五代:云数据库时代+数据中台:RDS\ DRDS\ PolarDB\TDSQL

第三代:NewSQL && HTAP:Google spanner/F1 TiDB

第四代未来:Cloud-native DB:

# 3.数据库产品发展史

image-20211127134417882

# 3.1 Relational Database

A software system used to maintain relational databases is a relational database management system (RDBMS). Virtually all relational database systems use SQL (Structured Query Language) for querying and maintaining the database Relational model: This model organizes data into one or more Tables (or "relations") of Columns and Rows. Generally, each table/relation

represents one "entity type" (such as customer or product). The rows represent instances of that type of entity (such as "Lee" or "chair") and the columns representing values attributed to that instance (such as address or price)

image-20211127134704034

# 3.2 NoSQL == Not Only SQL
  • Consistency model Weak consistency

    Eventual consistency Strong consistency

  • Whafs wrong with SQL?

image-20211127134948629

image-20211127135021402

# 3.3 What's new in NewSQL?

Scalability as the fifirst-class citizen Separation of storage and computing Real HA: Multi-Paxos / Raft Full-featured SQL ACID transaction support is a must

# 3.4 NewSQL代表产品

Google Spanner / F1 CockroachDB PingcapTiDB

# 3.5 DB-Cloud-Native

image-20211127135156958

# 第三节 如何看待数据库发展趋势?

# 1.db-engines.com:全球数据库排行

image-20211127135415444

# 2.modb.pro/dbRank:国产数据库排行

image-20211127140117130

# 第二章 TiDB的介绍

# 第一节 TiDB的由来

# 1.时代机遇,数据量爆炸式增长与数据库架构现状的矛盾

​ 据IDC预测, 2020年有超过500亿的终端与设备联网, 而有50%的物 联网网络将面临网络带宽的限制, 40%的数据需要在网络边缘分析、 处 理与储存。 边缘计算市场规模将超万亿, 成为与云计算平分秋色的新兴 市场。 而在国内市场方面, 据CEDA预测, 2020年我国物联网市场规模 有望达到18300亿元, 年复合增速高达25%, 我国边缘计算发展将在接 下来的两年迎来高峰期。 ​ 到2020年,平均下来, 4人每天会产生1.5G的数据, 每辆车会产 生4TB的数据, 每架飞机会产生40TB的数据, 每个小型的工厂会产生 1 PB数据。

# 2.现有数据存储技术制约

有状态数据难以扩展, 数据孤岛。 大数据技术栈实时处理延时高, 并发处理能力弱。 实时分析时效慢, 数据服务价值低 。

# 3.用户需求

按需求水平扩展, 灵活的业务不再受制于基础架构。 高并发, 相应延时低且稳定。 实时决策。

# 4.TiDB解决方案应该考虑的事情

扩展性 强一致高可用 标准SQL与事务ACID MySQL协议 云原生 HTAP

# 5.TiDB应用场景

海量数据高并发OLTP系统 不再分库分表, 不在使用妥协的数据库中间件, 业务不再受制于基础架构 海量数据高性能Real-Time Insights & Experiences实时分析 兼容MySQL, 大数据量下比MySQL快1 2个数量级的融合OLTP和OLAP的HTAP 通过TiSPAK无缝连接SPark, 无需ETL, 提供实时大规模复杂0LAP的HTAP 多源高吞吐汇总与实时计算 多源 (数十至数百异构数据源)、高吞吐(数十万QPS) 汇聚写入 AD-Hoc准实时查询 高写入场景 金融级别多数据中心多活 故障自动恢复、 无需人工介入的真正意义的高可用 云数据库(DBaaS) 云原生支持。

# 第二节 TiDB的版本演进

https://docs.pingcap.com/zh/tidb/stable/release-notes

# 第三节 TiDB的百科

# TiDB 开源分布式关系型数据库

​ TiDB 是一款同时支持在线事务处理与在线分析处理的融合型分布式数据库产品,具备「分布式强一致性事务、在线弹性水平扩展、实时 HTAP、故障自恢复的高可用、跨数据中心多活」等企业级核心特性,帮助企业最大化发挥数据价值,充分释放企业增长空间。

# TiDB 核心特性

image.png

# 一键水平扩容或者缩容

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

# 金融级高可用

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

# 实时 HTAP

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

# 云原生的分布式数据库

​ 为云设计的分布式数据库,通过 TiDB Operator 可在公有云、私有云、混合云中实现部署工具化、自动化,依托公有云提供开箱即用的 TiDB Cloud 服务(DBaaS)。

# 兼容 MySQL 5.7 协议和 MySQL 生态

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

# TiDB 应用场景

对数据一致性及高可靠、系统高可用、可扩展性、容灾要求较高的金融行业属性的场景:金融行业对数据一致性及高可靠、系统高可用、可扩展性、容灾要求较高。传统的解决方案是同城两个机房提供服务、异地一个机房提供数据容灾能力但不提供服务,此解决方案存在以下缺点:资源利用率低、维护成本高、RTO (Recovery Time Objective) 及 RPO (Recovery Point Objective) 无法真实达到企业所期望的值。TiDB 采用多副本 + Multi-Raft 协议的方式将数据调度到不同的机房、机架、机器,当部分机器出现故障时系统可自动进行切换,确保系统的 RTO <= 30s 及 RPO = 0。

对存储容量、可扩展性、并发要求较高的海量数据及高并发的 OLTP 场景:随着业务的高速发展,数据呈现爆炸性的增长,传统的单机数据库无法满足因数据爆炸性的增长对数据库的容量要求,可行方案是采用分库分表的中间件产品或者 NewSQL 数据库替代、采用高端的存储设备等,其中性价比最大的是 NewSQL 数据库,例如:TiDB。TiDB 采用计算、存储分离的架构,可对计算、存储分别进行扩容和缩容,计算最大支持 512 节点,每个节点最大支持 1000 并发,集群容量最大支持 PB 级别。 ​ Real-time HTAP 场景:随着 5G、物联网、人工智能的高速发展,企业所生产的数据会越来越多,其规模可能达到数百 TB 甚至 PB 级别,传统的解决方案是通过 OLTP 型数据库处理在线联机交易业务,通过 ETL 工具将数据同步到 OLAP 型数据库进行数据分析,这种处理方案存在存储成本高、实时性差等多方面的问题。TiDB 在 4.0 版本中引入列存储引擎 TiFlash 结合行存储引擎 TiKV 构建真正的 HTAP 数据库,在增加少量存储成本的情况下,可以同一个系统中做联机交易处理、实时数据分析,极大地节省企业的成本。 ​ 数据汇聚、二次加工处理的场景:当前绝大部分企业的业务数据都分散在不同的系统中,没有一个统一的汇总,随着业务的发展,企业的决策层需要了解整个公司的业务状况以便及时做出决策,故需要将分散在各个系统的数据汇聚在同一个系统并进行二次加工处理生成 T+0 或 T+1 的报表。传统常见的解决方案是采用 ETL + Hadoop 来完成,但 Hadoop 体系太复杂,运维、存储成本太高无法满足用户的需求。与 Hadoop 相比,TiDB 就简单得多,业务通过 ETL 工具或者 TiDB 的同步工具将数据同步到 TiDB,在 TiDB 中可通过 SQL 直接生成报表。

# 关于 PingCAP

​ PingCAP 成立于 2015 年,是一家企业级开源分布式数据库厂商,提供包括开源分布式数据库产品、解决方案与咨询、技术支持与培训认证服务,致力于为全球行业用户提供稳定高效、安全可靠、开放兼容的新型数据基础设施,解放企业生产力,加速企业数字化转型升级。 ​ TiDB 作为通用分布式数据库,已被全球超过 1500 家企业用于线上生产环境,包括中国银行、光大银行、浦发银行、浙商银行、北京银行、微众银行、亿联银行、百信银行、中国银联、中国人寿、平安人寿、平安财险、国泰君安、华泰证券、陆金所、马上消费、拉卡拉、中国移动、中国联通、中国电信、新华财经、人民在线、吉林祥云、中体骏彩、国家电网、新奥燃气、北大人民医院、北京友谊医院、格力电器、理想汽车、小鹏汽车、VIVO、OPPO、麦当劳、百胜中国、中国邮政、顺丰速运、中通快递、腾讯、美团、京东、拼多多、小米、新浪微博、58同城、360、知乎、爱奇艺、哔哩哔哩、喜马拉雅、新东方、伴鱼、小红书、汽车之家、网易游戏、盖娅互娱、游族网络、Square(美国)、PayPay(日本)、Dailymotion(法国)、Shopee(新加坡)、ZaloPay(越南)、BookMyShow(印度)等,涉及金融、电信、政府、能源、公共事业、高端制造、高科技、新零售、物流、互联网、游戏等多个行业。

官网:https://pingcap.com/ GitHub:https://github.com/pingcap 社区版下载:https://pingcap.com/download-cn/community/

# 第三章 TiDB的如何部署

# 第一节 通过TIUP快速部署开发测试环境

# 1.适应场景

适用场景: 利用本地 Mac 或者单机 Linux 环境快速部署 TiDB 集群。 可以体验 TiDB 集群的基本架构, 以及 TiDB、 TiKV、 PD、 监控等基础 组件的运行。 适合开发测试使用。

# 2.基本结构介绍

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

# 3.使用TiUP Playground 快速部署本地测试环境

出处: https://docs.pi ngcap.com/zh/tidb/stabl e/qui ck-startwith-tidb
# 1. 下载并安装 TiUP工具
wget https://tiup-mi rrors.pingcap.com/install.sh
sh install. sh
source .bash_profile
# 2. 部署 TiDB 集群
tiup playground v5.0.1 --db 2 --pd 3
host 10.0.0.20
kv 3 monitor
—
# 3. 链接测试
mysql --host 127.0.0.1 --port 4000 -u root
通过 http://IP:9090 访问 TiDB 的 Prometheus 管理界面。
通过 http://IP:2379/dashboard 访问 TiDB Dashboard 页面, 默认用
户名为 root, 密码为空。
# 4. 销毁
通过 Ctrl + c 停掉进程
执行以下命令:
tiup clean --all
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 4.使用TiUP cluster 在单机上模拟生产环境部署步骤

实例 个数 IP 配置
TiKV 3 10.0.0.20 10.0.0.20 10.0.0.20 避免端口和目录冲突
TiDB 1 10.0.0.20 默认端口全局目录配置
PD 1 10.0.0.20 默认端口全局目录配置
TiFlash 1 10.0.0.20 默认端口全局目录配置
Monitor 1 10.0.0.20 默认端口全局目录配置
# 1. 下载并安装 TiUP工具
wget https://tiup-mi rrors.pingcap.com/install.sh
sh install. sh
source .bash_profile
# 2 . 安装 TiUP 的 cluster 组件
tiup cluster
tiup update --self && tiup update cluster
# 3. 由于模拟多机部署, 需要通过 root 用户调大 sshd 服务的连接数限制
修改 /etc/ssh/sshd_config 将 MaxSessions 调至 20。
重启 sshd 服务
# 4. 创建并启动集群
按下面的配置模板, 编辑配置文件, 命名为 topo. yaml , 其中:
"tidb": 表示通过 tidb 系统用户(部署会自动创建) 来做集群的内
部管理, 默认使用 22 端口通过 ssh 登录目标机器
replication.enable-placement-rules: 设置这个 PD 参数来确保
TiFlash 正常运行
host: 设置为本部署主机的 IP
# 5. 执行集群部署命令
tiup cluster deploy oldguo-cluster v5.0.1 ./topo.yaml
user root -p
# 6. 启动集群
tiup cluster start oldguo-cluster
# 7. 访问 TiDB 数据库, 密码为空
mysql -h 10.0.0.20 -P 4000 -u root
#8. 访问 TiDB 的 Grafana 监控
通过 http://{grafana-ip}:3000 访问集群 Grafana 监控页面, 默认用
户名和密码均为 admin。
# 9.访问 TiDB 的 Dashboard
通过 http://{pd-ip}:2379/dashboard 访问集群 TiDB Dashboard 监
控页面, 默认用户名为 root, 密码为空。
# 10. 执行以下命令确认当前己经部署的集群列表
tiup cluster list
执行以下命令查看集群的拓扑结构和状态:
tiup cluster display oldguo-cluster
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

配置模板如下:

# # Global variables used as the default value of
# # the deployments if a specific deployment value is missing.
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/data/tidb-depl oy"
  data_dir: "/data/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:
    repiication.enable-placement-rules: true
    repiication.1ocation-labels: ["host"]
  tiflash:
    logger.level: "info"

pd_servers:
 - host: 10.0.0.20
tidb_servers:
 - host: 10.0.0.20

tikv_servers:
 - host: 10.0.0.20
   port: 20160
   status_port: 20180
   config:
     server.labels: { host: "logic-host-1" }

 - host: 10.0.0.20
   port: 20161
   status_port: 20181
   config:
     server.labels: { host: "logic-host-2" }
 - host: 10.0.0.20
   port: 20162
   status_port: 20182
   config:
     server.1abels: { host: "logic-host-B" }
tiflash_servers:
 - host: 10.0.0.20
monitoring_servers:
 - host: 10.0.0.20

grafana_servers:
 - host: 10.0.0.20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

# 彩蛋-TiDB Operator 部署到自托管的K8S

# 1.K8S环境准备
# 1.1 环境规划
主机 IP 角色 配置
master 10.0.0.11 控制节点 2c4G
nodel 10.0.0.12 计算节点 2c4G
# 1.2 部署K8S基础环境

安装指定版本Docker

#所有节点
yum install -y wget
curl -o /etc/yum.repos.d/CentOS-Base.repo
http://mirrors.aliyun.com/repo/Centos-7.repo
wget -o /etc/yum.repos.d/docker-ce. repo
https://download.docker.com/1inux/centos/docker-ce.repo -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum 1ist docker-ce --showduplicates
#安装指定版本的docker
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 -y
systemctl start docker && systemctl enable docker
1
2
3
4
5
6
7
8
9
10

安装kubeadm

#所有节点
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=l
gpgcheck=l
repo_gpgcheck=l
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yumkey.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpmpackage-key.gpg
EOF
yum install kubelet-1.15.5-0 kubeadm-1.15.5-0 kubectl-1.15.5-0 -y
systemctl enable kubelet && systemctl start kubelet
1
2
3
4
5
6
7
8
9
10
11
12

使用kubeadm初始化k8s集群

#所有节点
cat «EOF > /etc/sysctl .d/k8s.conf
net.bridge.bridge-nf-cal1-ip6tables = :
net.bridge.bridge-nf-cal1-iptables = 1
EOF
sysctl system
#关闭swap
swapoff -a
vim /etc/fstab
#控制节点上运行, 注意最后的输出
kubeadm init --kubernetes-version=vl.15.5 --imagerepository registry.a1iyuncs.com/google_containers --podnetwork-cid 「=10.244.0.0/16 --service-cidr=10.254.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
1
2
3
4
5
6
7
8
9
10
11
12
13
14

给k8s集群加入node节点

#node节点上执行前面控制节点提示的加入命令
kubeadm join 10.0.0.11:6443 --token
47hq6d.uvtn5ymfah6egl 53 \
--discovery-token-ca-cert-hash
Sha256:ff283c3350b5dfa0ac8c093383416c535485ecl8d5cdd6b8227
Be0dl98157605
1
2
3
4
5
6

为k8s集群配置网络插件

wget
https://raw.githubusercontent.com/coreos/flannel/master/Do
cumentation/kube-f1annel.yml
#修改网段范围为
kubectl create -f kube-flannel.yml
kubectl get all -n kube-system
kubectl get nodes
1
2
3
4
5
6
7

image-20211127145121182

image-20211127145142887

# 2.安装storageclass
# 2.1 部署nfs
yum install nfs-utils. x86_64 -y
mkdir /data/nfs
vim /etc/exports
/data/nfs
10.0.0.0/24(rw,sync,no一root一squash,no一all一squash)
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs
systemctl enable nfs
1
2
3
4
5
6
7
8
9
# 2.2 配置nfs-storageclass
#k8s-master节点( 软件包获取私聊)
tar xf k8s_nfs.tar.gz
cd k8s
一nfs/
[root@kubernetes-master k8s
一nfs]# Is
nfs-client-class.yaml nfs-client-sa.yaml nfs-client.yaml
test-nfs.yaml
#修改配置
[root@kubernetes-master k8s
一
nfs]# vim nfs-client.yaml
e门v:
name: PROVISIONER_NAME
value: fuseim.pri/ifs
name: NFS_SERVER
value: 172.16.0.1
name: NFS_PATH
value: /html/nfs
volumes:
name: nfs-client-root
nfs:
server: 172.16.0.1
path: /html/nfs
#按顺序创建yaml
kubectl create -f nfs-client.yaml
kubectl create -f nfs-client-sa.yaml
kubectl create -f nfs-client-class.yaml
kubectl create -f test-nfs.yaml
#验证
[root@kubernetes-master k8s
一nfs]# kubectl get pv
NAME
ACCESS MODES RECLAIM POLICY STATUS CLAIM
STORAGECLASS
pvc-9b22fl42-7949-4490-9f0d-89bc5177cdb3 2Gi
Bound default/test
CAPACITY
REASON AGE
RWX
Delete
course-nfs-storage 10s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 3.安装helm
tar xf helm-vB.5.4-linux-amd64.tar.gz
mv 1inux-amd64 helm3
cd helmB/
cp helm /usr/bin/
#验证
[root@kubernetes-master k8s
一nfs]# helm version
version •Buildlnfo{version:"v3.5.4",
GitCommit:"Ib5edb69df3d3a08df77c9902dcl7af864ff05dl",
GitTreestate:"clean", Goversion:"gol.15.11"}
1
2
3
4
5
6
7
8
9
10
# 4.安装部署TiDB
#安装 TiDB operator CRDS
kubectl apply -f
https://raw ■ githubusercontent.com/pingcap/tidboperator/vl.l.12/manifests/crd.yaml
#使用helm添加 PingCAP 仓库
helm repo add pingcap https://charts.pingcap.org/
#TIDB operator 创建一个命名空间
kubectl create namespace tidb-admin
#安装 TiDB operator
helm "install --namespace tidb-admin tidb-operator
pingcap/tidb-operator —version vl.1.12
operatorlmage=registry.cn-beijing.aliyuncs.com/tidb/tidboperator:vl.1.12
tidbBackupManagerimage=registry.cnbei jing.aliyuncs.com/tidb/tidb-backup-manager:vl.1.12
--set scheduler ■ kubeschedulerimageName=registry.cnhangzhou.aliyuncs. com/google_containers/kube-scheduler
--set
--set
#查看刚才创建的pod
kubectl get pods --namespace tidb-admin -1
app.kubernetes.io/instance=tidb-operator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 5.安装TiDB 集群
#部署 TiDB 集群
kubectl create namespace tidb-cluster && \
tidb-cluster apply -f
https://raw ■ githubusercontent.com/pingcap/tidboperator/master/examples/basic-cn/tidb-cluster.yaml
#部署 TiDB 集群监控
kubectl -n
kubectl -n tidb-cluster apply -f
https://raw ■ githubusercontent.com/pingcap/tidboperator/master/examples/basic-cn/tidb-monitor.yaml
#查看pod的状态
[root@kubernetes-master ]# kubectl get pod
cluster
NAME
-n tidbREADY STATUS
RESTARTS AGE
basic-discovery-8685bbd7d5-ttk6s 1/1 Running 1
39h
basic-monitor-58bdfb79-sbhhx 3/3 Running 3
39h
basic-pd-0 1/1 Running 1
39h
basic-tidb-0 2/2 Running 2
39h
basic-tikv-0 1/1 Running 1
39h
#等所有pod都处于Runrri ng状态就可以连接ridb集群了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 6.连接TiDB测试
#转发 TiDB 服务 4000 端口
kubectl port-forward -n tidb-cluster --address=0.0.0.0
svc/basic-tidb 4000 > pf4000.out &
#这里我使用maH adb客户端测试
yum install mariadb -y
#看到下面的提示, 即成功
[root@kubernetes-master ]# mysql -h 127.0.0.1 -P 4000 -u
root
welcome to the MariaDB monitor. Commands end with ; or
\gYour MySQL connection id is 849
Server version: 5.7.25-TiDB-v5.0.1 TiDB Server (Apache
License 2.0) Community Edition, MySQL 5.7 compatible
Copyright (c) 20002018, Oracle, MariaDB Corporation Ab
and others.
Type 'help; '
current input statement.
or '\h' for help. Type '\c' to clear the
MySQL [(none)]>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 7.查看监控
kubectl port-forward -n tidb-cluster --address=0.0.0.0
svc/basic-grafana 3000 > pf3000.out &
#Grafana 面板可通过 http://10.0.0.11:3000 访问, 账号密码都是
admin
1
2
3
4
# 8.扩容
https://docs.pingcap.com/zh/tidb-inkubernetes/stable/scale-a-tidb-cluster
1

# 第四章 TiDB体系结构

# 第一节 引入MySQL的体系结构

image-20211127145606798

# 1.链接层

提供连接协议: socket TCP/IP
提供验证功能: 用户 密码 资源限制  -->>       授权表 Mysql...
提供连接线程: show processlist; 
1
2
3

# 2.SQL层

语法、 语义解析
解析预处理: 对象、 权限---> 解析树
优化器: 根据统计信息, 逻辑优化、 物理优化 ---> 执行计划
执行器: 根据优化结果, 执行SQL
1
2
3
4

# 3.Engine层

innoDB:
on-disk : 表空间、 索引、 数据页、 WAL日志
in-Mem
事务: ACID 、 隔离级别、 MVCC 、 锁...
IBP ILB
CR : redo uudo DWB
1
2
3
4
5
6

# 第二节 TiDB体系结构

# TiDB整体架构图

image-20211127151854574

# TiDB + Kebernetes

image-20211127151933209

# 第三节 分层结构

image-20211127152011488

# TiDB的存储层-TiKV 及Region

image-20211127152058811

image-20211127152317113

使用 Range 分片 Region 1 -> [a - d) Region 2 -> [d - h) Region n -> [w - z] 数据的存储/访问/复制/调度都是以 Region 为单位

# TiDB的管理及调度-PD

image-20211127152430533

# TiDB 链接层和SQL层-TiDB Server

image-20211127153247697

# SQL 处理流程简化

image-20211127153311056

# SQL优化器设计-计算下推

image-20211127153329311

# SQL优化器设计-并行计算

image-20211127153350289

# 第五章 TiDB SQL应用及日常维护

95%兼容MySQL语法。

# 1.用户及权限管理

create user
alter user
drop user
alter
权限系统表
这些系统表里面包含了用户账户以及相应的授权信息:
user 用户账户, 全局权限, 以及其它一些非权限的列db 数据库级别的权限
tables_priv 表级的权限
columns_priv 列级的权限
1
2
3
4
5
6
7
8
9

# 2.表与系统视图

GLOBAL_VARIABLES 全局系统变量表
tidb 用于 TiDB 在 bootstrap 的时候记录相关版本信息
1
2

# 3.链接查询

show processlist
与MySQL 的 show processlist 显示内容基本一样, 不会显示系统进程号,
而 ID 表示当前的
可以 kill DML 语句:
show processlist , 找到对应 session id
kill tidb [session id]。
session ID。
admin show ddl jobs
可以 kill DDL 语句, 首先使用 admin show ddl jobs, 查找需要 kill
的 DDL job ID
然后执行 admin cancel ddl jobs ' job_id' [ , ' job_id' ] ... o
1
2
3
4
5
6
7
8
9
10
11

# 4.DCL

START TRANSACTION丨Begin
COMMIT
ROLLBACK
TiDB 只支持
单条 KV entry 不超过 6MB, KV entry的总条数不超过 30w, KV entry
的总大小不超过100MB.
1
2
3
4
5
6

# 5.DML

Select
insert
Delete
update
1
2
3
4

# 6.支持的DDL

CREATE DATABASE
DROP DATABASE
CREATE TABLE
DROP TABLE
TRUNCATE TABLE
RENAME TABLE
ALTER TABLE
CREATE INDEX
DROP INDEX
1
2
3
4
5
6
7
8
9

# 7.不支持的语句

存储过程与函数
视图
触发器
事件
自定义函数
外键约束
全文函数与索引
空间函数与索引
非 utf8 字符集
BINARY 之外的排序规则增加主键
删除主键
1
2
3
4
5
6
7
8
9
10
11

# 8.其它限制

TiDB 仅支持 utf8(mb4) 字 符 集
TiDB 的存储引擎为 TiKV, 表中显示的 innodb 是兼容性显示使用分区表
单表最多支持512个列
支持的数据类型:
数值类型
字符串类型
日期和时间类型字符串类型
JSON类型
枚举类型
集合类型
1
2
3
4
5
6
7
8
9
10

# 9.常见表管理命令

show tables
analyze table :更新TiDB 在表和索引上留下的统计信息
admin show ddl
admin show ddl jobs
1
2
3
4

# 10.索引的管理

CREATE INDEX person_num ON person (number);/alter  ... add index
CREATE UNIQUE INDEX person一num ON person (number) ;/alter ... add index
DROP INDEX person_num ON person;/alter   ... drop index_name
SHOW INDEX from person;
1
2
3
4

# 11.表、索引健康度及统计信息

统计信息的收集:
	手工收集:
Analyze table
	自动更新(mysql .GLOBAL_VARIABLES 中的系统变量):
tidb_auto_analyze_ratio
tidb_auto_analyze_start_time
tidb_auto_analyze_end_time
1
2
3
4
5
6
7

# 12.TiDB Cluster 日志

TiDB 系统日志
TiKV 系统日志
PD 系统日志
Slow log 日志
Slow log 分析视图及工具
admin show slow top N
INFORMATION_SCHEMA.SLOW_QUERY
pt-query-digest
mysql dumpslow
1
2
3
4
5
6
7
8
9

# 第六章 TiDB的备份恢复

br backup full -s local:///tmp/backup --pd "S{PDIP}:2379"
--log-file backup.log
br restore full -s local:///tmp/backup --pd "${PDIP}:2379"
--log-file restore.log
1
2
3
4

# 第七章 binlog工具的应用

image-20211127154823553

https://download.pingcap.org/tidb-1atest-1inuxamd64.tar.gz
printf > pd.toml %s\\n 'log-file="pd.log"' ' datadir="pd.data"' &&
printf > tikv.toml %s\\n '1og-fi1e="tikv.1og
' data-dir="tikv.data"' 1[pd] ' ' endpoints=
["127.0.0.1:2379"]' '[rocksdb] ' max-open-fi1es=1024
' [raftdb] ' max-open-files=1024 &&
printf > pump.toml %s\\n '1og-fi1e="pump.log'" ' datadir="pump.data" ' ' addr="127.0.0.1:8250" ' ' advertiseaddr=,,127 _ 0.0.1: 8250," 'pd-urls="http://127.0.0.1:2379"'
' [storage]
&&
printf > tidb.toml %s\\n ' store="tikv"'
'path="127.0.0.1:2379'" ' [log.file] ' •filename="ridb.log"
' [binlog] ' ' enable=true' &&
printf > drainer.toml %s\\n 'log-file="drainer.1og"'
' [syncer] ' ' db-type="mysql"' ' [syncer ■ to]’
,host=,,127.0.0.1'" ,user=,,rootM, 'password^""' ' port=3306

for f in *.toml ; do echo "$f:"; cat "$f"; echo; done
drainer.toml:
1og-file="drainer.log"
[syncer]
db-type="mysql "
[syncer.to]
host=M127.0.0.1"
user="root"
password:” "
port=3306

pd.toml:
log-file="pd.log"
data-dir="pd.data"

pump.toml:
1og-file="pump.log"
data-dir="pump.data"
add="127.0.0.1:8250"
advertise-addr="127.0.0.1:8250"
pd-urls=Mhttp://127.0.0.1:2379"

tidb.toml:
store="tikv"
path="127.0.0.1:2379"
[log.file]
filename="tidb.log"
[binlog]
enable=true

tikv.toml:
1og-file="tikv.log"
[storage]
data-dir="tikv.data"
[pd]
endpoints=["127.0.0.1:2379"]
[rocksdb]
max-open-fi1es=1024
[raftdb]
max-open-fi1es=1024

./bin/pd-server --config=pd.toml &>pd.out &
./bin/tikv-server --config=tikv.toml &>tikv.out &
./bin/pump --config=pump.toml &>pump.out &
sleep 3 &&
./bin/tidb-server --config=tidb.toml &>tidb.out &

jobs

mysql -h 127.0.0.1 -P 4000 -u root -e ' select
tidb_version(); '

./bin/drainer --config=drainer.toml &>drainer.out &

mysql -h 127.0.0.1 -P 4000 --prompt='TiDB [\d]> ' -u root
mysql -h 127.0.0.1 -P 3306 -u root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72