MySQL主从复制、读写分离、分库分表

MySQL主从复制、读写分离、分库分表

目录

      • MySQL主从复制、读写分离、分库分表
        • 一、主从复制
          • 1.1 为什么使用主从复制?
          • 1.2 什么是mysql的主从复制?
          • 1.3 主从复制原理
          • 1.4 需要注意的问题
          • 1.5 主从复制可能遇到的问题
          • 1.6 mysqll主从架构
        • 二、读写分离
          • 2.1 如何实现读写分离
        • 三、分库分表
          • 3.1 分库分表方式
            • 3.1.1 水平切分
            • 3.1.2 垂直切分
          • 3.2 分片键

一、主从复制
1.1 为什么使用主从复制?

​ 场景一:在不同的数据库之间进行数据的同步,在分布式、高并发项目中为了减少mysql的压力,会在不同的数据库中进行读或写操作,那么就需要保证两个数据库的数据一致

​ 场景二:当一些写操作需要锁表时,这些数据就不能被其他请求所读取,使用主从复制,让主库负责写,从库负责读,这样,就算主库出现锁表的情况,也会正常读取数据。

1.2 什么是mysql的主从复制?
  • mysql主从复制是指从一个mysql服务器主节点复制到一个或多个从节点
  • mysql默认使用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库的所有数据库或特定的数据库/表。
1.3 主从复制原理
  1. master服务器将数据的改变记录二进制binlog日志,当master上的数据改变时,则将其改变写入二进制日志中
  2. slave服务器会隔一定时间访问master服务器,探测其是否发生了改变,如果发生了改变则会开始一个IO Thread进行请求master的二进制事件
  3. slave服务器会开启dump线程,用于向其发送二进制事件,并保存至slave节点的relay log(中继日志)当中,slave开启SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点保持一致,最后IO Thread和SQL Thread进入睡眠状态,等待下一次被唤醒。
    MySQL主从复制、读写分离、分库分表_第1张图片
1.4 需要注意的问题
  • master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog日志;为了安全起见,slave也开启binlog日志)
  • slave节点开启两个线程,分别是IO线程和SQL线程,IO线程负责读取master节点中的binlog日志到slave节点的relay log(中继节点)中,SQL线程负责读取relay log内容,并更新到slave节点中,保证slave和master节点的一致性
  • mysql主从复制至少开启两个mysql服务,可以部署在两台服务器上,也可以在一台服务器上开启两个服务
  • mysql复制最好保证master和slave节点的版本一致,如果不能满足版本一致,那也要保证master节点的版本低于slave节点的版本
  • master和slave节点的同步需要时间
1.5 主从复制可能遇到的问题
  • 延迟

    • 网络原因:主从复制是在不同机器之间进行的,是需要经过网络传输,若网络有波动,就有可能出现延迟。
    • 效率原因:在Master数据库中,可能有多个线程进行写数据,而Slave数据库中只有一个SQL Thread线程进行写数据,效率不同,可能会造成延迟。

    【注意】:在mysql5.7之后,mysql使用MTS之后,延迟问题基本不会存在。

1.6 mysqll主从架构
  • 一主一从

    ​ 只能从slave节点同步master节点的数据,适合读写分离的场景,master节点负责写操作,slave节点负责读操作。

    ​ 但是一主一从的的缺点也很大,当有一台服务器宕机之后,这个系统就不能进行读或写操作,系统就会瘫痪,所以一般不会使用一主一从的结构。
    MySQL主从复制、读写分离、分库分表_第2张图片

  • 主主复制

    ​ 两台服务器之间互为主/从,当两台服务器同时支持读写操作时,要使两台服务器保持数据一致,那么就需要主主复制的结构。

    ​ 如果有一台服务器宕机了,那么另外一台服务器可以进行读和写的操作,不会影响。
    MySQL主从复制、读写分离、分库分表_第3张图片

  • 一主多从

    ​ 一般在读写分离的场景下,都是读多写少,那么master节点用来写,可以开多个slave节点来读。
    MySQL主从复制、读写分离、分库分表_第4张图片

  • 多主一从

    ​ 在写操作比较多的场景下,那么就会使用多主一从。
    MySQL主从复制、读写分离、分库分表_第5张图片

  • 联级复制

    ​ 为了做好数据的备份,通常会使用联级复制,即主从+从从
    MySQL主从复制、读写分离、分库分表_第6张图片

二、读写分离

​ 在大部分的公司业务中,写数据的场景比较少,而读数据的场景比较多,那么就会在一个服务器上专门写数据,另外一个服务器上专门读数据,这样也会解决因为写操作而造成的无法读数据(例:写数据锁住了整张表,无法读数据)

​ 通常会用到一主一从(基本不使用)、一主多从的架构。

2.1 如何实现读写分离

​ 在读写分离场景下,一个mysql写/读请求进来之后,会通过mysql Proxy进行分发给不同的mysql服务器。目前mysql Proxy有mycat、shardingsphere。

三、分库分表
3.1 分库分表方式
3.1.1 水平切分

​ 顾名思义,一张表水平切一刀,一部分数据在这个库中,另外一部分数据在另外一个库当中。

3.1.2 垂直切分

​ 顾名思义,一张表垂直切一刀,这个表的一部分字段在这个库,另外一些字段在另外一个库中。

​ 在实际业务当中,将热数据放到一张表中,冷数据放另外一张表中,需要联合查询时就进行联合。

3.2 分片键

​ 当表切分之后,分了不同的范围,有一个查询sql,如何知道查询的是哪个范围的数据,一般分片键会包含在条件之内。

​ 当查询sql中没有分片键时,那么mysql会轮询进行查询,效率就会大幅度降低,所以尽可能加上分片键。

你可能感兴趣的:(java,mysql,数据库,服务器)