MySQL复制相关(持续更新)

2018-08-05  本文已影响58人  Hz37

一、异步复制

异步复制原理图

after commit

异步复制流程

  1. master 写undo、redo
  2. master 发起commit,写binlog(filename,position)
  3. master 完成提交事务
  4. slave 通过IO_Thread拉取binlog的filename,position,并写入到本地的relaylog中
  5. slave 通过SQL_Thread逻辑重放relaylog中的SQL(单线程)

两种场景

  1. 实时同步(IO_Thread主从没有延迟),写数据之前通知IO_Thread有变更,IO_Thread拉取binlog增量
  2. 主从长时间延迟(全备恢复),IO_Thread直接去主库本地磁盘拉取binlog增量

复制中的坑

  1. row模式下,表最好是有主键,其次要有普通索引。否则sql_thread重放需要全表扫描匹配,速度非常慢(mysql5.7中做了优化)


    sql_thread重放

二、半同步复制(MySQL 5.5 after commit)

半同步复制流程图

after commit

半同步复制流程

  1. master 写undo、redo
  2. master 发起commit,sync binlog(filename,position)
  3. master 存储引擎commit完成
  4. master_sender_thread 等待slave_reciver_thread返回ack(等待过程中会阻塞下一个事务)
  5. master_sender_thread接收到slave_reciver_thread返回的ack,并返回给客户端,客户端才可以继续操作

after带来的三个问题

  1. 性能问题:AFTER_COMMIT半同步是单线程处理的,master把事务发送完毕后,要接受和处理slave的ack应答,处理完ack后才能继续发送下一个事务,对性能影响比较大
  2. master commit完成后才开始等待slave的ACK,其实这个时候在master上事务已经提交完成并且其他客户端已经可以读到,只是提交该事物的客户端处于等待状态。
  3. 如果master等待ack时master crash,而slave又未接收到该事务的话,那么切换到从库后就会出现读取的结果不一致的情况(因为主库已commit而从库未收到该事务binlog)

三、增强半同步复制(MySQL 5.7 after sync)

增强半同步复制流程图

after sync

增强半同步复制流程

  1. master 写undo、redo
  2. master 发起commit,sync binlog(filename,position)
  3. master 通过单独的semisync_reciver_thread等待slave_reciver_thread返回ack,此过程中master_sender_thread可以处理其他事务的请求
  4. semisync_reciver_thread接收到slave_reciver_thread返回的ack,并返回给客户端
  5. master 存储引擎层commit

增强半同步解决的问题

  1. AFTER_SYNC采用双工处理,master采用单独semisync_reciver_thread处理ack应答,不阻塞其他事务,提升性能
  2. AFTER_SYNC等待ack的操作是在引擎层commit之前处理,避免了其他客户端脏读
  3. 在等待ack的期间master crash,由于master引擎层未commit,如果slave未接受到该事务,那么数据是一致的

增强半同步带来的新问题

极端情况:在master sync binlog(写入xid)后,且在发送日志之前,这个时间master crash了。那么slave是没有拿到master的binlog增量的,而master重启后的crash recovery会认为该事务已写到binlog中,然后进行重做。这样就会导致主从不一致

5.7增强半同步配置

  1. master
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
set global rpl_semi_sync_master_enabled=ON;
  1. slave
 install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
  set global rpl_semi_sync_slave_enabled=ON;
  1. 主要参数

四、并行复制

并行复制的演变

MySQL 5.7基于行的并行复制

原理:
与组提交结合,一个组提交的事务都是可以并行回放,因为这些事务都已进入到事务的prepare阶段,则说明事务之间没有任何冲突(否则就不可能提交)。

复制中的重要参数

上一篇 下一篇

猜你喜欢

热点阅读