TiDb

一笑奈何 提交于 2020-02-03 03:28:54

源自 https://www.cnblogs.com/1ning/p/8985999.html

简介

TiDB 是 PingCAP 公司受 Google Spanner / F1 论文启发而设计的开源分布式 HTAP (Hybrid Transactional and Analytical Processing) 数据库,结合了传统的 RDBMS 和 NoSQL 的最佳特性。TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性。TiDB 的目标是为 OLTP (Online Transactional Processing) 和 OLAP (Online Analytical Processing) 场景提供一站式的解决方案

特性

1)高度兼容 MySQL
大多数情况下,无需修改代码即可从 MySQL 轻松迁移至 TiDB,分库分表后的 MySQL 集群亦可通过 TiDB 工具进行实时迁移。

2)水平弹性扩展
通过简单地增加新节点即可实现 TiDB 的水平扩展,按需扩展吞吐或存储,轻松应对高并发、海量数据场景。

3)分布式事务
TiDB 100% 支持标准的 ACID 事务。

4)真正金融级高可用
相比于传统主从 (M-S) 复制方案,基于 Raft 的多数派选举协议可以提供金融级的 100% 数据强一致性保证,且在不丢失大多数副本的前提下,可以实现故障的自动恢复 (auto-failover),无需人工介入。

5)一站式 HTAP 解决方案
TiDB 作为典型的 OLTP 行存数据库,同时兼具强大的 OLAP 性能,配合 TiSpark,可提供一站式 HTAP 解决方案,一份存储同时处理 OLTP & OLAP,无需传统繁琐的 ETL 过程。

6)云原生 SQL 数据库
TiDB 是为云而设计的数据库,同 Kubernetes 深度耦合,支持公有云、私有云和混合云,使部署、配置和维护变得十分简单。

兼容性

不支持的特性:视图、存储过程、触发器、自定义函数、外键约束、全文索引、空间索引、非UTF-8字符集。与我们实际应用不冲突。

与mysql差异

1)TiDB 的自增 ID (Auto Increment ID) 只保证自增且唯一,并不保证连续分配。TiDB 目前采用批量分配的方式,所以如果在多台 TiDB 上同时插入数据,分配的自增 ID 会不连续
2)TiDB 支持常用的 MySQL 内建函数,但是不是所有的函数都已经支持,具体请参考语法文档
3)TiDB 实现了 F1 的异步 Schema 变更算法,DDL 执行过程中不会阻塞线上的 DML 操作。目前支持的DDL包括数据库、表、索引、列的创建和删除操作以及列的修改操作。TiDB对列的修改有限制,如不支持从null改成not null,不支持对enum列修改等

事务

TiDB 使用乐观事务模型,在执行 Update、Insert、Delete 等语句时,只有在提交过程中才会检查写写冲突,而不是像 MySQL 一样使用行锁来避免写写冲突。所以业务端在执行 SQL 语句后,需要注意检查 commit 的返回值,即使执行时没有出错,commit的时候也可能会出错

架构

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

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

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 为单位进行调度

解决问题

1)水平扩展
无限水平扩展是 TiDB 的一大特点,这里说的水平扩展包括两方面:计算能力和存储能力。TiDB Server 负责处理 SQL 请求,随着业务的增长,可以简单的添加 TiDB Server 节点,提高整体的处理能力,提供更高的吞吐。TiKV 负责存储数据,随着数据量的增长,可以部署更多的 TiKV Server 节点解决数据量的问题(自动分库)。PD 会在 TiKV 节点之间以 Region 为单位做调度,将部分数据迁移到新加的节点上。所以在业务的早期,可以只部署少量的服务实例(推荐至少部署 3 个 TiKV, 3 个 PD,2 个 TiDB),随着业务量的增长,按照需求添加 TiKV 或者 TiDB 实例

2)高可用
高可用是 TiDB 的另一大特点,TiDB/TiKV/PD 这三个组件都能容忍部分实例失效,不影响整个集群的可用性。下面分别说明这三个组件的可用性、单个实例失效后的后果以及如何恢复。
TiDB 是无状态的,推荐至少部署两个实例,前端通过负载均衡组件对外提供服务。当单个实例失效时,会影响正在这个实例上进行的 Session,从应用的角度看,会出现单次请求失败的情况,重新连接后即可继续获得服务。单个实例失效后,可以重启这个实例或者部署一个新的实例。
PD 是一个集群,通过 Raft 协议保持数据的一致性,单个实例失效时,如果这个实例不是 Raft 的 leader,那么服务完全不受影响;如果这个实例是 Raft 的 leader,会重新选出新的 Raft leader,自动恢复服务。PD 在选举的过程中无法对外提供服务,这个时间大约是3秒钟。推荐至少部署三个 PD 实例,单个实例失效后,重启这个实例或者添加新的实例。
TiKV 是一个集群,通过 Raft 协议保持数据的一致性(副本数量可配置,默认保存三副本),并通过 PD 做负载均衡调度。单个节点失效时,会影响这个节点上存储的所有 Region。对于 Region 中的 Leader 结点,会中断服务,等待重新选举;对于 Region 中的 Follower 节点,不会影响服务。当某个 TiKV 节点失效,并且在一段时间内(默认 10 分钟)无法恢复,PD 会将其上的数据迁移到其他的 TiKV 节点上。

3)小彩蛋
兼容 MySQL 5.7 及以上,同时更好地支持文档类型存储,表中包含一个 JSON 字段来存储复杂的信息



除了插入、查询外,对 JSON 的修改也是支持的。目前支持的 MySQL 5.7 的 JSON 函数:JSON_EXTRACT、JSON_ARRAY、JSON_OBJECT、JSON_SET、JSON_REPLACE、JSON_INSERT、JSON_REMOVE、JSON_TYPE、JSON_UNQUOTE

docker compose测试环境部署

官方文档:https://pingcap.com/docs-cn/stable/how-to/get-started/deploy-tidb-from-docker-compose/

要求:
Docker(17.06.0 及以上版本)
Docker Compose
Git

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

#centos默认装1.13的docker,卸载原来的docker13
yum -y remove docker*
rm -rf /var/lib/docker/

#安装最新的docker,使用阿里云
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates #查询新的docker版本
yum install docker-ce #不指定默认拉取最新的docker
systemctl start docker

docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:25:41 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea
  Built:            Wed Nov 13 07:24:18 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

# 安装docker-compose 推荐使用pip3安装
yum -y install epel-release
yum -y install python3-pip
pip3 install docker-compose

# 克隆tidb
git clone https://github.com/pingcap/tidb-docker-compose.git
# 拉取镜像,启动容器,启动tidb集群
cd tidb-docker-compose && docker-compose pull && docker-compose up -d

docker ps
[root@tidb ~]# docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                               NAMES
4d53e60e0db9        pingcap/tispark:latest       "/opt/spark/sbin/sta…"   42 minutes ago      Up 42 minutes       0.0.0.0:38081->38081/tcp                            tidb-docker-compose_tispark-slave0_1
d930089fc09a        pingcap/tispark:latest       "/opt/spark/sbin/sta…"   42 minutes ago      Up 42 minutes       0.0.0.0:7077->7077/tcp, 0.0.0.0:8080->8080/tcp      tidb-docker-compose_tispark-master_1
2a8767b06cea        pingcap/tidb:latest          "/tidb-server --stor…"   42 minutes ago      Up 42 minutes       0.0.0.0:4000->4000/tcp, 0.0.0.0:10080->10080/tcp    tidb-docker-compose_tidb_1
d0ce7d9c064c        pingcap/tikv:latest          "/tikv-server --addr…"   42 minutes ago      Up 42 minutes       20160/tcp                                           tidb-docker-compose_tikv1_1
0dda036cd5ec        pingcap/tikv:latest          "/tikv-server --addr…"   42 minutes ago      Up 42 minutes       20160/tcp                                           tidb-docker-compose_tikv0_1
28636750301b        pingcap/tikv:latest          "/tikv-server --addr…"   42 minutes ago      Up 42 minutes       20160/tcp                                           tidb-docker-compose_tikv2_1
52d03f700e12        pingcap/tidb-vision:latest   "/bin/sh -c 'sed -i …"   42 minutes ago      Up 42 minutes       80/tcp, 443/tcp, 2015/tcp, 0.0.0.0:8010->8010/tcp   tidb-docker-compose_tidb-vision_1
70289d6934f1        prom/prometheus:v2.2.1       "/bin/prometheus --l…"   42 minutes ago      Up 42 minutes       0.0.0.0:9090->9090/tcp                              tidb-docker-compose_prometheus_1
07c8e05ea67c        grafana/grafana:6.0.1        "/run.sh"                42 minutes ago      Up 42 minutes       0.0.0.0:3000->3000/tcp                              tidb-docker-compose_grafana_1
78470c2e818b        pingcap/pd:latest            "/pd-server --name=p…"   42 minutes ago      Up 42 minutes       2380/tcp, 0.0.0.0:32770->2379/tcp                   tidb-docker-compose_pd0_1
abab7400fbfa        prom/pushgateway:v0.3.1      "/bin/pushgateway --…"   42 minutes ago      Up 42 minutes       9091/tcp                                            tidb-docker-compose_pushgateway_1
48e9c9ebb24d        pingcap/pd:latest            "/pd-server --name=p…"   42 minutes ago      Up 42 minutes       2380/tcp, 0.0.0.0:32768->2379/tcp                   tidb-docker-compose_pd2_1
ccca0c2c6af6        pingcap/pd:latest            "/pd-server --name=p…"   42 minutes ago      Up 42 minutes       2380/tcp, 0.0.0.0:32769->2379/tcp  


# 可以用mysql进行连接
yum -y install wget
wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
rpm -ivh mysql57-community-release-el7-7.noarch.rpm
yum -y install mysql-community-server
systemctl start mysql


#命令行连接tidb,只需要指定端口,不需要密码
mysql -h 127.0.0.1 -P 4000 
#默认有4个数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| INFORMATION_SCHEMA |
| PERFORMANCE_SCHEMA |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.00 sec)


#也可以使用navicat这些工具进行连接,只需要指定4000端口,不用密码



#grafana
http://192.168.1.160:3000/?orgId=1
用户名密码都是admin



#停止docker-compose删除容器卷组还原环境:
cd tidb-docker-compose/
docker-compose down
docker volume rm `docker volume ls -q`
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!