数据库的读写分离

来源:互联网 发布:直到世界的尽头知乎 编辑:程序博客网 时间:2024/03/29 22:29

一般来说,我们web应用的数据库都是读多写少。为了保证数据库的读写速度,我们可以采用读写分离的方案。

简单来说,有一个(或多个)主库,主库负责数据库的写操作(insert, update, delete),有一个(或多个)从库,从库负责数据库的读操作(select)

这样我们需要保证的是:

1. 主从库的数据一致

2. 主库只负责写数据

3. 从库只负责读数据


实现读写分离的方法一般有如下几种

1. 硬编码:将读写分离的逻辑写入到业务代码中,由应用层开发程序员来实现读写分离。

这样的缺点是无法动态更换数据源,比如有一台从库服务器宕机了,只能修改代码并重启web服务器才能更换数据源,这会导致我们的网站一定时间内无法访问


2.使用中间件来实现读写分离

这样的好处是不需要应用层开发关注读写分离,无需修改源程序;另外也可以动态更换数据源而无需重启服务器

缺点是程序依赖于中间件,会导致切换数据库变得困难;另外由中间件做了中转代理,性能有所下降;


3.用Spring基于应用层实现

原理:



在进入Service之前,使用AOP来做出判断,是使用写库还是读库,判断依据可以根据方法名判断,比如说以query、find、get等开头的就走读库,其他的走写库。


另外:如果1主多从,假设主数据库故障或者某台从数据库故障,该如何?

答:可以考虑用nginx或者haproxy直接负载均衡到多个从mysql上,nginx和haproxy默认就都有故障移除的功能,主数据库也可以采用双主模式但是一台不工作,用keepalived关联两台服务器,一台主故障直接切换到另一台主上面,这个时候所有的从数据库也需要做切换

原创粉丝点击