主从同步有哪些方式
异步(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
如何保证主从数据一致性
主从复制不一致的原因
主从复制过程中某个步骤发生crash
人为造成的主从数据不一致
设置了ignore/do/rewrite等replication等规则
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