大厂面试高频:聊下分库分表与读写分离的实现原理
关注△mikechen的互联网架构△,10年+BAT架构经验倾囊相授
大家好,我是 mikechen | 陈睿 。
最近有同学留言问睿哥,表示公司数据量比较大,需要涉及到分库分表等方案,不知道从哪里着手?
这里会涉及到:
如何来分?是先分区?还是先分库?怎么分表等问题?
本篇,我就重点来谈谈应对数据量大的拆分等方案。@mikechen
为什么要分库分表和读写分离?
类似淘T宝B这样的网站,海量数据的存储和访问成为了系统设计的瓶颈问题,日益增长的业务数据,无疑对数据库造成了相当大的负载,同时对于系统的稳定性和扩展性提出很高的要求。
随着时间和业务的发展,数据库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作的开销也会越来越大。
另外,无论怎样升级硬件资源,单台服务器的资源(CPU、磁盘、内存、网络IO、事务数、连接数)总是有限的,最终,数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
分表、分库和读写分离,可以有效地减小单台数据库的压力。
分库分表的原理和实现
1.什么是分区、分表、分库
分区
就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的,分区实现比较简单,数据库mysql、oracle等很容易就可支持。
分表
就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。
分库
一旦分表,一个库中的表会越来越多
将整个数据库比作图书馆,一张表就是一本书。当要在一本书中查找某项内容时,如果不分章节,查找的效率将会下降。而同理,在数据库中就是分区。
2.什么时候考虑使用分区?
当一张表的查询速度,已经慢到影响使用的时候。
- sql经过优化。
- 数据量大。
- 表中的数据是分段的。
- 对数据的操作往往只涉及一部分数据,而不是所有的数据。
分区解决的问题:主要可以提升查询效率。
分区的实现方式(简单),例如:
mysql5 开始支持分区功能
CREATE TABLE sales (
id INT AUTO_INCREMENT,
amount DOUBLE NOT NULL,
order_day DATETIME NOT NULL,
PRIMARY KEY(id, order_day)
) ENGINE=Innodb
PARTITION BY RANGE(YEAR(order_day)) (
PARTITION p_2010 VALUES LESS THAN (2010),
PARTITION p_2011 VALUES LESS THAN (2011),
PARTITION p_2012 VALUES LESS THAN (2012),
PARTITION p_catchall VALUES LESS THAN MAXVALUE);
3.什么时候考虑分表?
- 一张表的查询速度已经慢到影响使用的时候。
- sql经过优化。
- 数据量大。
- 当频繁插入或者联合查询时,速度变慢。
4.分表解决的问题
分表后,单表的并发能力提高了,磁盘I/O性能也提高了,写操作效率提高了。
- 查询一次的时间短了。
- 数据分布在不同的文件,磁盘I/O性能提高。
- 读写锁影响的数据量变小。
- 插入数据库需要重新建立索引的数据减少。
5.分表的实现方式(复杂)
需要业务系统配合迁移升级,工作量较大。
6.常见分表、分库常用策略
1.平均进行分配hash(object)%N(适用于简单架构)。
2.按照权重进行分配且均匀轮询。
3.按照业务进行分配。
4.按照一致性hash算法进行分配(适用于集群架构,在集群中节点的添加和删除不会造成数据丢失,方便数据迁移)。
7.分库分表中间件
分表又分为单库分表(表名不同)和多库分表(表名相同)。
不管使用哪种策略,都还需要自己去实现路由,制定路由规则等,可以考虑使用开源的分库分表中间件,无侵入应用设计。
读写分离的原理和实现
1、什么是读写分离
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
2、为什么要读写分离呢?
因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
所以,读写分离解决的是,数据库的写入,影响了查询的效率。
3、什么时候要读写分离?
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库主从同步 ,可以减少数据库压力,提高性能。
当然,数据库也有其它优化方案。memcache 或是 表折分,或是搜索引擎都是解决方法。
4.主从复制、读写分离的基本设计
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性、还是高并发等各个方面,都是完全不能满足实际需求的。
因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。一台主、多台从,主提供写操作,从提供读操作。
读写分离的实现:
我们只需要实现读写分离,主从复制数据一般由数据库级来实现同步,当然也可以自己去实现同步,只是需要考虑的点比较多。
分库分表、读写分离总结
1.分区
对业务透明,分区只不过把存放数据的文件分成了许多小块,根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表呢,还是一张表。
2.分表
当数据量大到一定程度的时候,都会导致处理性能的不足,这个时候就没有办法了,只能进行分表处理。
也就是把数据库当中数据,根据按照分库原则分到多个数据表当中,这样,就可以把大表变成多个小表,不同的分表中数据不重复,从而提高处理效率。
3.分库
分表和分区都是基于同一个数据库里的数据分离技巧,对数据库性能有一定提升。但是,随着业务数据量的增加,原来所有的数据都是在一个数据库上的,网络IO及文件IO都集中在一个数据库上的,因此CPU、内存、文件IO、网络IO,都可能会成为系统瓶颈。
当业务系统的数据容量接近或超过单台服务器的容量、QPS/TPS接近或超过单个数据库实例的处理极限等此时,往往是采用垂直和水平结合的数据拆分方法,把数据服务和数据存储分布到多台数据库服务器上。
4.读写分离方案
当数据库读远大于写,查询多的情况,就可以考虑主数据负责写操作,从数据库负责读操作,一主多重,从而把数据读写分离,最后还可以结合redis等缓存来配合分担数据的读操作,大大的降低后端数据库的压力。
以上,是分库分表与读写分离的实现原理的详细解析,欢迎评论区留言交流或拓展。
我是 mikechen | 陈睿 ,关注【mikechen的互联网架构】,10年+BAT架构技术倾囊相授。
本文已同步我的技术博客 www.mikechen.cc,更新至我原创的《30W+字大厂架构技术合集》中。
- 点赞
- 收藏
- 关注作者
评论(0)