读写分离的原理
读写分离是让主库处理事务性增删改,而从库处理查操作。数据库复制来把事务性操作的数据变更同步到从库。
读写操作有不同的实现方式,往往写操作更耗时,读操作在架构角度则有更多的选择,所以读写分离是架构及系统优化很重要的一种手段。
分区
分区是将持久化数据文件划分成多个小块,根据一定的规则把文件和索引进行分割,分区后的表还是一张表,但是在真是场景中mysql分区使用很少,分区往往用在一些其他大数据中间件下,如hbase,hdfs等,mysql的读解决方案常见的有分表和分库解决方案。
分表
当数据量达到一定程度后,导致处理性能不足,或者如果表中字段冷热数据比较明显,可以采用分表处理。就是把数据字段按照某种分表原则拆分到多个表中,这样可以把大表变成小表,不同小表中数据不重复,从而提高处理效率。
分库
分区和分表是对数据的拆分,对数据库性能有一定的提升,但是当数据发展到一定程度后,单纯的分表无法解决并发请求访问同一个数据库,此时数据库的瓶颈可能到了如网络IO,文件IO,CPU,内存上,这样造成单台服务器的容量,QPS、TPS接近或超过了单个数据库实例处理极限,此时往往采用垂直和水平结合的方式拆分数据,把数据存储服务拆分到多台数据库服务器上。
读写分离架构
主库负责写,从库负责读,一主多从,从而实现读写分离,最后可以依赖其他中间件对于读写两种场景特点进行优化,比如引入redis等缓存中间件或搜索引擎优化查询,引入mq机制优化写操作,降低后端数据库压力。
读写分离实现
分库分表实现方式类似,讲经常访问和不经常访问的字段拆分到不同的库表中。
以水平拆分为例
水平拆分是根据分片算法讲一个库表拆分到多个库表中,如按照ID最后一位对3取余,尾数是1的放到第一个库表,尾数是2的放到第二个库表。