设为首页
收藏本站
切换到窄版
登录
立即注册
找回密码
搜索
搜索
本版
帖子
用户
快捷导航
论坛
BBS
C语言
C++
NET
JAVA
PHP
易语言
数据库
IE盒子
»
论坛
›
IE盒子
›
数据库
›
MySQL:互联网公司常用分库分表方案汇总! ...
1
2
3
/ 3 页
下一页
返回列表
发帖
查看:
208
|
回复:
20
MySQL:互联网公司常用分库分表方案汇总!
[复制链接]
校长吴易做
校长吴易做
当前离线
积分
14
3
主题
8
帖子
14
积分
新手上路
新手上路, 积分 14, 距离下一级还需 36 积分
新手上路, 积分 14, 距离下一级还需 36 积分
积分
14
发消息
发表于 2023-1-17 12:47:09
|
显示全部楼层
|
阅读模式
一、数据库瓶颈
二、分库分表
三、分库分表工具
四、分库分表步骤
五、分库分表问题
六、分库分表总结
七、分库分表示例
<hr/>
《Java 2019 超神之路》
《Dubbo 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》
《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》
《数据库实体设计合集》
《Java 面试题 —— 精品合集》
《Java 学习指南 —— 精品合集》
<hr/>
一、数据库瓶颈
不管是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等),将一个
库
中的数据拆分到多个
库
中。
结果:
每个
库
的
结构
都一样;
每个
库
的
数据
都不一样,没有交集;
所有
库
的
并集
是全量数据;
<li data-pid="eVhbdGHg">场景:系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。<li data-pid="M9rx0t7w">分析:库多了,io和cpu的压力自然可以成倍缓解。
2、水平分表
概念:以
字段
为依据,按照一定策略(hash、range等),将一个
表
中的数据拆分到多个
表
中。
结果:
每个
表
的
结构
都一样;
每个
表
的
数据
都不一样,没有交集;
所有
表
的
并集
是全量数据;
<li data-pid="8OjJsTX1">场景:系统绝对并发量并没有上来,只是单表的数据量太多,影响了SQL效率,加重了CPU负担,以至于成为瓶颈。<li data-pid="TG68K8F3">分析:表的数据量少了,单次SQL执行效率高,自然减轻了CPU的负担。
3、垂直分库
概念:以
表
为依据,按照业务归属不同,将不同的
表
拆分到不同的
库
中。
结果:
每个
库
的
结构
都不一样;
每个
库
的
数据
也不一样,没有交集;
所有
库
的
并集
是全量数据;
<li data-pid="YxHuQCKT">场景:系统绝对并发量上来了,并且可以抽象出单独的业务模块。<li data-pid="Xwr2ptWn">分析:到这一步,基本上就可以服务化了。例如,随着业务的发展一些公用的配置表、字典表等越来越多,这时可以将这些表拆到单独的库中,甚至可以服务化。再有,随着业务的发展孵化出了一套业务模式,这时可以将相关的表拆到单独的库中,甚至可以服务化。
4、垂直分表
概念:以
字段
为依据,按照字段的活跃性,将
表
中字段拆到不同的
表
(主表和扩展表)中。
结果:
每个
表
的
结构
都不一样;
每个
表
的
数据
也不一样,一般来说,每个表的
字段
至少有一列交集,一般是主键,用于关联数据;
所有
表
的
并集
是全量数据;
<li data-pid="h4lJ8riO">场景:系统绝对并发量并没有上来,表的记录并不多,但是字段多,并且热点数据和非热点数据在一起,单行数据所需的存储空间较大。以至于数据库缓存的数据行减少,查询时会去读磁盘数据产生大量的随机读IO,产生IO瓶颈。<li data-pid="4Msmq-qp">分析:可以用列表页和详情页来帮助理解。垂直分表的拆分原则是将热点数据(可能会冗余经常一起查询的数据)放在一起作为主表,非热点数据放在一起作为扩展表。这样更多的热点数据就能被缓存下来,进而减少了随机读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的查询。
只要能满足需求,拆分规则越简单越好。
七、分库分表示例
示例GitHub地址:https://github.com/littlecharacter4s/study-sharding
来源:http://cnblogs.com/littlecharacter/p/9342129.html
《Java 2019 超神之路》
《Dubbo 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》
《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》
《数据库实体设计合集》
《Java 面试题 —— 精品合集》
《Java 学习指南 —— 精品合集》
回复
使用道具
举报
獨龍
獨龍
当前离线
积分
0
0
主题
6
帖子
0
积分
新手上路
新手上路, 积分 0, 距离下一级还需 50 积分
新手上路, 积分 0, 距离下一级还需 50 积分
积分
0
发消息
发表于 2023-1-17 12:47:20
|
显示全部楼层
基本上活不到分库分表的阶段,项目就挂了,所以都是屠龙技。
回复
使用道具
举报
雪花飘过
雪花飘过
当前离线
积分
16
3
主题
11
帖子
16
积分
新手上路
新手上路, 积分 16, 距离下一级还需 34 积分
新手上路, 积分 16, 距离下一级还需 34 积分
积分
16
发消息
发表于 2023-1-17 12:47:54
|
显示全部楼层
过于真实
回复
使用道具
举报
我叫勒布朗
我叫勒布朗
当前离线
积分
12
1
主题
7
帖子
12
积分
新手上路
新手上路, 积分 12, 距离下一级还需 38 积分
新手上路, 积分 12, 距离下一级还需 38 积分
积分
12
发消息
发表于 2023-1-17 12:48:42
|
显示全部楼层
这么复杂得是几个亿的项目吧
回复
使用道具
举报
薛新民
薛新民
当前离线
积分
12
1
主题
9
帖子
12
积分
新手上路
新手上路, 积分 12, 距离下一级还需 38 积分
新手上路, 积分 12, 距离下一级还需 38 积分
积分
12
发消息
发表于 2023-1-17 12:49:42
|
显示全部楼层
学习中,另外图的水印,建议打在不影响阅读的地方
回复
使用道具
举报
陈明颀
陈明颀
当前离线
积分
10
2
主题
5
帖子
10
积分
新手上路
新手上路, 积分 10, 距离下一级还需 40 积分
新手上路, 积分 10, 距离下一级还需 40 积分
积分
10
发消息
发表于 2023-1-17 12:50:33
|
显示全部楼层
写的真好,网上文章乱七八糟写一堆根本看不明白,这篇文章清晰明了,一看就懂
回复
使用道具
举报
固原
固原
当前离线
积分
9
1
主题
7
帖子
9
积分
新手上路
新手上路, 积分 9, 距离下一级还需 41 积分
新手上路, 积分 9, 距离下一级还需 41 积分
积分
9
发消息
发表于 2023-1-17 12:51:17
|
显示全部楼层
说的真TM好!
回复
使用道具
举报
花生壳
花生壳
当前离线
积分
7
1
主题
4
帖子
7
积分
新手上路
新手上路, 积分 7, 距离下一级还需 43 积分
新手上路, 积分 7, 距离下一级还需 43 积分
积分
7
发消息
发表于 2023-1-17 12:51:26
|
显示全部楼层
不对哦。。 感觉芋道源码好久没发文了微信上
回复
使用道具
举报
陈俊华
陈俊华
当前离线
积分
13
2
主题
10
帖子
13
积分
新手上路
新手上路, 积分 13, 距离下一级还需 37 积分
新手上路, 积分 13, 距离下一级还需 37 积分
积分
13
发消息
发表于 2023-1-17 12:51:44
|
显示全部楼层
升级从库法硬是没看懂
回复
使用道具
举报
天使梦境
天使梦境
当前离线
积分
14
2
主题
9
帖子
14
积分
新手上路
新手上路, 积分 14, 距离下一级还需 36 积分
新手上路, 积分 14, 距离下一级还需 36 积分
积分
14
发消息
发表于 2023-1-17 12:52:16
|
显示全部楼层
库扩容可以参考一下这个文章的前半段
数据库扩容方案 - xuwc - 博客园
回复
使用道具
举报
下一页 »
1
2
3
/ 3 页
下一页
返回列表
发帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
快速回复
返回顶部
返回列表