暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅谈之-MySQL主从复制

原创 张sir 2020-12-25
1176

MySQL同步方式分类

MySQL5.7支持两种数据同步的方法:传统复制、GTID复制。传统复制是在从库change master to时指事务同步的起点(binlog日志位置和position)。GTID复制是通过GTID(全局事务id)自动寻找需要复制的二进制日志记录,会自动跳过已经执行过了事务。
MySQL数据同步的过程是:主库生成binlog日志,通过binlog dump线程将新增的日志传输到从库relay log中,然后由sql线程反向应用日志从而主从数据同步。一般情况下发送日志请求及同步位置的是主库主动同步,但是当主从第一次搭建成功申请主从数据同步时是从库首先向主库发送同步请求及位置信息。I/O thread和sql thread这两个线程在从库上,可以通过show processlist all;查看。

数据同步类型:

异步复制:MySQL默认的数据同步方式,可能会有数据丢失(当某事务主库已提交,但是binlog还没有传输到从库,这时主库发生宕机)
半同步复制:需要额外安装半同步复制的插件,当主库收到一个从库发送的ACK消息(从库以经将数据变化记录在relay log)然后再提交。也可以是收到多个从库的返回信息再提交,由参数rpl_semi_sync_master_wait_for_slave_count控制,默认为1。
延迟复制:从5.6开始支持,可以设置从库故意滞后于主库一段时间
同步复制:保证从节点完全写完后主节点再提交,如:NDB Cluster(一种所有节点均可读写的集群架构)、PXC、MGC、MGR

binlog格式

MySQL的binlog有三种格式:statement、row、mixed
Statement:5.7.7版本之前默认是该模式,binlog记录了整个sql的原始文本,日志量小,但是容易出现数据不一致的现象。
优点:日志量少,包含原始的数据变更语句便于审计。
缺点:一些执行结果不确定的DML语句不能基于其进行复制,自定义函数(UDF)和存储过程执行结构不确定,在DML语句使用order by的limit的主从排序结果不同,使用LOAD_FILE()、UUID()、USER()、SLEEP()、GET_LOCK()等
Row:5.7.7之后默认是该模式,binlog里面记录了所有数据行记录,使用create table … select …语句创建表时,因为会产生两个不同的GTID从而报错,在change master to …时最好不要使用server ID进行过滤
Mixed:在不影响数据一致性的情况下记录statement,影响数据一致性的情况下记录row

GTID复制

GTID(全局事务ID),source_uuid:transaction_id,当设置gtid_mode为on或on_permissive时,gtid会存储在mysql.gtid_executed表中,当bin_log和log_slave_updates被启用时,mysql.gtid_executed表中记录最近一个binlog日志的上一个日志里的gtid。否则该表会实时记录最新的gtid,参数gtid_executed_compression_period设置了mysql.gtid_executed表的压缩率,默认为1000。可以通过global gtid_executed参数查看实时的gtid。当主库执行reset master;时,表gtid_executed会被清零,binlog日志切换。
在change master to语句中默认禁用了master_auto_position,使用gtid数据同步时需要启用该参数并禁用master_log_file和master_log_pos这两个参数。在多源复制中每个复制通道均需指定masterL_log_file参数。从gtid切换到传统模式建议同时指定relaylog相关的参数。Gtid不支持使用sql_slave_skip_counter跳过事务,但可以通过注入空事务的方法跳过事务。

GTID模式的限制:

1.更新操作涉及非事务引擎:在同一个事务中不能同时操作支持事务(innodb)和不支持事务(myisam)的引擎,这样可能导致多个GTID被分配给同一个事务。
2.Create table … select语句:如果binlog时statement模式该语句作为一个整体只分配一个GTID,但是如果时row模式该语句会被分配两个GTID。
3.临时表:当系统变量enforce_gtid_consistency设为ON时,事务、存储过程、存储函数、触发器不支持创建和删除临时表语句,但可以在对象外执行创建和删除临时表需使用自动提交commit=1
4.防止执行不受支持的语句:所有实例均设置参数enforce_gtid_consistency为ON,仅对需要写入binlog日志中的语句强制执行GTID
5.跳过事务:不支持参数sql_slave_skip_counter跳过事务,可以注入空事务
6.忽略server实例:不建议在change master to语句中使用ignore_server_ids来忽略某个server实例的二进制变更,因为GTID会自动忽略以经执行过的GTID。可以通过show slave status\G;中的replicate_ignore_server_ids字段检查是否配置了该项,该字段为空即可。
7.GTID的mysql_update:如果需要对server进行mysql_update则不能启用二进制日志(–write-binlog选项)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论