读写分离
读写分离的基本原理是将数据库读写操作分散到不同的节点上。
读写分离适用单机并发无法支撑并且读的请求更多的情形。在单机数据库情况下,表上加索引一般对查询有优化作用却影响写入速度,读写分离后可以单独对读库进行优化,写库上减少索引,对读写的能力都有提升,且读的提升更多一些。
不适用的情况:
1)如果并发写入特别高,单机写入无法支撑,就不适合这种模式。
2)通过缓存技术或者程序优化能够满足要求
读写分离的基本实现是:
1)数据库服务器搭建主从集群,一主一从,一主多从都可以
2)数据库主机负责写操作,从机负责读操作
3)数据库主机通过复制将数据同步到数据库从机,每台数据库服务器都存储了所有的业务数据
4)业务服务器将写操作发给数据库主机,将读操作发给数据库从机
但有两个细节点引入了复杂度:主从复制延时和分配机制,以下为解决方案
复制延时:
1)写操作后的读操作指定发给数据库主机
2)读从机失败后再度一次主机
3)关键业务读写操作全部指向主机,非关键业务采用读写分离
分配机制:
将读写操作区分开来,然后访问不同的数据库,一般有两种方式:程序代码封装和中间件封装
分库分表
分库分表会带来很多复杂度。在引入分库分表之前,应该是这些操作依次尝试:
1.做硬件优化,例如从机械硬盘改成使用固态硬盘,当然固态硬盘不适合服务器使用,只是举个例子
2.先做数据库服务器的调优操作,例如增加索引,oracle有很多的参数调整;
3.引入缓存技术,例如Redis,减少数据库压力
4.程序与数据库表优化,重构,例如根据业务逻辑对程序逻辑做优化,减少不必要的查询;
5.在这些操作都不能大幅度优化性能的情况下,不能满足将来的发展,再考虑分库分表,也要有预估性
分库
业务分库是指按照业务模块将数据分散到不同的数据库服务器。
存在问题:
1)join问题
2)事务问题
3)成本问题
分表
分两种方式:垂直分表、水平分表
水平分表:
水平分表后,某条数据具体属于哪个子表,需要增加路由算法进行计算,这个算法会引入一定的复杂性。
常见的路由算法有:
1)范围路由
2)hash路由
3)配置路由
其他常见的复杂性问题:join,count,order by等