TiDB简介
TiDB是国内PingCAP团队的一个分布式SQL数据库。它的灵感来自于Google的F1和Google spanner,TiDB支持包括传统RDBMS和NoSQL的特性。TiDB 兼容 MySQL 的系统变量,同时定义了一些特有的系统变量用于调整数据库行为。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议。
与 MySQL 兼容性对比:TiDB 支持包括跨行事务,JOIN 及子查询在内的绝大多数 MySQL 的语法,用户可以直接使用现有的MySQL 客户端连接。如果现有的业务已经基于 MySQL 开发,大多数情况不需要修改代码即可直接替换单机的 MySQL。包括现有的大多数 MySQL 运维工具(如 PHPMyAdmin, Navicat, MySQL Workbench 等),以及备份恢复工具(如 mysqldump, mydumper/myloader)等都可以直接使用。
TiDB特性
高度兼容 MySQL
大多数情况下,无需修改代码即可从 MySQL 轻松迁移至 TiDB,分库分表后的 MySQL 集群亦可通过 TiDB 工具进行实时迁移。
水平弹性扩展
通过简单地增加新节点即可实现 TiDB 的水平扩展,按需扩展吞吐或存储,轻松应对高并发、海量数据场景。
分布式事务
TiDB 100% 支持标准的 ACID 事务。
真正金融级高可用
相比于传统主从 (M-S) 复制方案,基于 Raft 的多数派选举协议可以提供金融级的 100% 数据强一致性保证,且在不丢失大多数副本的前提下,可以实现故障的自动恢复 (auto-failover),无需人工介入。
一站式 HTAP 解决方案
TiDB 作为典型的 OLTP 行存数据库,同时兼具强大的 OLAP 性能,配合 TiSpark,可提供一站式 HTAP 解决方案,一份存储同时处理 OLTP & OLAP,无需传统繁琐的 ETL 过程。
云原生 SQL 数据库
TiDB 是为云而设计的数据库,同 Kubernetes 深度耦合,支持公有云、私有云和混合云,使部署、配置和维护变得十分简单。
TiDB 的设计目标是 100% 的 OLTP 场景和 80% 的 OLAP 场景,更复杂的 OLAP 分析可以通过 TiSpark 项目来完成。
TiDB 对业务没有任何侵入性,能优雅的替换传统的数据库中间件、数据库分库分表等 Sharding 方案。同时它也让开发运维人员不用关注数据库 Scale 的细节问题,专注于业务开发,极大的提升研发的生产力。
要深入了解 TiDB 的水平扩展和高可用特点,首先需要了解 TiDB 的整体架构。
TiDB 集群主要分为三个组件:
TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回结果。 TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(如LVS、HAProxy 或 F5)对外提供统一的接入地址。
Placement Driver (简称 PD) 是整个集群的管理模块,其主要工作有三个: 一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁移等);三是分配全局唯一且递增的事务 ID。
PD 是一个集群,需要部署奇数个节点,一般线上推荐至少部署 3 个节点。
TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range (从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region 。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,不同节点上的多个 Region 构成一个 Raft Group,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。
如何设计
为了验证功能,我采用的是运用Docker Compose搭建部署的TiDB单机进行测试。
Docker Compose 可以通过一个 YAML 文件定义多个容器的应用服务,然后一键启动或停止。可以用来在单机上一键部署一套 TiDB 测试集群,使用 Docker Compose 部署 TiDB 集群要求 Docker 是 17.06.0 及以上版本。
(1)我下载的是18.03.1.ce-1.el7.centos版本
添加 yum 软件源:
$ sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
这个命令会添加稳定版本的Docker CE yum源。
安装 Docker CE:更新 yum 软件源缓存,并安装 docker-ce
1 $ sudo yum makecache fast
2 $ sudo yum install docker-ce
启动 Docker CE:
1 $ sudo systemctl enable docker
2 $ sudo systemctl start docker
(2)使用Docker-Compose部署
下载tidb-docker-compose:
git clone https://github.com/pingcap/tidb-docker-compose.git
创建并启动集群:
1 $ cd tidb-docker-compose
2 $ docker-compose up -d
安装mysql:
(1)下载mysql的repo源
$ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
(2)安装mysql-community-release-el7-5.noarch.rpm包
$ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
(3)安装mysql
$ sudo yum install mysql-server
(4) 重置mysql密码
$ mysql -u root
访问集群:
$ mysql -h 127.0.0.1 -P 4000 -u root
访问集群 Grafana 监控页面:http://localhost:3000 ,默认用户名和密码均为 admin。
集群数据可视化:http://localhost:8010
结果图:
图1 Grafana 监控页面
图2 集群数据可视化
图3 连接MySQL客户端
(3)部署安装中遇到的问题
* 在安装docker时老是启动不成功,Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
原因是docker守护进程绑定的是Unix的socket而不是一个TCP端口,Unix的socket默认属于root用户,
所以,
方案一,使用docker时必须加上sudo。
方案二,或者创建一个名为docker组,然后将用户加入这个组内。当docker守护进程启动时,它会把Unix的读写权限赋予docker组。这样,当你作为docker组内用户使用docker客户端时,你就无须使用sudo了
我用的是方案一:
1 $ sudo su //切换到root
2 $ service docker start //启动docker service
3 $ docker images //显示所有images
4 $ docker ps //重新运行docker命令
* 登陆mysql时可能会出现:ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘ (2),原因是/var/lib/mysql的访问权限问题。因此把/var/lib/mysql的拥有者改为当前用户:
$ sudo chown -R root:root /var/lib/mysql
再重启mysql服务即可
$ service mysqld restart
接下来登陆重置密码:
$ mysql -u root //直接回车进入mysql控制台
mysql > use mysql;
mysql > update user set password=password('123456') where user='root';
mysql > exit;
ending !