![封面](/download?fileName=01005cbf039a51f24145adecd134c9e93839.png)
在业务发展的过程中,随着数据量的增长会遇到很多问题,只是使用MySQL已经无法满足我们的要求,有人可能会说采用分库分表啊,但有的时候某些数据由于业务关系,比如查询的维度很多,但是分库分表之后partitionKey只能选一个,这个时候很难去进行分库分表。当然可以采用其他的方式,但是我们今天有一个更好的方式。
采用TiDB等兼容MySQL的NewSQL,TiDB 是一个分布式 NewSQL数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。
顺便提一下互联网公司数据库的演进:MySQL -> NoSQL -> NewSQL,TiDB就是新一代的新关系型数据库
TiDB特点
水平扩展: 简单的增加节点就可以增加SQL处理的速度,已经存储容量。 传统型的关系型数据库一般默认只有垂直扩展
兼容MySQL:可以使用MySQL的客户端去操作TiDB,这个时候一般可以平滑的从MySQL切换到TiDB,不过并不是100%的兼容的。这里有一些已知的兼容性问题:TiDB与MySQL兼容性问题
数据从MySQL迁移或导出:TiDB提供了数据迁移工具,可以让数据从TiDB到MySQL互相导入导出
强分布式事务一致性:内部采用了两段式提交,不过想要使用这个功能需要用MySQL5.7以上的客户端
云原生SQL数据库:可以轻松的部署到各种云上
故障恢复:TiDB采用Raft协议,不丢失大多数副本的前提下,可以实现故障的自动恢复 (auto-failover),无需人工介入。
...
特性很多:但是我们比较关注的比如说性能,扩展性,这个可以自己测试下
TiDB架构
TiDB平台由三个关键部分组成:
TiDB Server,无状态的,不存储数据,只做计算,类似于负载均衡器如F5
接收SQL请求
处理SQL相关逻辑
定位TiKV的地址来存储数据,通过PD来计算数据
与TiKV交换数据
返回结果
PD Server,负责管理集群的组件
存储集群的元数据,比如说某个Key在哪个区域
调度和调整TiKV集群的数据分布
分配全局唯一事务ID
TiKV Server
真正存储数据
从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎
存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range,从 StartKey 到EndKey 的左闭右开区间,的数据,每个 TiKV 节点会负责多个 Region
TiDB也提供了TiSpark组件方便后续做在线实时处理
安装部署
上面引入了这么多的概念,这里我们一起来实践下,感受TiDB的魅力,本次实验环境采用的是Docker,其跨平台在几大操作系统上都可用。
3PD实例,3TiKV实例,1TiDB实例
监控组件:Prometheus, Pushgateway, Grafana
数据可视化工具:tidb-vision
1 下载Docker,自行配置其国内源地址,这里配置的源地址为中科大的镜像
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
2 下载TiDB的docker相关配置
git clone https://github.com/pingcap/tidb-docker-compose.git
3 下载有关的Docke镜像
cd tidb-docker-compose && docker-compose pull
4 启动TiDB的集群
docker-compose up -d
5 使用MySQL的客户端连接TiDB Server
6 Docker-compose文件中配置了Granfana等配置,我们看一一下TiDB-Server的监控信息:http://localhost:3000
7 数据可视化工具,访问http://localhost:8010/查看
探索TiDB
上面我们已经安装好了TiDB的集群,接下来去深入了解一些TiDB实践要点。
读取历史数据
TiDB可以读取到历史版本的数据,我们不用使用额外的东西,只需标准的SQL接口就可以。
就算数据被更新或者删除了,我们仍然可以读取到历史的数据
就算数据结构也改变了,TiDB仍然使用历史版本的数据结构来读取数据
我们只需要设置tidb_snapshot变量就可以实现这个功能。下面做一个演示
1 首先创建一个测试表t,然后插入三行数据
create table t (c int); insert into t values (1), (2), (3);
2 查看表中的数据与当前的时间戳
select c,now() from t;
3 更新某一行的数据,然后再读取数据确保数据已经被改变了
update t set c=22 where c=2; select * from t;
4 下面到关键时刻了,设置tidb_snapshot变量,以便读取到历史版本,通过如下结果可以看到确实读取到历史版本了
set @@tidb_snapshot="2019-05-30 14:18:20"; select * from t;
5 读取最新的版本数据
set @@tidb_snapshot=""; select * from t;
水平扩展TiDB
首先我们需要编译安装TiDB的一个命令行控制工具。pd-ctl,在docker集群下,我们只需要既然怒docker内就可以进行控制。
1 找到pd的容器,然后使用Docker进入容器内,可以看到pd-ctl工具
2 测试pd-ctl的功能,使用member命令来查看PD的成员
3 动态的添加一个PD服务器到集群中,在启动pd 服务器的时候指定要加入的集群地址。
./bin/pd-server --name=pd4 \ --client-urls="http://host4:2379" \ --peer-urls="http://host4:2380" \ --join="http://host1:2379"
磁盘空间不够用了,这个就不演示了
4 删除一个PD服务器,通过pd-ctl命令来删除节点
./pd-ctl -u http:127.0.0.1//:2379 >> member delete name pd2
如果你想迁移一个节点的数据到一个新的节点,首先你要做的是添加一个新的节点到已有的集群中,然后删除要迁移的旧的节点,但是要注意一次只能迁移一个节点,在迁移完成之后,记得验证数据的准确性。
TiKV的操作
使用pd-ctl也可以去控制tikv
1 获取TiKV服务器的信息
./pd-ctl -u http://host1:2379 >> store
2 添加TiKV服务器到集群中,这个非常简单,只需要启动一个新的TiKV服务器即可,新启动的TiKV服务器会自动的注册到集群中。同时PD服务器会自动的进行负载均衡操作,也就是PD会逐渐的将数据迁移到新的TiKV服务器上
3 删除一个TiKV节点,删除节点之前,需要通知PD服务器,然后PD服务器会迁移要删除的TiKV服务器上的数据到其它的TiKV服务器上,确保要删除的服务器有副本。
# 假设要删除TiKV服务器,storeid为1 ./pd-ctl -u http://host1:2379 >> store delete 1 # 检查状态,可以看到status是OffLine的 >> store 1
最后记得停止所有的容器,并记得清楚它们,以防占用过多系统资源
docker-compose stop docker-compose rm
最后
关于TiKV的实践就说到这里了,在国内很多大公司都有在生产环境中使用TiDB服务器,已知的就有小米,美团,今日头条,同程,去哪儿等等,是一个相对比较成熟的产品了。
本次我们从TiDB的特性开始说起,然后讲到了如何安装使用,以及它的读取历史版本特性,最后说了一下它的集群特性,希望能帮到大家
参考资料
注:
本文独家发布自金蝶云社区