为什么要读写分离
在应用的用户访问量比较低的时候,一个数据库的读写能力是完全能够胜任的。但是在用户访问量增大的时候,数据库I/O就会成为瓶颈,解决数据库I/O瓶颈可以有两种方式:
- 增加数据库缓存,如memche、Redis,数据库的读写先操作缓存,然后再持久化到数据库;
- 数据库主从备份,进行读写分离;
通过对用户访问的数据分析,一定是读数据库的量要远远大于写数据库的量,这时读就成为瓶颈,而读写的可靠性级别也是不一样的,写的可靠性要求会更高,针对读写的不同的要求,进行数据库的读写分离。
如何实现主从同步
半同步复制:主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。
并发复制:指的是从库开启多个线程,并行读取relay log中不同库的日志,然后并行重放不同库的日志。
读写分离存在哪些问题及解决方法
由于主从同步是异步的,存在不一致的情况,因此会产生一些问题。
问题1
用户注册成功后,需要进行登录操作,注册是写 操作,登录是读操作,如果此时从库还没有用户的注册信息,那么用户登录会失败。
解决方法:
这个问题可以在业务层进行处理,注册成功之后,马上登录的,访问主库;
这个问题也可以在访问从库失败之后,访问主库进行验证;
问题2
用户修改密码成功后,需要进行登录操作,修改是写 操作,登录是读操作,如果此时从库还没有更新用户的信息,那么用户登录会失败。
解决方法:
此时从库的数据没有更新,如果用户登录会出现失败。可以在业务逻辑层进行处理,当用户密码修改后,在缓存中新增一条Id记录,记录用户的最新信息,并设置过期时间,每次请求的时候,先从缓存读取信息,如果没有在缓存读到,则到从库读取。