前言
随着用户量的增多,数据库操作往往会成为一个系统的瓶颈所在,而且一般的系统“读”的压力远远大于“写”,因此我们可以通过实现数据库的读写分离来提高系统的性能。
实现思路
通过设置主从数据库实现读写分离,主数据库负责“写操作”,从数据库负责“读操作”,根据压力情况,从数据库可以部署多个提高“读”的速度,借此来提高系统总体的性能。
主从同步的具体原理:
将主机的数据复制到多个从机(slaves)中,同步过程中,主机将数据库的操作写到二进制日志(binary log)中,从机打开一个io线程,打开和主机的连接,并将主机的更新日志写入从机的中继日志中,从机开一个sql线程读取中继日志中的数据,进行更新,从而保证数据的主从数据的一致。
要解决的问题:
1、主从复制延迟
以 MySQL 为例,主从复制延迟可能达到 1 秒,如果有大量数据同步,延迟 1 分钟也是有可能的。主从复制延迟会带来一个问题:业务服务器将数据写入数据库主服务器立刻进行读取,但此时读操作的的访问时从机,主机还没有将数据复制到从机,所以此时查询会有问题。(比如用户刚进行注册,但是登录的时候却说无此用户)
有以下几种解决方案:
1、根据业务来区分,关键业务的读写全部指向主机,非关键业务采用读写分离
2、加入redis,将redis中数据的过期时间设置为主从延迟的时间,当进行访问时,redis中有数据,则说明主从同步未完成,若redis中无数据则说明主从同步已完成。
2、分配机制
读写分离,怎么实现读写分离呢?怎么知道读哪个数据库呢?一般有两种方式:程序代码封装和中间件封装。
1、程序代码的封装,在代码中抽象出来数据访问层,,实现读写操作分离和数据库服务器连接的管理
为什么不适用缓存?
缓存的使用成本要比从库少非常多;缓存的开发比较容易,大部分的读操作都可以先去缓存,找不到的再渗透到数据库。
当然,如果我们已经运用了缓存,但是读依旧还是瓶颈时,就可以选择“读写分离”架构了。简单来说,我们可以将读写分离看做是缓存都解决不了时的一种解决方案。
其实是数据容量的瓶颈。例如订单表,数据量只增不减,历史数据又必须要留存,非常容易成为性能的瓶颈,而要解决这样的数据库瓶颈问题,“读写分离”和缓存往往都不合适,最适合的是什么呢?
数据库水平切分,也是一种常见的数据库架构,是一种通过算法,将数据库进行分割的架构。一个水平切分集群中的每个数据库,通常称为一个“分片”。每一个分片中的数据没有重合,所有分片中的数据并集组成全部数据。
单库容量最容易成为瓶颈,当单库的容量成为了瓶颈,我们希望提高数据库的写性能,降低单库容量的话,就可以采用水平切分了。