【TBase开源版测评】分布式数据自动shard分片
本次我们根据TBase测评操作指引说明文档体验分布式数据自动shard分片,命令和使用方式基本上跟PostgreSQL没有区别,给我们这些原来使用过PostgreSQL数据库的人能很快的上手使用。
一、体验流程
1、查看集群的数据节点情况
连接数据库,:psql -p 30004 -d postgres -U tbase
连接数据库
输入查看命令:select node_name,node_type,node_host,node_port from pgxc_node where node_type='D';
查看数据节点
这里是我已经安装好的集群的数据节点的情况。
2、创建shard表,查看数据分布情况
输入命令创建shard表:
create table tbase(id int,nickname text) distribute by shard(id);
创建表
这就有点莫名其妙了。官方对此问题并没有任何说明,最终查阅了部分postgresql的文档后找到解决办法:
解决错误提示
继续创建表:
创建表
使用命令创建要导入数据的订单详情表:
create table tbnote_qtxsdcb(f_djhm text) distribute by shard(f_djhm);
创建订单详情表
使用管理工具从原有项目的mssql数据库中的数据导入到tbase数据库中,导入后查看数据总量:
查看数据总量
随机抽取部分数据进行查看在各个数据节点的分布情况:
查看数据
查看数据
查询结果显示,数据分布在了所有的节点上,这个分布基本上是均衡的。查询的时候只需连接到TBase的Coordinator节点,可以查询分布在任何节点的数据,而无需关注数据节点分布情况。上面简单的例子可以看到业务在使用shard表时只用指定shard key,后续的查询都无需关注数据的分布情况,与使用单机数据库没有任何差别。
3、典型复杂场景分析(join为例),为了体验此功能,我们将线上项目中的订单表导入到测试集群中:
创建表命令:
create table tbnote_qtxsdzb(f_djhm text);
创建订单表
使用管理工具从原有项目的mssql数据库中的数据导入到tbase数据库中,导入后查看数据总量:
查看数据总量
数据导入之后,我们首先体验join key与shard key相同的情况下的join查询:
explain select t1.f_djhm,t2.f_hybh from tbnote_qtxsdcb as t1 join tbnote_qtxsdzb as t2 on t1.f_djhm=t2.f_djhm limit 10;
查询命令
可以下推到节点计算的场景,这个场景在分库分表的插件也可以做到。然后体验join key与shard key不同的情况下的join查询:
explain select t1.f_djhm,t2.f_hybh from tbnote_qtxsdcb as t1 join tbnote_qtxsdzb as t2 on t1.f_djhm=t2.f_bc limit 10;
查看数据
join无法下推的场景该场景能体现分布式的优势,分库分表的插件并不能自动的做到这种。分析上面的查询计划可以看到,需要把数d的数据都拉取到dn002上去执行join操作,这样就涉及到了数据节点的数据交互,有时候会带来比较大的网络开销,同时性能不佳。
二、体验总结
通过本次体验,对TBase的分布式数据自动shard分片功能有了深刻的认识,也尝试的在项目架构中考虑如何把这一特性应用到实际项目中。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- java向mysql插入数据乱码问题解决
- java向数据库中插入中文出现乱码
- Flutter基础widgets教程-FractionallySizedBox篇
- 关于myeclipse控制台输出中文乱码的问题
- nutz 自定义查询 分页 取值
- jquery-uploadifyv3.2.1 文件上传插件 学习
- Flutter基础widgets教程-Icon篇
- Redis:持久化
- Flutter基础widgets教程-IconButton篇
- Flutter基础widgets教程-Image篇
- Go - 学习 grpc.Dial(target string, opts …DialOption) 的写法
- Flutter基础widgets教程-IntrinsicHeight篇
- Flutter基础widgets教程-Baseline篇
- springcloud本地开发的微服务如何调用远程k8s的微服务
- Flutter基础widgets教程-LimitedBox篇