目录
一、概述
数据库(DataBase)是按照数据结构来组织、存储和管理数据的仓库。
我们的程序都是在内存中运行的,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失。所以我们就需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。而数据库就是数据持久化的最佳选择。说白了,数据库就是存储数据的仓库。
数据库的技术的研究和发展:
1、关系型数据库(RDBMS):MySQL、Oracle、DB2、SQL Server......关系数据库中全都是表
2、非关系型数据库(NoSQL):
1、键值存储数据库:Redis
2、列式存储数据库:HBase
3、文档型数据库:MongoDB
4、图形数据库:Neo4J
3、NewSQL:这类数据库不仅具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID和SQL等特性:TiDB。
1、从MySQL到TiDB
场景引入:假设现在有一个高速发展的互联网公司,核心业务库MySQL的数据量已经近亿行,且还在不断增长中,公司对于数据资产较为重视,所有数据要求多副本保存至少5年,且除了有对历史数据进行统计分析的离线报表业务外,还有一些针对用户数据实时查询的需求,如用户历史订单实时查询。
1.MySQL能否满足上述场景需求?
根据以往的MySQL使用经验,MySQL单表在5000万行以内时,性能较好,单表超过5000万行后,数据库性能、可维护性都会极剧下降。当然这时候可以做MySQL分库分表,如使用Mycat或Sharding-jdbc。
2.分库分表的能否解决问题?
分库分表优点非常明显,如:
将大表拆分成小表,单表数据量控制在5000万行以内,使MySQL性能稳定可控。
将单张大表拆分成小表后,能水平扩展,通过部署到多台服务器,提升整个集群的QPS、TPS、Latency等数据库服务指标。
但是,此方案的缺点也非常明显:
分表跨实例后,产生分布式事务管理难题,一旦数据库服务器宕机,有事务不一致风险。
分表后,对SQL语句有一定限制,对业务方功能需求大打折扣。尤其对于实时报表统计类需求,限制非常之大。事实上,报表大多都是提供给高层领导使用的,其重要性不言而喻。
分表后,需要维护的对象呈指数增长(MySQL实例数、需要执行的SQL变更数量等)
3.问题解决
基于以上核心痛点,我们需要探索新的数据库技术方案来应对业务爆发式增长所带来的挑战,为业务提供更好的数据库服务支撑。
调研市场上的各大数据库,我们可以考虑选用NewSQL技术来解决,因为NewSQL技术有如下显著特点:
1、无限水平扩展能力
2、分布式强一致性,确保数据100%安全
3、完整的分布式事务处理能力与ACID特性
而TiDB数据库 GitHub的活跃度及社区贡献者方面都可以算的上是国际的开源项目,是NewSQL技术中的代表性产品,所以我们可以选择使用TiDB数据库!
2、简介
NewSQL领域的代表是Google的spanner和F1,其号称可以实现全球数据中心容灾,且完全满足分布式事务的ACID,但是只能在Google云上使用。
TiDB诞生在大背景下,也弥补了国内在NewSQL领域中的空缺。TiDB自2015年5月写下第一行代码以来,至今已发布大小版本几十次,版本迭代十分迅速。
TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性,支持在本地和云上部署。
1、OLTP和OLAP
OLTP:在线事务处理
强调支持短时间内大量并发的事务操作(增删改查)能力,每个操作涉及的数据量都很小(比如几十到几百字节)
强调事务的强一致性(例如:银行转账交易,容不得差错)
例:“双十一”期间,可能有几十万用户在同一秒内下订单。后台数据库要能够并发的、以近乎实时的速度处理这些订单请求(如果下了订单,十几秒还没有反应,用户肯定要骂人了)
OLAP:在线分析处理
偏向于复杂的只读查询,读取海量数据进行分析计算,查询时间往往很长
例:“双十一”结束,淘宝的运营人员对订单进行分析挖掘,找出一些市场规律等等。
这种分析可能需要读取所有的历史订单进行计算,耗时几十秒甚至几十分钟都有可能
3、TiDB整体架构
TiDB 分布式数据库将整体架构拆分成了多个模块,各模块之间互相通信,组成完整的 TiDB 系统。对应的架构图如下:
TiDB Server:SQL 层,对外暴露 MySQL 协议的连接 endpoint,负责接受客户端的连接,执行 SQL 解析和优化,最终生成分布式执行计划。TiDB 层本身是无状态的,实践中可以启动多个 TiDB 实例,通过负载均衡组件(如 LVS、HAProxy 或 F5)对外提供统一的接入地址,客户端的连接可以均匀地分摊在多个 TiDB 实例上以达到负载均衡的效果。TiDB Server 本身并不存储数据,只是解析 SQL,将实际的数据读取请求转发给底层的存储节点 TiKV(或 TiFlash)。
PD (Placement Driver) Server:整个 TiDB 集群的元信息管理模块,负责存储每个 TiKV 节点实时的数据分布情况和集群的整体拓扑结构,提供 TiDB Dashboard 管控界面,并为分布式事务分配事务 ID。PD 不仅存储元信息,同时还会根据 TiKV 节点实时上报的数据分布状态,下发数据调度命令给具体的 TiKV 节点,可以说是整个集群的“大脑”。此外,PD 本身也是由至少 3 个节点构成,拥有高可用的能力。建议部署奇数个 PD 节点。
存储节点
1、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 中的数据都会自动维护多副本(默认为三副本),天然支持高可用和自动故障转移。
2、TiFlash:TiFlash 是一类特殊的存储节点。和普通 TiKV 节点不一样的是,在 TiFlash 内部,数据是以列式的形式进行存储,主要的功能是为分析型的场景加速。
4、TiDB安装部署
TiDB安装环境要求高。必须严格按照官方要求安装。
开发及测试环境
组件 | CPU | 内存 | 本地存储 | 网络 | 实例数量(最低要求) |
---|---|---|---|---|---|
TiDB | 8 核+ | 16 GB+ | SAS, 200 GB+ | 千兆网卡 | 1(可与 PD 同机器) |
PD | 4 核+ | 8 GB+ | SAS, 200 GB+ | 千兆网卡 | 1(可与 TiDB 同机器) |
TiKV | 8 核+ | 32 GB+ | SSD, 200 GB+ | 千兆网卡 | 3 |
TiFlash | 32 核 + | 64 GB+ | SSD, 200 GB+ | 千兆网卡 | 1 |
TiCDC | 8 核 + | 16 GB+ | SSD, 200 GB+ | 千兆网卡 | 1 |
服务器总计 | 6 |
生产环境
组件 | CPU | 内存 | 硬盘类型 | 网络 | 实例数量(最低要求) |
---|---|---|---|---|---|
TiDB | 16 核+ | 48 GB+ | SAS | 万兆网卡(2块最佳) | 2 |
PD | 8 核+ | 16 GB+ | SSD | 万兆网卡(2块最佳) | 3 |
TiKV | 16 核+ | 64 GB+ | SSD | 万兆网卡(2块最佳) | 3 |
TiFlash | 48 核+ | 128 GB+ | 至少一块 SSD | 万兆网卡(2 块最佳) | 2 |
TiCDC | 16 核+ | 64 GB+ | SSD | 万兆网卡(2 块最佳) | 2 |
监控 | 8 核+ | 16 GB+ | SAS | 千兆网卡 | 1 |
服务器总计 | 13 |
TiDB安装-Local单机版
--我在电脑上装虚拟机Centos 7.9版本
在usr/创建tidb文件夹
--1、下载安装包
wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz
--2、解压文件
tar -zxvf tidb-latest-linux-amd64.tar.gz
cd tidb-latest-linux-amd64
--3、启动
--3.1、启动PD
./bin/pd-server --data-dir=pd --log-file=pd.log &
--3.2、启动tikv
./bin/tikv-server --pd="127.0.0.1:2379" --data-dir=tikv --log-file=tikv.log &
--3.3、启动tidb-server
./bin/tidb-server --store=tikv --path="127.0.0.1:2379" --log-file=tidb.log &
--4、登录
mysql -h 127.0.0.1 -P 4000 -u root
---------------------------------------
[root@localhost tidb]# tar -zxvf tidb-latest-linux-amd64.tar.gz
tidb-v5.0.1-linux-amd64/
tidb-v5.0.1-linux-amd64/PingCAP Community Software Agreement(English Version).pdf
tidb-v5.0.1-linux-amd64/bin/
tidb-v5.0.1-linux-amd64/bin/pd-ctl
tidb-v5.0.1-linux-amd64/bin/tikv-server
tidb-v5.0.1-linux-amd64/bin/tikv-ctl
tidb-v5.0.1-linux-amd64/bin/reparo
tidb-v5.0.1-linux-amd64/bin/tidb-server
tidb-v5.0.1-linux-amd64/bin/drainer
tidb-v5.0.1-linux-amd64/bin/arbiter
tidb-v5.0.1-linux-amd64/bin/pump
tidb-v5.0.1-linux-amd64/bin/etcdctl
tidb-v5.0.1-linux-amd64/bin/pd-recover
tidb-v5.0.1-linux-amd64/bin/binlogctl
tidb-v5.0.1-linux-amd64/bin/tidb-ctl
tidb-v5.0.1-linux-amd64/bin/pd-server
tidb-v5.0.1-linux-amd64/PingCAP Community Software Agreement(Chinese Version).pdf
[root@localhost tidb]# cd tidb-v5.0.1-linux-amd64/
[root@localhost tidb-v5.0.1-linux-amd64]#
[root@localhost tidb-v5.0.1-linux-amd64]# ./bin/tikv-server --pd="127.0.0.1:2379" --data-dir=tikv --log-file=tikv.log &
[2] 1486
[root@localhost tidb-v5.0.1-linux-amd64]# ./bin/tidb-server --store-tikv --path="127.0.0.1:2379" --log-file=tidb.log &
[3] 1504
[root@localhost tidb-v5.0.1-linux-amd64]# ./bin/tidb-server --store=tikv --path="127.0.0.1:2379" --log-file=tidb.log &
[2] 1509
------------------------------
虚拟机上没安装mysql客户端,需要安装客户端验证。虚拟机内存需要大些,
否则启动tidb,会自动exit。
由于本机电脑内存不够,服务没起来。
TiDB安装-Docker集群版
在usr/tidb下操作
注意:需要安装docker,和docker-compose并启动docker进行如下操作。
--1、下载tidb-docker-compose
git clone https://github.com/pingcap/tidb-docker-compose.git
--2、创建并启动集群
--获取最新的docker镜像:
cd tidb-docker-compose && docker-compose pull && docker-compose up -d
--3、登录
mysql -h 127.0.0.1 -P 4000 -u root
---------------------------------------
[root@localhost tidb]# ll
total 505140
-rw-r--r--. 1 root root 517255312 Sep 10 04:26 tidb-latest-linux-amd64.tar.gz
drwxr-xr-x. 5 1000 1000 4096 Sep 10 05:35 tidb-v5.0.1-linux-amd64
[root@localhost tidb]# git clone https://github.com/pingcap/tidb-docker-compose.git
Cloning into 'tidb-docker-compose'...
remote: Enumerating objects: 575, done.
remote: Counting objects: 100% (29/29), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 575 (delta 12), reused 18 (delta 5), pack-reused 546
Receiving objects: 100% (575/575), 302.18 KiB | 0 bytes/s, done.
Resolving deltas: 100% (255/255), done.
[root@localhost tidb]# ll
total 505144
drwxr-xr-x. 14 root root 4096 Sep 10 07:31 tidb-docker-compose
-rw-r--r--. 1 root root 517255312 Sep 10 04:26 tidb-latest-linux-amd64.tar.gz
drwxr-xr-x. 5 1000 1000 4096 Sep 10 05:35 tidb-v5.0.1-linux-amd64
[root@localhost tidb]# cd tidb-docker-compose && docker-compose pull && docker-compose up -d
Pulling pd0 ... done
Pulling pd1 ... done
Pulling pd2 ... done
Pulling tikv0 ... downloading (100.0%)
Pulling tikv1 ... downloading (100.0%)
Pulling tikv2 ... downloading (100.0%)
Pulling tidb ... done
Pulling tispark-master ... downloading (100.0%)
Pulling tispark-slave0 ... downloading (100.0%)
Pulling tidb-vision ... done
Pulling pushgateway ... done
Pulling prometheus ... done
Pulling grafana ... download complete
ERROR: for tispark-slave0 write /var/lib/docker/tmp/GetImageBlob992726425: no space left on device
ERROR: for grafana write /var/lib/docker/tmp/GetImageBlob360950237: no space left on device
ERROR: for tikv2 write /var/lib/docker/tmp/GetImageBlob469180858: no space left on device
ERROR: for tikv1 write /var/lib/docker/tmp/GetImageBlob469180858: no space left on device
ERROR: for tikv0 write /var/lib/docker/tmp/GetImageBlob469180858: no space left on device
ERROR: for tispark-master write /var/lib/docker/tmp/GetImageBlob289944414: no space left on device
ERROR: write /var/lib/docker/tmp/GetImageBlob289944414: no space left on device
[root@localhost tidb-docker-compose]#
----------------------
由于我虚拟机环境配置不足导致no space,没有空间。
后续没进行完成。
[root@localhost tidb-docker-compose]# free -m
total used free shared buff/cache available
Mem: 990 250 394 1 346 594
Swap: 819 18 801
5、TiDB-读取历史数据
TiDB实现了通过标准SQL接口读取历史数据功能,无需特殊的client或者driver,当数据被更新,删除后,依然可以通过SQL接口将更新/删除前的数据读取出来。
另外即使在更新数据之后,表结构发生了变化,TiDB依旧能用旧的表结构将数据读取出来。
操作流程:
为支持读取历史版本数据,引入了一个新的system variable:tidb_snapshot,这个变量是session范围有效,可以通过标准的set语句修改其值。其值为文本,能够存储TSO和日期时间。TSO即是全局授时的时间戳,是从PD端获取的。日期时间格式为:"2022-09-08 16:45:26.999",一般来说可以只写到秒。比如"2022-09-08 16:45:26"。当这个变量被设置时,TiDB会用这个时间戳建立snapshot,随后的所有select操作都会在这个snapshot上读取数据。
注意:
TiDB的事务是通过PD进行全局授时,所以存储的数据版本也是以PD所授时间戳为版本号。在生成snapshot时,是以tidb_snapshot变量的值作为版本号,如果TiDB Server所在机器和PD Server所在机器的本地时间相差较大,需要以PD的时间为准。
当读取历史版本操作结束后,可以结束当前session或者通过set语句将tidb_snapshot变量的值设置为"",即可读取最新版本的数据。
select now(); --查询系统时间
set @@tidb_snapshot="2022-09-08 16:45:26"; --这个时间要在update/delete之前的时间
注意:tidb_snapshot前须使用@@ 而非@,因为@@表示系统变量,@表示用户变量。
6、数据迁移-TiDB Lightning
MySQL-->TiDB
TiDB Lightning是一个将全量数据高速导入到TiDB集群的工具,目前支持Mydumper或CSV输出格式的数据源。你可以在以下两种场景下使用Lightning:迅速导入大量新数据/备份恢复所有数据。
TiDB Lightning主要包含两个部分:
1、TiDB-Lightning("前端"):主要完成适配工作,通过读取数据源,在下游TiDB集群建表、将数据转换成键/值对(KV 对)发送到tikv-importer、检查数据完整性等。
2、tikv-importer("后端"):主要完成将数据导入TiKV集群的工作,把tidb-lightning写入的KV对缓存、排序、切分并导入到TiKV集群。
tikv-importer.toml
# TiKV Importer 配置文件模板
# 日志文件
log-file = "tikv-importer.log"
#日志等级:trace、debug、info、error、off。
log-level = "info"
[server]
# tikv-importer 监听的地址,tidb-lightning需要连到这个地址进行数据写入。
addr = "192.168.0.185:8287"
[import]
# 存储引擎文档(engine file)的文件夹路径
import-dir = "/mnt/ssd/data.import/"
run.sh
#!/bin/bash
nohup ./tidb-lightning \
--importer 192.168.0.185:8287 \
-d /data/my_database/ \
--pd-urls 0.0.0.0:2379 \
--tidb-host 192.168.0.185 \
--tidb-user root \
--log-file tidb-lightning.log \
> nohup.out &
数据迁移步骤,可以去官网查看其他方式
在usr/tidb下操作
--1、下载安装包
wget https://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.tar.gz
wget https://download.pingcap.org/tidb-toolkit-latest-linux-amd64.tar.gz
--2、解压文件
tar -zxvf tidb-enterprise-tools-latest-linux-amd64.tar.gz
tar -zxvf tidb-toolkit-latest-linux-amd64.tar.gz
--3、准备导出MySQL数据
cd /usr/tidb/tidb-enterprise-tools-latest-linux-amd64/bin
--使用tidb-enterprise-tools-latest-linux-amd64/bin下的mydumper导出MySQL数据
./mydumper -h 127.0.0.1 -P 3306 -u root -p 123456 -t 16 -F 256 -B mytest -T t1,t1 --skip-tz-utc -o /data/my_database
--上面命令:MySQL连接信息,用户名root,密码123456,开启16线程,单个文件大小256M,mytest数据库,
--t1,t2表,存储到/data/my_database目录下。
--4、启动tikv-importer
cd /usr/tidb/tidb-toolkit-latest-linux-amd64/bin
vim tikv-importer.toml
--把tikv-importer.toml内容复制进去
nohup ./tikv-importer.toml > nohup.out &
--5、启动tidb-lightning
vim run.sh
--把上面run.sh内容复制进去
chmod 755 run.sh
./run.sh
---去tidb数据库种看是否数据迁移成功
懂与不懂都是收获!
每天⽤⼼记录⼀点点。内容也许不重要,但习惯很重要!
干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!