MySQL:互联网公司常用分库分表方案汇总!
发布时间:2022-11-17 07:13:22
一、数据库瓶颈
不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。
1、IO瓶颈
第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表。第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库。
2、CPU瓶颈
第一种:SQL问题,如SQL中包含join,group by,order by,非索引字段条件查询等,增加CPU运算的操作 -> SQL优化,建立合适的索引,在业务Service层进行业务计算。第二种:单表数据量太大,查询时扫描的行太多,SQL效率低,CPU率先出现瓶颈 -> 水平分表。
二、分库分表
1、水平分库
概念:以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。结果:
每个库的结构都一样;
每个库的数据都不一样,没有交集;
所有库的并集是全量数据;
场景:系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。分析:库多了,io和cpu的压力自然可以成倍缓解。
2、水平分表
概念:以字段为依据,按照一定策略(hash、range等),将一个表中的数据拆分到多个表中。 结果:
每个表的结构都一样;
每个表的数据都不一样,没有交集;
所有表的并集是全量数据;
场景:系统绝对并发量并没有上来,只是单表的数据量太多,影响了SQL效率,加重了CPU负担,以至于成为瓶颈。分析:表的数据量少了,单次SQL执行效率高,自然减轻了CPU的负担。
3、垂直分库
概念:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。结果:
每个库的结构都不一样;
每个库的数据也不一样,没有交集;
所有库的并集是全量数据;
场景:系统绝对并发量上来了,并且可以抽象出单独的业务模块。分析:到这一步,基本上就可以服务化了。例如,随着业务的发展一些公用的配置表、字典表等越来越多,这时可以将这些表拆到单独的库中,甚至可以服务化。再有,随着业务的发展孵化出了一套业务模式,这时可以将相关的表拆到单独的库中,甚至可以服务化。
4、垂直分表
概念:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。 结果:
每个表的结构都不一样;
每个表的数据也不一样,一般来说,每个表的字段至少有一列交集,一般是主键,用于关联数据;
所有表的并集是全量数据;
场景:系统绝对并发量并没有上来,表的记录并不多,但是字段多,并且热点数据和非热点数据在一起,单行数据所需的存储空间较大。以至于数据库缓存的数据行减少,查询时会去读磁盘数据产生大量的随机读IO,产生IO瓶颈。分析:可以用列表页和详情页来帮助理解。垂直分表的拆分原则是将热点数据(可能会冗余经常一起查询的数据)放在一起作为主表,非热点数据放在一起作为扩展表。这样更多的热点数据就能被缓存下来,进而减少了随机读IO。拆了之后,要想获得全部数据就需要关联两个表来取数据。但记住,千万别用join,因为join不仅会增加CPU负担并且会讲两个表耦合在一起(必须在一个数据库实例上)。关联数据,应该在业务Service层做文章,分别获取主表和扩展表数据然后用关联字段关联得到全部数据。
三、分库分表工具
sharding-sphere:jar,前身是sharding-jdbc;
TDDL:jar,Taobao Distribute Data Layer;
Mycat:中间件。
注:工具的利弊,请自行调研,官网和社区优先。
四、分库分表步骤
根据容量(当前容量和增长量)评估分库或分表个数 -> 选key(均匀)-> 分表规则(hash或range等)-> 执行(一般双写)-> 扩容问题(尽量减少数据的移动)。五、分库分表问题
1、非partition key的查询问题
基于水平分库分表,拆分策略为常用的hash法。端上除了partition key只有一个非partition key作为条件查询映射法
基因法
注:写入时,基因法生成user_id,如图。关于xbit基因,例如要分8张表,23=8,故x取3,即3bit基因。根据user_id查询时可直接取模路由到对应的分库或分表。根据user_name查询时,先通过user_name_code生成函数生成user_name_code再对其取模路由到对应的分库或分表。id生成常用snowflake算法。
端上除了partition key不止一个非partition key作为条件查询映射法
冗余法
注:按照order_id或buyer_id查询时路由到db_o_buyer库中,按照seller_id查询时路由到db_o_seller库中。感觉有点本末倒置!有其他好的办法吗?改变技术栈呢?
后台除了partition key还有各种非partition key组合条件查询NoSQL法
冗余法
2、非partition key跨库跨表分页查询问题
基于水平分库分表,拆分策略为常用的hash法。
注:用NoSQL法解决(ES等)。
3、扩容问题
基于水平分库分表,拆分策略为常用的hash法。水平扩容库(升级从库法)****
注:扩容是成倍的。
水平扩容表(双写迁移法)****
第一步:(同步双写)修改应用配置和代码,加上双写,部署;
第二步:(同步双写)将老库中的老数据复制到新库中;
第三步:(同步双写)以老库为准校对新库中的老数据;
第四步:(同步双写)修改应用配置和代码,去掉双写,部署;
六、分库分表总结
分库分表,首先得知道瓶颈在哪里,然后才能合理地拆分(分库还是分表?水平还是垂直?分几个?)。且不可为了分库分表而拆分。
选key很重要,既要考虑到拆分均匀,也要考虑到非partition key的查询。
只要能满足需求,拆分规则越简单越好。


猜你喜欢
- 一、项目需求厂区,公司门位处的两个玻璃窗户,需要安装两个幕帘报警设备,当在布署防区时,如果有较大物体靠近就会触发报警。值班室人员听到报警就可
- PPT中怎么制作多层圆环图表?ppt中想要制作多层的圆环图表,该怎么制作呢?下面我们就来看看详细的教程,很简单,需要的朋友可以参考下ppt中
- 宽带是现在很多台式机用户都需要用到的,但是宽带连接会经常出现各种的问题,最近有Win10用户就反映自己宽带连接出现了错误720提示。Win1
- Win10如何批量创建文件夹?我们在使用电脑的时候,经常会要创建各种文件夹来储存文件,当我们需要批量创建文件夹时,请手动单击鼠标右键以创建新
- 打开Excel表格提示向程序发送命令时出现问题解决方法/步骤:1、首先,判断是否是输入法有问题,将输入法卸载重装一下2、然后,还有可能是因为
- 电脑怎么彻底卸载sql server 2005?安装sql非常简单,但是要在卸载时将其全部清除干净却有点麻烦,下面就给大家分享如何彻底删除s
- Excel中的单元格具体该如何选中后变为高亮呢?接下来是学习啦小编为大家带来的excel2007选中单元格高亮的教程,供大家参考。excel
- 最近有Windows操作系统用户发现了一个文件名为pagefile.sys的隐藏文件,它所占用的内存有1G多。不知道它是什么文件,能否删除?
- 单击xp系统托盘中的时间图标时,系统弹出“您没有适当的特权级,因此无法更改时间,当前所使用的账户的更改系统时间的权限受限制了,可以通过下面的
- Win7系统将vbp工程文件打开时却提示“访问系统注册表错误”该如何解决?有不少用户在使用vbp工程文件时出现提示“访问系统注册表错误”,其
- 怎么在word里加折线图?在word文档中,用户可以自己选择添加折线图,满足自己需求,那在文档中添加折线图应该如何操作呢?来看看详细的方法教
- 电脑USB接口不能用怎么办?最近有用户发现电脑所有的USB接口都无法使用了,如何解决这个问题?系统部落为大家分析具体原因及解决办法。电脑机箱
- 对于办公族来说每天可能都要在Word里编写一些文档,对着一层不变的文档主题我们有时候也已经看腻了,其实在Word里系统有自带许多文档主题风格
- 相信不少用户在电脑中使用的电脑玩游戏的时候都会使用Steam,而最近有不少小伙伴在使用的时候,遇到错误代码-324的情况,导致无法正常的使用
- 在办公时我们经常会遇到的一种情况,就是想调整表格的大小,这时,掌握一个小技巧是非常重要的,应该怎么办呢?我们其实有好几种方法来进行操作:&n
- Win11是大家目前使用的最新的电脑操作系统了,有些用户犹豫不是很喜欢默认的锁屏壁纸,那么问题来了,如何更改Win11锁屏壁纸呢?下面就跟小
- 喜马拉雅网页版登录入口分享。有的用户想要在电脑浏览器中去使用喜马拉雅,但是不知道如何去访问并进行登陆的方法。如果你也遇到这个问题,可以通过本
- 我们在制作wps演示文稿的时候,可能需要对幻灯片设置循环播放的效果,那么,如何设置呢?下面就让小编告诉你wps演示如何设置幻灯片循环播放效果
- 工作中,有些数据需要通过手工再计算一些其他的数据,比如过磅单,那如何计算净重呢?一起来了解一下吧在日常工作中经常会用到excel,实际工作中
- 有时,我们在Windows7系统下编程会使用到MySQL数据库。但是有时,我们会忘记服务器登录密码?当我们忘记了登录密码,无法进入mysql