读写分离——为了应对数据库的并发问题

主从

  1. 读写分离基本点:
    1. 一主多从数据库分布
    2. 主从实时同步
    3. 主数据库负责写操作,从数据库负责读操作
  2. 具体实现:
    1. 代理层

image.png
中间件有 MySQL Router(官方)、Atlas(基于 MySQL Proxy)、MaxscaleMyCat

  1. 组件方式(常用)

引入第三方组件来帮助我们读写请求,比如sharding-jdbc jar包

  1. 主从复制原理

MySQL binlog(binary log 即二进制日志文件) 主要记录了 MySQL 数据库中数据的所有变化(数据库执行的所有 DDL 和 DML 语句)
image.png
过程:1.对Master数据库都会被记录在bin log中
2.Slave库请求连接主库,并创建IO线程向主库请求更新的binlog
3.主库开binlog dump线程传递binlog,从库的IO线程负责接收,接收后写入在relay log中
4.从库开SQL线程再次执行relay log中的操作

  1. 阿里开源工具,canal

该工具可以帮助实现 MySQL 和其他数据源比如 Elasticsearch 或者另外一台 MySQL 数据库之间的数据同步。原理就是模拟MySQL主从复制的过程,依赖于binlog。

分库分表——为了分担数据库的存储压力

  1. 分库:将原本在一个数据库中的数据放到多个数据库中
  2. 分表:对单表的数据进行水平拆分或者垂直拆分
  3. 什么时候分?
    1. 单表数据太大,千万级别以上,读写速度缓慢(分表)
    2. 数据库中的数据占用空间太大,备份时间长(分库)
    3. 应用并发量(分库)
  4. 带来的问题
    1. join操作:同一个数据库中的表分布在了不同的数据库中。分库以后导致无法使用join,需要手动进行数据封装
    2. 事务:同一个数据库中的表分布在了不同的数据库中。数据库自带的事务就不管用了
    3. 分布式id:不同的数据节点要生成全局唯一主键,需要分布式id
    4. 成本:DBA参与、更多的数据库服务器
  5. 推荐方案

ShardingSphere 项目(包括 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar)
image.png

  1. 数据迁移:停机迁移、双写方案(借助canal)