分库分表
- 垂直切分
把数据库中不同的业务数据拆分到不同的数据库中。 水平切分
把同一张表中的数据拆分到两个数据库中。固定哈希
规则简单,但是扩容时不方便,涉及大量的数据迁移。- 一致性哈希
读写分离
读写分离的目的是分担主库读的压力(对于数据量大并不起作用),但这里存在一个数据复制的问题。
这里有几种解决方案:
基于数据库的日志进行分库分表。
对数据做平滑迁移!
很多数据库中间件都会提供读写分离、负载均衡、安全认证、连接池等功能。这里以百度的DBproxy中读写分离为例简单介绍:
DBproxy为应用提供读写分离服务,读请求走从库,写请求走主库。
判断读写请求的方法如下:以select、show、use、explain、desc、set(不包括set auto_commit=0)等开头的,确定不会修改数据的sql,判断为读请求。
非读请求的sql均判断为写请求,包括事务。
读写分离的具体策略:
- 基本原则是读请求发送到从库,写请求发送到主库。
- 为了避免主从延迟带来的读不到刚刚更新的数据的问题,同一会话中,写请求结束后指定时间内的读请求也发到主库,此时间可配,由write_time_interval参数指定。如果此时间内没有新的写请求,则会话回到从库。
- 事务内的sql不进行读写分离,全部发到主库。
- DBProxy会缓存影响会话状态的sql命令,当同一个客户端会话对应的mysql切换时,会在切换后的mysql上回放这些缓存的sql命令,以保证客户端会话的一致性。影响会话状态的sql包括use命令和set命令。