TiDB大规模数据存储实践指南原创
金蝶云社区-艾贺521
艾贺521
5人赞赏了该文章 1,890次浏览 未经作者许可,禁止转载编辑于2019年05月30日 23:14:24
封面


在业务发展的过程中,随着数据量的增长会遇到很多问题,只是使用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架构

image.png

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

image.png

3 下载有关的Docke镜像

cd tidb-docker-compose && docker-compose pull

image.png



4 启动TiDB的集群

docker-compose up -d

image.png


5 使用MySQL的客户端连接TiDB Server

image.png


6 Docker-compose文件中配置了Granfana等配置,我们看一一下TiDB-Server的监控信息:http://localhost:3000

image.png

image.png


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);

image.png


2 查看表中的数据与当前的时间戳

select c,now() from t;


image.png


3 更新某一行的数据,然后再读取数据确保数据已经被改变了

update t set c=22 where c=2;
select * from t;

image.png


4 下面到关键时刻了,设置tidb_snapshot变量,以便读取到历史版本,通过如下结果可以看到确实读取到历史版本了

set @@tidb_snapshot="2019-05-30 14:18:20";
select * from t;

image.png

5 读取最新的版本数据

set @@tidb_snapshot="";
select * from t;

image.png



水平扩展TiDB

首先我们需要编译安装TiDB的一个命令行控制工具。pd-ctl,在docker集群下,我们只需要既然怒docker内就可以进行控制。


1 找到pd的容器,然后使用Docker进入容器内,可以看到pd-ctl工具

image.png


2 测试pd-ctl的功能,使用member命令来查看PD的成员

image.png


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


image.png



最后

关于TiKV的实践就说到这里了,在国内很多大公司都有在生产环境中使用TiDB服务器,已知的就有小米,美团,今日头条,同程,去哪儿等等,是一个相对比较成熟的产品了。

本次我们从TiDB的特性开始说起,然后讲到了如何安装使用,以及它的读取历史版本特性,最后说了一下它的集群特性,希望能帮到大家


参考资料


注:

本文独家发布自金蝶云社区


赞 5