一、为什么需要分库分表、读写分离?
随着数据库里表的数据量不断增大,查询所需的时间就会越来越长;另外,由于MySQL会对更改表的操作加锁,会阻塞其他操作。
所以从两方面考虑,对于数据量的问题,用分库分表解决;对于写操作会阻塞后续读操作,用读写分离解决。
用merge存储引擎来实现分表,不需要改动代码。做到读写分离,就需要使用MySQL提供的主从机制。在数据量非常非常大的情况下,可以采用分区理念,分为垂直和水平分区。
二、数据库分表
垂直划分和水平划分
- 垂直切分---分模块使用字段不同的而划分不同字段结构的表;
- 水平切分---分同一个模块下的多个结构相同的子表
2.1 垂直划分
把不同功能,不同使用频率的数据列分别放到不同的表中,但是如果同一个模块的数据量太大就会存在性能瓶颈
例如,把常用的字段放一个表,不常用的放一个表,把字段比较大的比如text的字段拆出来放一个表里面使用的话是根据具体业务来拆,查询时使用多表联查,可以再配合redis存储。
2.2 水平划分
垂直切分解决不了大表的瓶颈,如果同一个功能中表的数据量过大,就要对该表进行切分,为水平切分。例如,用户表user分为 user_1 , user_2分别存储男用户和女用户
三、数据库分库
3.1 垂直划分
基本的思路就是按照业务模块来划分出不同的数据库,而不是像早期一样将所有的数据表都放到同一个数据库中。例如,商场订单模块放主机1中数据库, 商品模块放主机2中数据库
3.2 水平划分
水平分库方式主要根据数据属性(如商品所属地市, 种类)拆分物理数据库,从而解决单库中数据量过大IO密集的问题。
四、读写分离和主从复制
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。
读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。
MySQL读写分离一般通过中间件实现:
- mysql_proxy:mysql_proxy是MySQL的一个开源项目,通过其自带的lua脚本进行sql判断。
- Atlas:是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。
- Amoeba:阿里巴巴开发。