数据库读写分离
- 缘由:对数据库有频繁操作,而写数据本身比读数据更耗时,则可以设计主从数据库复制的方式同步数据,主数据库用来更新数据,从数据库用来查询数据库。
- 以MySql为例,可以基于sql语句复制在从库上执行,或基于行数据的复制,一般会采用两种混合:先默认使用sql复制执行,如果无法精确执行,则使用行数据复制。
- 复制过程:主库在事务完成之前,会记录更新日志(二进制);然后从库启动一个I/O工作线程来读取更新日志(如没有更新,则进入睡眠状态等待),写入中继日志,最后从库中的sql线程读取中继日志,回放在主库中更新的操作,以达到与主库数据保持一致。
- 这种方式既做到数据备份,也做到数据库连接分流(从库可多个),也优化系统性能。
- 实现方式:从代码层实现读写分离,本身编码及维护工作量大,一般考虑使用代理实现(mysql_proxy,Atlas-360,Amoeba-阿里巴巴);
- Spring可通过切面的方式实现读写分离(速度快,支持事物,但不好管理);中间件如Altas也支持事物,也管理方便,只是对性能稍有损耗。
- 适用场景:读操作远远超过写操作更适合;查询允许一定的延迟;