TiDB是一个NewSql的分布式数据库,具体介绍我们引用官方的简介

简介

TiDB 是 PingCAP 公司受 Google Spanner / F1 论文启发而设计的开源分布式 NewSQL 数据库。

TiDB 具备如下 NewSQL 核心特性:

SQL支持(TiDB 是 MySQL 兼容的)
水平弹性扩展(吞吐可线性扩展)
分布式事务
跨数据中心数据强一致性保证
故障自恢复的高可用
海量数据高并发实时写入与实时查询(HTAP 混合负载)
TiDB 的设计目标是 100% 的 OLTP 场景和 80% 的 OLAP 场景,更复杂的 OLAP 分析可以通过 TiSpark 项目来完成。

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

我们来看一下TiDB的架构图

架构图

从架构图中可以看出TiDB的三大组件都支持水平扩展而且内部通信使用的是gRPC,关于TiDB和gRPC的那些事可以查看InfoQ的文章:《TiDB与gRPC的那点事》

TiDB使用的TiKV作为存储,官方建议至少TiKV使用ssd硬盘,如果条件好pd模块最好也使用ssd硬盘。

下来我们具体看一下三大组件分别都是干什么的

TiDB Server

TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回结果。 TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(如LVS、HAProxy 或 F5)对外提供统一的接入地址。

PD Server

Placement Driver (简称 PD) 是整个集群的管理模块,其主要工作有三个: 一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁移等);三是分配全局唯一且递增的事务 ID。

PD 是一个集群,需要部署奇数个节点,一般线上推荐至少部署 3 个节点。

TiKV Server

TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range (从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region 。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,不同节点上的多个 Region 构成一个 Raft Group,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。

特性

可以无限水平扩展而且三大组件都是高可用,TiDB/TiKV/PD 这三个组件都能容忍部分实例失效,不影响整个集群的可用性。关于三大组件出现问题后如何恢复可以查看:《tidb-整体架构中的高可用章节》

官方的部署建议

TiDB使用的TiKV作为存储,官方建议至少TiKV使用ssd硬盘,如果条件好pd模块最好也使用ssd硬盘。

建议 4 台及以上,TiKV 至少 3 实例,且与 TiDB、PD 模块不位于同一主机。

组件 CPU 内存 本地存储 网络 实例数量(最低要求)
TiDB 8核+ 16 GB+ SAS, 200 GB+ 千兆网卡 1(可与 PD 同机器)
PD 8核+ 16 GB+ SAS, 200 GB+ 千兆网卡 1(可与 TiDB 同机器)
TiKV 8核+ 32 GB+ SSD, 200 GB+ 千兆网卡 3
- - - - 服务器总计 4

个人觉得这个使用的成本还是蛮高的。具体可以看《软、硬件环境要求》

测试部署

TiDB的部署方式还是蛮丰富的,可以使用Ansible在线以及离线的部署集群,TiDB-Ansible 是 PingCAP 基于 Ansible playbook 功能编写的集群部署工具。使用 TiDB-Ansible 可以快速部署一个完整的 TiDB 集群(包括 PD、TiDB、TiKV 和集群监控模块)。

TiDB同时也支持Docker部署方案,由于我们公司内网使用docker容器的方式管理所有服务,所以我这里使用docker方式部署。

我们使用Rancher来做企业级的容器管理平台,没有使用k8s、mesos来进行编排管理,使用的是Rancher自带的Cattle,Cattle不光有编排管理还包含了应用、服务、卷、负载均衡、健康检查、服务升级、dns服务、等功能,有兴趣的可以查看:《Rancher官方文档-Cattle》

在进行部署之前需要先去Docker官方镜像库中拉TiDB集群所需要的三大组件的镜像: Docker 官方镜像仓库

docker pull pingcap/tidb:latest
docker pull pingcap/tikv:latest
docker pull pingcap/pd:latest

这三个组件的镜像都不大,TiKV只有54MB,PD只有21MB,TiDB只有17MB

这个我需要说一下他们这块做的还是很不错的,将镜像压缩的都比较小,去除了很多无用的东西。

我们需要创建7个容器来部署一个TiDB集群:

容器 容器IP 宿主机IP 部署服务 数据盘挂载
PD1 10.42.59.28 192.168.18.108 PD1 /home/docker/TiDB
PD2 10.42.202.152 192.168.18.108 PD2 /home/docker/TiDB
PD3 10.42.214.245 192.168.18.108 PD3 /home/docker/TiDB
TiDB 10.42.188.35 192.168.18.109 TiDB /home/docker/TiDB
TiKV1 10.42.106.167 192.168.18.109 TiKV1 /home/docker/TiDB
TiKV2 10.42.34.97 192.168.18.109 TiKV2 /home/docker/TiDB
TiKV3 10.42.170.152 192.168.18.109 TiKV3 /home/docker/TiDB

用docker的好处就是资源可以压缩到最小,我6个容器可以放在一到两台虚机上

查看pd集群信息

http://192.168.18.108:2379/v2/members
http://192.168.18.108:2479/v2/members
http://192.168.18.108:2579/v2/members

返回信息以json格式,三台pd返回集群信息都是一样的

{"members":[{"id":"969b7171b723b804","name":"pd3","peerURLs":["http://192.168.18.108:2580"],"clientURLs":["http://192.168.18.108:2579"]},{"id":"d141f07798663b47","name":"pd2","peerURLs":["http://192.168.18.108:2480"],"clientURLs":["http://192.168.18.108:2479"]},{"id":"e5e987f33a60e672","name":"pd1","peerURLs":["http://192.168.18.108:2380"],"clientURLs":["http://192.168.18.108:2379"]}]}

具体的docker容器创建命令可以参考官方文档:《Docker部署方案》

TiDB支持mysql协议可以使用任意mysql客户端连接,默认安装好的集群使用mysql登录,端口:4000,用户名:root,密码为空,修改密码跟mysql修改密码方式完全一样。

SET PASSWORD FOR 'root'@'%' = 'xxx';

下面说几个我们必须要关心的东西。

事务隔离级别可以查看:《TiDB 事务隔离级别》

SQL语法没有什么变化,具体可以查看:《SQL语句语法》

SQL执行计划什么的都有跟使用mysql几乎一样,还增加了json的支持,可以设置字段列存储类型为json格式。

具体与MySQL有什么差异可以查看:《与MySQL兼容性对比》

历史数据回溯问题可以查看:《TiDB 历史数据回溯》

Binlog可以使用:《TiDB-Binlog 部署方案》

还有《备份与恢复》《数据迁移》

好了今天的大致介绍和测试环境集群搭建都到这里,后面会总结使用中遇到的问题。