主从同步有哪些方式

  • 异步(5.6以前)

  • 半同步(5.6)

  • 增强半同步(5.7)

  • 异步复制的过程

    • master上提交事务后,并且写入binlog,返回事务成功标记;

    • 将binlog发送到slave,转储成relay log;

    • 在slave上再将relay log读取出来应用

  • 半同步复制的过程

    • 首先,master和至少一个slave都要启用semi-sync replicaiton模式

    • 某个slave连接到master时,会主动告知当前自己是否属于semi-sync模式

    • 在master上提交事务后,写入binlog后,还需要通知至少一个slave收到该事务,等待写入relay log并成功刷新到磁盘后,向master发送”slave节点已完成该事物”确认通知

    • master收到上述通知后,才可以真正完成该事物提交,返回事务成功标记

    • 在上述步骤中,当slave向master发送通知时间超过rpl_semi_sync_timeout设定值时,主从关系会从semi-sync模式自动调整成为传统的异步复制模式

  • 增强半同步的改进

    • MySQL5.7 半同步方式默认改为rpl_semi_sync_master_wait_point=AFTER_SYNC

    • 增加ACK线程

    • rpl_semi_sync_master_wait_for_slave_count=N

    • rpl_semi_sync_master_timeout=N

如何保证主从数据一致性

主从复制不一致的原因

  1. 主从复制过程中某个步骤发生crash

  2. 人为造成的主从数据不一致

  3. 设置了ignore/do/rewrite等replication等规则

  4. SQL本身存在不确定因素

  • 定期pt-table-checksum&pt-table-sync校验和修复数据

  • 多节点数据一致性可以考虑PXC方案

  • 传统复制结构上调整如下参数

    • master:innodb_flush_log_at_trx_commit=1&sync_binlog=1

    • slave:master_info_repository=”TABLE”&relay_log_info_repository=”TABLE”&relay_log_recovery=1

    • 解释:确保在slave上和复制相关的元数据表也采用InnoDB引擎,收到InnoDB事务安全的保护,而后一个选项的作用是开启relay log自动修复机制,发生crash时,会自动判断哪些relay log需要重新从master上抓取回来再次应用,以避免部分数据存在丢失的可能性。

MySQL5.7并行复制

  • MySQL5.6的并行复制是基于schema级别的并行复制,然而并没有什么卵用

  • 5.7基于binlog group commit实现多线程复制

  • slave_parallel_type=LOGICAL_LOCK

  • slave_parallel_worker=8