shardingjdbc分库分表数据均衡性讨论

问题引入

最近一个业务系统中,因为数据量很大,经过技术选型,综合权衡选择了sharding-Jdbc,本文主要讨论的是分库分表的表达式

我们有一个批次总表A,还有一个明细表B,我们需要对明细表B进行水平拆分,考虑系统数据的可扩展性和mysql的负载,我们打算针对B表进行分表,分4个数据库,每个数据库64张表,使用A表的主键批次id【fnQpid】来作为分片键。

问题演进

第一版本

一开始选用了一个最简单的hash路由策略,如下:

分库策略为

fnQpid % 4

分表策略为

fnQpid % 64

乍一看,没啥问题,仔细琢磨后发现了一个问题,这样分会导致数据分布不均衡,为啥会导致数据不均衡呢?

假设某一个fnQpid的数据分在了0库的1分表,那么这个fnQpid需要满足什么条件呢?

第一,分在了0库需要满足,fnQpid=4m 【m为整数】 ====》可以推测出fnQpid为偶数

第二,分在1分表需要满足,fnQpid=64n+1 【n为整数】====》可以推测出fnQpid为奇数

毫无疑问,这样的fnQpid是不存在的,也就是某一个fnQpid的数据分在了0库的1分表这个假设不成立,也就是这样分库分表会导致数据分布不均衡。

第二版本

发现上面的问题后,优化了一版分库分表的算法

分库策略

(fnQpid % 256)/64

分表策略

(fnQpid % 256) % 64

简单介绍一下这个方案的思路

  • 先计算总的逻辑表的数量,也就是4*64=256
  • 然后计算fnQpid % 256的值,这个值的范围是[0,255],把这256个数据当成是一个整体来看,计算其所在的数据库(fnQpid % 256)/64,该值的范围是[0,3]
  • 最后计算所在分表(fnQpid % 256) % 64,该值的数据范围是[0,63]

按照这样的分库分表方式,不会出现第一种情况(有些表永远不会有数据出现),但是这样的路由策略有一个美中不足,如图

当批次号连续自增的时候,明细表的数据分布是这样的,前256个批次的数据在0库,接着在1库,接着在2库,最后在3库,再接着又回到0库,如此循环往复。

若每个批次有1000条数据,那么在短时间内,就会有256000的数据落在同一个数据库,这个瞬时数据的写入、查询都是一个不小的压力。可以说这个方案,数据物理上是分布均衡的,但是在短时间内,mysql单个数据库的负载是不均衡的。

第三版本

考虑到上面两种问题后,继续优化

分库策略为

fnQpid % 4

分表策略为

(fnQpid >> 2) % 64

简单介绍下这个方案
这个方案是在方案一的基础上,进行了分表策略的优化。
一开始是直接用fnQpid % 64,这样有问题是fnQpid的最后两位二进制已经参与了数据库(fnQpid % 4)的计算了,再参与分表的计算,就会互相影响。新的方案是,先踢掉最后两位二进制(fnQpid >> 2),再参与分表计算,数据流入如下图

可以看到,数据是按照顺序从0库到3库先填充满所有的0表,接着填充满所有的1表…,填充所有的63表,再填充满所有的0表,如此循环往复。当瞬时间有大量数据写入的时候,数据是分散在不同的数据库的,因此解决了方案二(数据库负载不均衡)的问题了

问题总结

为什么分表的数量是64呢?为什么不是100呢?

针对这个问题,大家可以思考下为什么HashMap的初始容量要设置成16(2的4次幂),redisCluser的哈希槽为什么是16384(2的14次幂)?

我个人认为,是为了提升速度。因为无论是HashMap还是redisCluser,都需要频繁的根据key来计算数组的index,这个操作是hash(key)%16、hash(key)%16384,这样做就差点意思。

看过hashMap源码的同学都知道,源代码上使用了hash(key)&15 来计算index,也就是hash(key)&15等价于hash(key)%16,延展下,

若n为2的整数次幂时 m % n 等价于 m & (n-1)

因此,我们的分库分表为了提速,分表数量选择了2的整数次幂。最终的分库分表的表达式是这样
分库策略为

fnQpid & 3

分表策略为

(fnQpid >> 2) & 63

针对分库分表的策略,大家还遇到过什么坑吗?欢迎评论区留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

InputAction的使用

感觉Unity中InputAction的使用,步步都是坑。 需求点介绍 当用户长按0.5s 键盘X或者VR left controller primaryButton (即X键)时,显示下一个图片。 步骤总览 创建InputAction资产将该InputAction资产绑定到某个GameObject上在对应的script中&#xf…

计算机视觉与深度学习-经典网络解析-VGG-[北邮鲁鹏]

目录标题 VGG参考VGG网络贡献使用尺寸更小的$3 \times 3$卷积串联来获得更大的感受野放弃使用$11 \times 11$和$5 \times 5$这样的大尺寸卷积核深度更深、非线性更强,网络的参数也更少;去掉了AlexNet中的局部响应归一化层(LRN)层。 网络结构主要改进输入…

21 mysql ref 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

基于abaqus的非等速生长Voronoi晶体模型生成插件

1. 非等速生长晶体模型简介 对于标准Voronoi而言,每个晶粒的生长速率是相同的,任意两个晶粒的交界线为其形核点连线的垂直平分线,交界线为一条直线,如图1.1所示。 图1.1 标准Voronoi晶粒交界线 而对于非等速生长Voronoi晶体而言…

肖sir__项目环境之全流程__005

一、测试流程(h模型) 1、需求文档(产品) 需求文档(软件需求规格说明书srs) (1)如何分析需求 a、显示需求(主流程、功能,业务) b、隐性需求&#x…

js惰性函数

看下面这份ts代码 实现的效果也很简单,就是将一份文本,复制到剪切板上,未了兼容更多的浏览器(没错说的就是你>ie !),做了一个兼容性判断, 当浏览器支持navigator.clipboard这个api时,就直接调用这个api将文本复制到剪切板中, 如果不支持这个api的话,就执行else里面的代码,这…

解决qml编译时出现错误ninja: build stopped: subcommand failed.

qml编译时出现错误ninja: build stopped: subcommand failed. 如下图: 解决这个编译错误其实很简单,我把Window写错了,写成了window, 如果有类似的报错,可以检查一下qml代码是否有问题。当然在Qt Creator里也没有错误提示&#x…

MySQL 远程连接1130问题

通过后台进入mysql 1,切换到mysql库 2.查询user表信息 3.更新你想远程登录的用户的host信息,我这里想用root进行远程登录,所以修改如下 4.刷新权限 5.大功告成 快来和博主打成一片吧^_^

【Vue】修饰符、表单提交方式、自定义组件的关键步骤

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Vue快速入门》。🎯🎯 &…

识别准确率达 95%,华能东方电厂财务机器人实践探索

摘 要:基于华能集团公司大数据与人工智能构想理念,结合东方电厂实际工作需要,财务工作要向数字化、智能化纵深推进,随着财务数字化转型和升级加速,信息化水平不断提升,以及内部信息互联互通不断加深&#x…

git之撤销工作区的修改和版本回溯

有时候在工作区做了一些修改和代码调试不想要了,可如下做 (1)步骤1:删除目录代码,确保.git目录不能修改 (2)git log 得到相关的commit sha值 可配合git reflog 得到相要的sha值 (3)执行git reset --hard sha值,可以得到时间轴任意版本的代码 git reset --hard sha值干净的代…

【Node.js】定时任务cron:

文章目录 一、文档:【Nodejs 插件】 二、安装与使用【1】安装【2】使用 三、cron表达式:{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}四、案例: 一、文档: 【说明文档】https://www.npmjs.com/package/cron 【Cron表…

中国核动力研究设计院使用 DolphinDB 替换 MySQL 实时监控仪表

随着仪表测点的大幅增多和采样频率的增加,中国核动力研究设计院仪控团队原本基于 MySQL 搭建的旧系统已经无法满足大量数据并发写入、实时查询和聚合计算的需求。他们在研究 DB-Engines 时序数据库榜单时了解到国内排名第一的 DolphinDB。经过测试,发现其…

齿轮减速机设备类网站pbootcms模板(PC端+手机端自适应)

齿轮减速机设备类网站pbootcms模板-手机端自适应,优化SEO效果 模板介绍: 这是一款基于PbootCMS内核开发的模板,专为机械设备和加工机械类企业设计。该模板具有简洁简单的页面设计,易于管理,同时还附带测试数据。通过使…

ID保持的人像生成

AIGC真实人像写真,也即输入一些图片,生成图片里对应人物在不同场景和风格下的图片。妙鸭相机作为AIGC领域一款成功的收费产品为大家展示了如何使用AIGC技术只需要少量的人脸图片建模,即可快速提供真/像/美的个人写真,在极短的时间…

Python —— pytest框架

1、认识pytest框架 1、搭建自动化框架的思路与流程 1、搭建自动化测试框架的思路和流程,任意测试手段流程都是一致的:手工测试、自动化测试、工具测试 手工测试:熟悉业务 —— 写用例 —— 执行用例并记录结果 —— 生成测试报告自动化测试…

一、 计算机网络概论

一、计算机网络概论 1、计算机网络概述 1.1、概念 计算机网络是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统 是一些互连的、自治的计算机系统的集合 以能够相互共享资源的方…

研究生选控制嵌入式还是机器视觉好?

研究生选控制嵌入式还是机器视觉好? 我是嵌入式/硬件方向转的算法,现在是公司的算法负责人,如果再让我选一次,我是不会再选嵌入式方 向,嵌入式如果只做技术是没前途的。 你要是有一定自学能力,能自己在学校…

make: /bin/nvcc: Command not found 解决找不到nvcc

首先输入nvcc -V查看nvcc路径,发现报错Command nvcc not found,接下来我们就要解决这个问题。 1)进入cuda的bin目录cd /usr/local/cuda/bin,ls查看是否有nvcc 说明存在nvcc但cuda路径没有添加系统变量 2)在bin目录下输…

大数据 Hive 数据仓库介绍

目录 一、​​数据仓库概念 二、场景案例:数据仓库为何而来? 2.1 操作型记录的保存 2.2 分析型决策的制定 2.3 OLTP 环境开展分析可行吗? 2.4 数据仓库的构建 三、数据仓库主要特征 3.1 面向主题性(Subject-Orient…