为何要分库分表和读写分离?mysql
相似淘宝网这样的网站,海量数据的存储和访问成为了系统设计的瓶颈问题,日益增加的业务数据,无疑对数据库形成了至关大的负载,同时对于系统的稳定性和扩展性提出很高的要求。随着时间和业务的发展,数据库中的表会愈来愈多,表中的数据量也会愈来愈大,相应地,数据操做的开销也会愈来愈大;另外,不管怎样升级硬件资源,单台服务器的资源(CPU、磁盘、内存、网络IO、事务数、链接数)老是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。分表、分库和读写分离能够有效地减少单台数据库的压力。redis
分库分表的原理和实现算法
1.什么是分区、分表、分库sql
分区数据库
就是把一张表的数据分红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.分库分表中间件
分表又分为单库分表(表名不一样)和多库分表(表名相同),无论使用哪一种策略都还须要本身去实现路由,制定路由规则等,能够考虑使用开源的分库分表中间件,无侵入应用设计,例如淘宝的tddl等。
读写分离的原理和实现
一、什么是读写分离
读写分离,基本的原理是让主数据库处理事务性增、改、删操做(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操做。数据库复制被用来把事务性操做致使的变动同步到集群中的从数据库。
二、为何要读写分离呢?
由于数据库的“写”(写10000条数据到oracle可能要3分钟)操做是比较耗时的。
可是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
因此读写分离,解决的是,数据库的写入,影响了查询的效率。
三、何时要读写分离?
数据库不必定要读写分离,若是程序使用数据库较多时,而更新少,查询多的状况下会考虑使用,利用数据库 主从同步 。能够减小数据库压力,提升性能。固然,数据库也有其它优化方案。memcache 或是 表折分,或是搜索引擎。都是解决方法。
4.主从复制、读写分离的基本设计
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能知足实际需求的。不管是在安全性、高可用性仍是高并发等各个方面都是彻底不能知足实际需求的。所以,经过主从复制的方式来同步数据,再经过读写分离来提高数据库的并发负载能力。
一台主、多台从,主提供写操做,从提供读操做。
读写分离的实现:
咱们只须要实现读写分离,主从复制数据通常由数据库级来实现同步,固然也能够本身去实现同步,只是须要考虑的点比较多。
分库分表、读写分离总结
1.分区
对业务透明,分区只不过把存放数据的文件分红了许多小块,根据必定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表呢,仍是一张表。
2.分表
当数据量大到必定程度的时候,都会致使处理性能的不足,这个时候就没有办法了,只能进行分表处理。也就是把数据库当中数据根据按照分库原则分到多个数据表当中,这样,就能够把大表变成多个小表,不一样的分表中数据不重复,从而提升处理效率。
3.分库
分表和分区都是基于同一个数据库里的数据分离技巧,对数据库性能有必定提高,可是随着业务数据量的增长,原来全部的数据都是在一个数据库上的,网络IO及文件IO都集中在一个数据库上的,所以CPU、内存、文件IO、网络IO均可能会成为系统瓶颈。
当业务系统的数据容量接近或超过单台服务器的容量、QPS/TPS接近或超过单个数据库实例的处理极限等此时,每每是采用垂直和水平结合的数据拆分方法,把数据服务和数据存储分布到多台数据库服务器上。
4.读写分离方案
当数据库读远大于写,查询多的状况,就能够考虑主数据负责写操做,从数据库负责读操做,一主多重,从而把数据读写分离,最后还能够结合redis等缓存来配合分担数据的读操做,大大的下降后端数据库的压力。