分库分表中间件 sharding
发布日期:2021-05-24 16:18:13 浏览次数:0 分类:技术文章

  任何一个技术的出现,都不是为了秀肌肉而产生的。 

  sharding jdbc  这个分库分表技术要解决的问题就是,随着数据量级的提升,物理硬件达到瓶颈,单表的性能优化也带来了瓶颈。 而数据量仍然要突破的难题。

  这个问题的解决方案,其实就是一种分治的思想。用一句白话来解释,就是大事化小,举个简答的例子,就是让你查一斤大米确切的有几个,如果让你一个人来查花费时间太多,假如需要花费三个小时。那么找两个人,把一斤大米分成两份,花费的时间大约就是一个半小时。如果分成六份,六个人来查,大概就是花费半个小时。 这就是分治的思想,效果又很明显,从三个小时,到半个小时。

  把这个问题还原成数据库的问题,数据库有库的概念,表的概念。 那么解决问题就是要分库分表。

 如果还不了解分库分表的概念请看我一篇文章:

 

 

# # 分库分表带来的问题

  在  这篇文章里的已经介绍了一些问题。

  此外,还有一些问题是一定要解决的:比如对数据源问题,分库以后在不同的服务器上,访问ip地址都不一样了。等等

 

# # sharding jdbc

  轻量级框架,以jar包的形式使用,相当于是增强版的jdbc驱动。

  核心功能是:提供数据分片,和读写分离。

  优点所在是:应用可以透明的使用 jdbc 访问数据库,达到让应用程序对分库分表无感知。也就是说,分库分表明明带来的问题,但是就是又有人帮你做处理,让应用程序仍然按照之前的逻辑来写,并不用因为分库分表了做任何改变。


# # 问题解决过程


 因为数据库性能瓶颈,所以需要进行分库分表。

 因为引入了分库分表,所以引入多数据源问题。

 因为有多数据源问题,所以代码逻辑需要修改。

 应为sharding 的出现,所以解决了修改逻辑的难题,

 最终做到让业务无感多数据源,做到分库分表。

 

# # 无感的解决问题,带来的是:单机性能损耗的问题。

 为什么会消耗内存呢?

 其实中间多了一层 sql 截取 和重装的过程,因为对数据库操作的本质还是sql,因为数据库只认识sql

 因为是分库分表,所以结果还是要汇总的。

 

 

# # sharding jdbc 的使用

 就像是jdbc 驱动一样,先配置数据源。

 然后再配置数据节点

 配置主键生成测测咯,主键不能是数据库自增了,要使用全局主键。

 上图所谓的表名是逻辑表名 

 看最后一行:其实这是 逻辑表名 和 实际数据库表名形成映射的关键所在 后边加上数字,就是实际数据库的表名。而逻辑表名实际上就是我们写的sql 的表名。

 

 

 

 

# # 相关概念

  逻辑表:就是我们在 操作过程中写的 sql 中表名,所谓的逻辑就是假装有。

  真实表:   就是数据库中真实存在的,这里的真实 是和 逻辑 相映射的。

  数据节点: 如下,带逻辑表名,以及 后边根据算法而来的真实表名。

 绑定表:这个一般用于 和子表关联  ,这样不用产生笛卡尔积。 比如 a 和 b表 ,a分表后是 a1 和 a2  ,b分后是 b1 和 b2 ,如果是笛卡尔积,那就是四种情况,发四条sql 语句。如果是绑定表,则只需要两条。

 

 广播表:就是在每个库上都建一个表,一个操作,同时操作多份。

  分片键:就是根据这个字段进行算法分表的。

 分片算法:

 分片策略:=分片键+分片算法   尾数取模,哈希,时间,等等

 自增主键生成策略:解决分布式主键冲突问题,用全局自增主键。

 

# # 执行过程

 先进行sql 语法解析,解析后,进行路由,然后sql 重新组装,执行sql,然后结果归并。

 

# # 查询结果归并

 流式归并,内存归并,装饰者归并

 

# # sharding 需要特别注意的问题

 如果我们设置了分片键,在做查询的时候,查询就要加上分片键。否则就是扫描全部的表,也就是说打比方分了三个库,每个库三个表。如果你业务上的sql 没有带上分片键,也就是说sharding 无法根据你sql解析来路由到哪里,也就是说知道到九个表中做全部的查询,也就是说不做分库分表,是一条语句,分库分表后,如果不带 分片键就是 9条sql。这就造成了不必要的资源浪费。

  从这个角度上来讲,其实 sharding 并不是说的那么好。并不是业务对sql是无感,很准确的说,我们的sql,要强行加分片键,否则结果就是造成不必要的性能损耗,甚至说不如不做分库分表来的好。

 

# # 公共表(一般用来关联查询的时候 字典表)

 

# # sharding 读写分离

 先配置数据库能够读写分离,这一块sharding 不能帮,需要我们自己操作。

 配置成以后,路由问题,可以交给 sharding 来管理,

 任何一个数据源都要告诉 sharding,先把从库的数据源告诉sharding ,就是通过配置的形式。

 明显最上边能做的的仅仅是知道了数据源,sharding也不能通过名字就知道谁是主库,谁是从库。

 于是有下边的红框的内容告诉 sharding ,谁是主库,谁是从库。

 这也还不够,还需要在数据节点上,添加这个读写分离的操作。 

上一篇:sharding jdbc 配置文件详解
下一篇:分库分表

关于作者

    白红宇是个全栈工程师,前端vue,小程序,app开发到后端框架设计,数据库设计,环境部署上线运维。

最新文章

pythonchar中的拟合方法_Python torch.CharTensor方法代碼示例 2021-09-13
python爬取12306_python爬取12306火车车次信息 2021-09-13
python强制删除文件夹_对Python各种删除文件失败的处理方式-强制删除文件 2021-09-13
mysql 多表联合查询_第五次作业-多表查询-mysql 2021-09-13
为linux系统设计一个简单的文件系统。要求做到以下几点:_学习嵌入式操作系统... 2021-09-13
唯一可译码判决准则_基于FPGA的结构改进型(2,1,4)维特比译码器 2021-09-13
mfc 定义全局容器 多个窗体共用_面试官:你简历中写用过 Docker,能说说容器和镜像的区别吗?... 2021-09-13
下标要求数组或指针类型_数组下标的对应关系 2021-09-13
小程序调用快递鸟接口_微信小程序如何调用后台service(图文教程) 2021-09-13
真空压力变送器怎么样零点标定_射频导纳物位计的标定方法 2021-09-13
指定的信任提供程序不认识或不支持使用者的指定格式。_如何通过小程序积分商城功能提升产品销量... 2021-09-13
python3吧_Python新人指南[3] 2021-09-13
python bool类型如何与整数比较_Python解惑:整数比较 2021-09-13
python火车票购买程序代码_100行Python代码实现自动抢火车票(附源码) 2021-09-13
python 绘制lift曲线_模型和策略效果衡量常用指标——LIFT提升度 2021-09-13
python输入年份月份输出天数_输入年份和月份,输出该月天数 2021-09-13
python扫描局域网端口和ip_python实现扫描局域网指定网段ip的方法 2021-09-13
python如何并发运行2个软件_并发vs并行 2021-09-13
python colormap_Python matplotlib的使用并自定义colormap的方法 2021-09-13
python中面向对象的ui_Python 工匠:写好面向对象代码的原则(上) 2021-09-13