【011期】说一说为什么要拆分数据库,都有哪些方法?
>>号外:往期面试题,每10篇为一个单位归置到本公众号菜单栏->聚合->面试题库,有需要的欢迎翻阅。
1. 为什么要实现拆分数据库?
单体项目在构建之初,数据库的负载和数据量都不大,所以不需要对数据库做拆分,小型财务系统、文书系统、ERP系统、OA系统,用一个MySQL数据库实例基本就够用了。
就像《淘宝技术这十年》里面说到的,电商业务的数据量增长飞快,所以最开始的PHP+MySQL的架构已经不能满足实际要求了,于是淘宝想到的第一个办法就是把MySQL替换成Oracle。但是没过了多久,在08年前后,单节点的Oracle数据库也不好用了,于是淘宝终于告别了单节点数据库,开始拆分数据库。从一个节点,变成多个节点。
拆分数据库是有讲究的,比如说拆分方法有两种:垂直切分和水平切分。那你是先水平切分还是垂直切分呢?顺序无所谓?不,顺序有所谓,次序绝对不能错:先水平切分,然后垂直切分。
2. 什么是垂直切分?
垂直切分是根据业务来拆分数据库,同一类业务的数据表拆分到一个独立的数据库,另一类的数据表拆分到其他数据库。
比如说一个新零售的电商数据库,我们可以把跟商品相关的数据表拆分成一个数据库,然后在这些数据表的基础之上,构建出商品系统。比如用JAVA或者PHP语言,创建出一个商城系统。然后把跟进销存相关的数据表拆分到另外一个数据库上,再用程序构建出仓库系统。
垂直切分解决了什么问题
垂直切分可以降低单节点数据库的负载。原来所有数据表都放在一个数据库节点上,无疑所有的读写请求也都发到这个MySQL上面,所以数据库的负载太高。如果把一个节点的数据库拆分成多个MySQL数据库,这样就可以有效的降低每个MySQL数据库的负载。
垂直切分不能解决什么问题
垂直切分不能解决的是缩表,比如说商品表无论划分给哪个数据库节点,商品表的记录还是那么多,不管你把数据库垂直拆分的有多细致,每个数据表里面的数据量是没有变化的。
MySQL单表记录超过2000万,读写性能会下降的很快,因此说垂直切分并不能起到缩表的效果。
3. 什么是水平切分?
水平切分是按照某个字段的某种规则,把数据切分到多张数据表。一张数据表化整为零,拆分成多张数据表,这样就可以起到缩表的效果了。
很多人,都会水平切分存在误解,以为水平切分出来的数据表必须保存在不同的MySQL节点上。其实水平切分出来的数据表也可以保存在一个MySQL节点上面。不是水平切分一定需要多个MySQL节点。为什么这么说呢?
许多人不知道MySQL自带一种数据分区的技术,可以把一张表的数据,按照特殊规则,切分存储在不同的目录下。如果我们给Linux主机挂载了多块硬盘,我们完全可以利用MySQL分区技术,把一张表的数据切分存储在多个硬盘上。这样就由原来一块硬盘有限的IO能力,升级成了多个磁盘增强型的IO。
1)水平切分的用途
水平切分可以把数据切分到多张数据表,可以起到缩表的作用。
但是也不是所有的数据表都要做水平切分。数据量较大的数据表才需要做数据切分,比如说电商系统中的,用户表、商品表、产品表、地址表、订单表等等。有些数据表就不需要切分,因为数据量不多,比如说品牌表、供货商表、仓库表,这些都是不需要切分的。
2)水平切分的缺点
不同数据表的切分规则并不一致,要根据实际业务来确定。所以我们在选择数据库中间件产品的时候,就要选择切分规则丰富的产品。常见的数据库中间件有:MyCat、Atlas、ProxySQL等等。有些人觉得MyCat是Java语言开发的,就怀疑MyCat运行效率。其实数据库中间件的作用相当于SQL语句的路由器。你家路由器硬件配置不怎么高,但是不影响你享用百兆宽带。MyCat也是一个道理,它仅仅是起到SQL语句转发的作用,并不会实际执行SQL语句。我推荐使用MyCat最主要的原因是它自带了非常多的数据切分规则,我们可以按照主键求模切分数据,可以按照主键范围切分数据,还可以按照日期切分数据等等。因此说,为了满足业务的需要,MyCat目前来说算是非常不错的中间件产品。
水平切分的另一个缺点就是扩容比较麻烦,日积月累,分片迟早有不够用的时候。这时候不是首先选择增加新的集群分片。因为一个MySQL分片,需要4~8个MySQL节点(最小规模),增加一个分片的投入成本是很高的。所以正确的做法是做冷热数据分离,定期对分片中的数据归档。把过期的业务数据,从分片中转移到归档库。目前来说数据压缩比最高的MySQL引擎是TokuDB,而且带着事物的写入速度是InnoDB引擎的6-14倍。用TokuDB作为归档数据库最适合不过。
4. 为什么先做水平切分,后作垂直切分?
随着数据量的增加,最先应该做的是数据分片,利用多块硬盘来增大数据IO能力和存储空间,这么做的成本是最低的。几块硬盘的钱就能收获不错的IO性能。
进入到下一个阶段,数据量继续增大,这时候我们应该把数据切分到多个MySQL节点上,用MyCat管理数据切分。当然还要做数据的读写分离等等,这里不展开讨论。在后台做水平切分的同时,业务系统也可以引入负载均衡、分布式架构等等。理论上,使用了冷热数据分离之后,水平切分这种方式可以继续维持很长一段时间,数据量再大也不怕,定期归档就好了。
数据库到了水平切分的阶段,数据量的增加已经不是更改架构设计的主要原因了。反而这个阶段业务系统承受不住了,如果再不对系统做模块拆分,业务系统也撑不下去了,所以按照模块和业务,把一个系统拆分成若干子系统。若干子系统之间,数据相对独立。比如淘宝不会跟支付支付宝分享全部数据,共享同一套数据表,这也影响各自业务的发展。所以就要弄垂直切分了,把数据表归类,拆分成若干个数据库系统。
讲到这里,你仔细想想。如果过早的对数据库做了垂直切分,势必要重新构建若干独立的业务系统,工作量太巨大。水平切分并不需要业务系统做大幅度的修改,因此说应该先从水平切分开始做。
作者:神思者
imooc.com/article/288363
往期精选 点击标题可跳转
【001期】为什么Java不支持运算符重载?
【002期】说说 hashcode() 和 equals() 的作用、区别、联系?
【003期】Java 中 Class.forName 和 ClassLoader 到底有啥区别?
【004期】你知道为什么HashMap是线程不安全的吗?
【005期】了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?应对措施是什么?
【006期】面试官问:说一说 HashMap 中的容量与扩容如何实现?
【007期】面试中经常问哪些设计模式?懒汉,恶汉,双重校验锁,枚举和静态内部类
【008期】为什么需要消息队列?使用消息队列有什么好处?
【009期】如何正确访问 Redis 中的海量数据?服务才不会挂掉!
【010期】面试官问:你能说说 SOA 架构和微服务架构的区别么?
点个赞,就知道你“在看”!
【011期】说一说为什么要拆分数据库,都有哪些方法?相关推荐
- 【024期】说说为什么要拆分数据库?有哪些方法?
>>号外:关注"Java精选"公众号,回复"2021面试题",领取免费资料!"Java精选面试题"小程序,3000+ 道面试题在 ...
- 【34期】谈谈为什么要拆分数据库?有哪些方法?
点击上方蓝色"java大数据修炼之道", 选择"设为星标" 每晚九点: 技术干货
- 2019计算机开机号003期,2019年011期福彩中心开机号(附汇总)
001期开机号:819--试机号:985-- 开奖号:644→总结:开机号无下试机号无下 002期开机号:579--试机号:227-- 开奖号:272→总结:开机号下7试机号下27 003期开机号:0 ...
- python 列表多行_Python Pandas list列表数据列拆分成多行的方法实现
1.实现的效果 示例代码: df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]}) df Out[458]: A B 0 1 [1, 2] 1 2 [1, 2] ...
- oracle中有类似split的方法么,Oracle 实现拆分列数据的split()方法
'one,two,three,four,five,six,seven,eight,nine,zero'as source_string from dual),-- 统计字符串中子串的个数,用 ','来 ...
- ai中如何插入签名_技巧不求人167期 Excel如何打印到1页纸的2种方法 Excel如何插入手写签名...
嗨,大家好,上期我们介绍了Excel如何制作漂亮的文件盒侧标签.今天我们继续分享,在日常excel编辑过程中,常常会遇到因为数列或者行数过多导致内容不全,根本就不能打印在一张纸上面,假如分开打印到两张 ...
- 服务拆分理论和原理及方法
服务拆分理论和原理及方法 谈到微服务,议论的最多,吵架的最多的就是服务拆分问题,服务拆分是否合理直接影响到微服务架构的复杂性.稳定性以及可扩展性.然而并没有任何一本书籍或者规范来介绍如何拆分服务,那么 ...
- js拆字_分图程序 _拆分书法字体_拆分石刻碑文_拆分黄庭经碑文_使用方法
js拆字_分图程序 _拆分书法字体_拆分石刻碑文_拆分黄庭经碑文_使用方法 前言 javascript古籍文字拆分图片程序使用方法 古籍文字拆分图片程序 拆分手写字 能拆分雪碧图 能拆分透明png图 ...
- pandas中将每一行数据拆分成多行的方法
一.应用场景 用pandas处理数据时,我们经常会遇到将一行拆分成多行,或者将一列拆分成多列的方法,今天主要讲第一个问题,第二个问题下次讲.举个例子:我现有的数据如下: 其中TrainData是我需要 ...
最新文章
- Web APP开发技巧总结(转)
- OC之ARC环境中的循环strong问题
- android listpreference 自定义,Android ListPreference的用法一
- 我从创建具有仅仅一年编码经验的视频游戏中学到了什么
- Node有什么特点?
- Spring实现Controller中方法参数校验
- keil c51注册机2032
- linux如何设置默认浏览器,如何从命令行设置默认浏览器?
- 大学生生活中的三大痛点
- Jetson Xavier NX系统安装至 nvme 硬盘
- DDNS的NAT穿越问题
- solidworks显示无法连接到服务器,SOLIDWORKS Electrical解决方法:无法连接协同服务器...
- 数据预测算法-指数平滑法-2
- Python实战——1_1.网页制作
- 网景创始人:软件应用无所不在 正吞噬整个世界
- Unable to access ‘https://github.com/**/**/‘: OpenSSL SSL_read: Connection was aborted, errno 10053
- python爬虫之云片网国内短信接口爬取
- 七大原则+23种设计模式
- python收音机_FM收音机入门,以及Python实现FM调制解调
- Ubuntu Budgie 18.04 软件环境配置与CUDA 9.1、cuDNN7.1、Pytorch安装
热门文章
- 刘永好、冯仑、翁国亮顶力合作进军医疗健康产业
- 专业级mac数据恢复软件—Easyrecovery
- FPGA同步和异步电路
- Android获取电池电量的三种方法
- 天猫精灵设备联动,指纹锁开门,打开客厅的灯
- SecureCRT 快捷键
- 前端开发必备技能知识笔记-二级目录的配置
- Could not publish to the server tomcat version 8.5 requires java se7 or later......
- 服务器坏了怎么维修,服务器怎么老坏,坏了也没人修???
- NYOJ-1236-挑战密室