数据访问层:分库分表与读写分离

分库分表

  • 垂直切分
    把数据库中不同的业务数据拆分到不同的数据库中。
  • 水平切分
    把同一张表中的数据拆分到两个数据库中。

  • 固定哈希
    规则简单,但是扩容时不方便,涉及大量的数据迁移。

  • 一致性哈希

读写分离

读写分离的目的是分担主库读的压力(对于数据量大并不起作用),但这里存在一个数据复制的问题。
这里有几种解决方案:
基于数据库的日志进行分库分表。
对数据做平滑迁移!

很多数据库中间件都会提供读写分离、负载均衡、安全认证、连接池等功能。这里以百度的DBproxy中读写分离为例简单介绍:
DBproxy为应用提供读写分离服务,读请求走从库,写请求走主库。
判断读写请求的方法如下:以select、show、use、explain、desc、set(不包括set auto_commit=0)等开头的,确定不会修改数据的sql,判断为读请求。
非读请求的sql均判断为写请求,包括事务。
读写分离的具体策略:

  1. 基本原则是读请求发送到从库,写请求发送到主库。
  2. 为了避免主从延迟带来的读不到刚刚更新的数据的问题,同一会话中,写请求结束后指定时间内的读请求也发到主库,此时间可配,由write_time_interval参数指定。如果此时间内没有新的写请求,则会话回到从库。
  3. 事务内的sql不进行读写分离,全部发到主库。
  4. DBProxy会缓存影响会话状态的sql命令,当同一个客户端会话对应的mysql切换时,会在切换后的mysql上回放这些缓存的sql命令,以保证客户端会话的一致性。影响会话状态的sql包括use命令和set命令。

你可能感兴趣的:(数据访问层:分库分表与读写分离)