一、复制框架

开始接触复制时,看到各种各样的复制,总想把不同类型对应起来,结果越理越乱~
究其原因就是对比了不同维度的属性,不同维度得出的结果集之间必然存在交集,没有必要将不同维度的属性安插到成对的萝卜与坑

MySQL复制框架
Replication Methods
Binary Log File Position Based Replication(Traditional)
Global Transaction Identifiers Based Replication(GTID)
Synchronization Types
Asynchronous Replication:默认是异步复制
Semisynchronous Replication:半同步(AFTER_COMMIT)、增强半同步(AFTER_SYNC)
Synchronous Replication:MySQL Group Replication 、MGR和PXC的区别
Replication Formats
Statement-Based Replication(SBR,<5.7.7默认)
Row-Based Replication(RBR,>=5.7.7默认)
Mixed-Based Replication(MBR)
复制原理
复制线程:Dump_Thread、IO_Thread、SQL_Thread
GTID原理:构成、gtid_executed表如何写入及压缩、GTID Limit、GTID和传统复制切换(>=5.7.6支持在线切换)
复制监控管理
复制中断处理:(duplicate-key)、(no-key-found)、(data-type-convert)
复制延迟排查:show slave status\G结果解读、判断复制是否有延迟、通过SQL_Thread定位执行的操作
复制结构调整:增加/删减节点、提升/降低节点的角色
Binlog Server:利用mysqlbinlog命令备份远程的Binlog
数据一致性校验:主从数据为什么不一致、什么时间需要校验数据、pt-table-checksum、pt-table-sync
其他
Multi-Threaded Slave(>=5.6.):.6基于库级别DATABASE,5.7.2支持库级别和事务级别LOGICAL_CLOCK
Delayed Replication(>=5.7):做误操作恢复、测试系统在存在滞后时的行为、检查很久以前数据库的状态
Multi-Source Replication(>=5.7.):集中备份、数据分析聚合、分片数据合并
Replication Filter:5.7.3开始可以动态更改从库的过滤规则

二、知其所以然

1、主从结构的瓶颈点是什么?
• sql_thread单线程
• 对于没有缓存热点数据的从库,大部分DML操作需从磁盘读数据到内存,更新后再刷新到磁盘,需要经过读磁盘、写undo、写redo、写binlog、写数据文件等过程
2、row格式下从库是如何应用主库上的更新?
• 有主键/非空唯一索引,只需匹配主键/非空唯一索引即可,其他列的数据是否一致不作校验
• 有其他二级索引,通过二级索引找到对应记录,然后匹配所有列是否与更新前主库上的列一致
• 没有索引,全表扫描匹配记录
因此,在没有主键/非空唯一索引的情况下,需要匹配所有的列来确定是否是同一条记录
3、为什么建议从库开启log_slave_updates?
• 从库开启log_bin(本身操作记录binlog)+log_slave_updates(复制操作记录binlog),那么binlog会记录所有的操作,可以用其做备份,做级联复制的中间节点
• 如果从库没有开启log_slave_updates,从库应用relay-log中的每个事务会执行一个insert...mysql.gtid_executed操作;如果开启了log_bin,在binlog发生rotate(flush binary logs/达到max_binlog_size)或者关闭服务时,会把所有写入到binlog中的Gtid信息写入到mysql.gtid_executed表
4、半同步/增强半同步复制主从会不会存在延迟?
会。半同步/增强半同步复制只保证relay log在从库写入并刷盘,并不管sql_thread是否已应用relay log,因此会存在延迟现象。
5、show master status 从哪里读的数据?
show master status/show slave status中的Executed_Gtid_Set取自@@global.gtid_executed
扩展阅读:gtid_executed和gtid_purged变量是如何初始化的为什么还原innobackupex备份后查看到的Executed_Gtid_Set与xtrabackup_binlog_info不一致
6、show slave status 从哪里读的数据?
show slave status从内存中读出来的。 如果slave_relay_log_info基于Innodb表,两者是一致的。如果基于非事务表,默认配置很有可能是不一致的。如果需要一致可以通过修改sync_relay_log_info=1
扩展阅读:FAQ: show slave status从哪里读的数据
7、sql_slave_skip_counter跳过一个事务?
sql_slave_skip_counter以event为单位skip,直到skip完第N个event所在的event group才停止。对于事务表,一个event group对应一个事务,一个事务可以包含多个DML操作;对于非事务表,一个event group对应一个DML操作。一个DML操作包含多个events。
对于1032、1062错误尽量修补数据,让复制进程在从库应用变更
扩展阅读:跳过复制错误——sql_slave_skip_counter
8、pt-table-checksum 3.0.4/3.0.9检测不出主从差异?
使用以往的pt-table-checksum参数选项,在主从不一致的情况下,检测不出差异。原以为工具有bug,却不曾发现工具提供对应的参数选项~.~
其实可以在命令行带上--set-vars binlog_format='statement'
扩展阅读:pt-table-checksum检测不出主从差异处理
9、relay-log获取数据
传统复制环境,slave在relay_log_recovery=1 && relay_log_purge=0的情况下
开启relay-log自动修复机制,发生crash时根据relay_log_info中记录的已执行的binlog位置从master上重新抓取回来再次应用,以此避免部分数据丢失的可能性
由于崩溃或停止MySQL时,SQL_Thread可能没有执行完全部的relay-log,最后一个relay-log中的一部分数据会被重新获取到新的relay-log文件中。当relay_log_purge=0时,旧relay-log不会被purge,也就是说,这部分数据重复存在于新旧relay-log。在MHA中,如果此实例选作Latest Slave,那么其他slave通过relay-log补偿差异数据时就可能会报错~
启用GTID复制模式,建议设置relay_log_recovery=0,从库使用GTID SET范围向主库请求binlog;未启用GTID复制模式,一定要设置relay_log_recovery=1,否则从库崩溃恢复后容易出现I/O线程找不到正确位置的问题
扩展阅读:MHA-Failover可能遇到的坑

MySQL复制框架的更多相关文章

  1. MYSQL复制

    今天我们聊聊复制,复制对于mysql的重要性不言而喻,mysql集群的负载均衡,读写分离和高可用都是基于复制实现.下文主要从4个方面展开,mysql的异步复制,半同步复制和并行复制,最后会简单聊下第三 ...

  2. 31.Mysql复制

    31.Mysql复制复制是指将主数据库的DDL和DML操作通过二进制日志传到从数据库上,然后在从数据库上对重做日志,从而使从库与主库保持同步.Mysql支持一台主库同时向多台从库复制,从库也可以作为其 ...

  3. 详解mysql复制机制--异步复制,半同步复制和并行复制

    图4 那么如何并行化,并行IO线程,还是并行SQL线程?其实两方面都可以并行,但是并行SQL线程的收益更大,因为SQL线程做的事情更多(解析,执行).并行IO线程,可以将从Master拉取和写Rela ...

  4. 浅析MySQL复制

    MySQL的复制是基于binlog来实现的. 流程如下 涉及到三个线程,主库的DUMP线程,从库的IO线程和SQL线程. 1. 主库将所有操作都记录到binlog中.当复制开启时,主库的DUMP线程根 ...

  5. [MySQL Reference Manual] 24 MySQL sys框架

    24 MySQL sys框架 24 MySQL sys框架 24.1 sys框架的前提条件 24.2 使用sys框架 24.3 sys框架进度报告 24.4 sys框架的对象 24.4.1所有sys下 ...

  6. MySQL复制环境(主从/主主)部署总结性梳理

    Mysql复制概念说明Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves) ...

  7. mysql复制一列到另一列

    mysql复制一列到另一列   UPDATE 表名 SET B列名=A列名 需求:把一个表某个字段内容复制到另一张表的某个字段. 实现sql语句1: 复制代码代码如下: UPDATE file_man ...

  8. MySQL 复制介绍及搭建

    MySQL复制介绍 MySQL复制就是一台MySQL服务器(slave)从另一台MySQL服务器(master)进行日志的复制然后再解析日志并应用到自身,类似Oracle中的Data Guard. M ...

  9. 转mysql复制主从集群搭建

    最近搭了个主从复制,中间出了点小问题,排查搞定,记录下来 1环境:虚拟机:OS:centos6.5Linux host2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 ...

随机推荐

  1. sorted 返回字典的所有键

  2. Java中浮点型数据Float和Double进行精确计算的问题

    Java中浮点型数据Float和Double进行精确计算的问题 来源  https://www.cnblogs.com/banxian/p/3781130.html 一.浮点计算中发生精度丢失     ...

  3. 【POJ 2823】Sliding Window(单调队列/堆)

    BUPT2017 wintertraining(16) #5 D POJ - 2823 题意 给定n,k,求滑窗[i,i+k-1]在(1<=i<=n)的最大值最小值. 题解 单调队列或堆. ...

  4. 自学Zabbix12.4 Zabbix命令-zabbix_sender

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix12.4 Zabbix命令-zabbix_sender 1. zabbix_sen ...

  5. 添加AD RMS role时,提示密码不能被验证The password could not be validated

    "The password could not be validated" when attempting to provision an AD RMS server. Sympt ...

  6. 【转】CPU上下文切换的次数和时间(context switch)

    http://iamzhongyong.iteye.com/blog/1895728 什么是CPU上下文切换? 现在linux是大多基于抢占式,CPU给每个任务一定的服务时间,当时间片轮转的时候,需要 ...

  7. Android 自定义ImageView支持缩放,拖拽,方便复用

    今天刚发了一篇关于ImageView的缩放和拖拽的博客,然后我想了下,将他自定义下,方便我们来复用这个imageView,效果我就不多说了,http://blog.csdn.net/xiaanming ...

  8. P1274 魔术数字游戏 naive搜索+剪枝

    真的naive...... 我把所有能剪的枝都剪了才过的.否则就是TTT 还有个很神奇的事:数组作为参数传进递归函数时会造成上一层函数里的数组的改变.这个我TM调了一天. 下面奉上代码 #includ ...

  9. 我们一起来详细的了解react的语法以及组件的使用方法

    jsx的介绍 React 使用 JSX 来替代常规的 JavaScript. JSX 是一个看起来很像 XML 的 JavaScript 语法扩展. jsx的优点 JSX 执行更快,因为它在编译为 J ...

  10. csp20140904最优配餐_Solution

    Solution 经典bfs,所有的点到店的最短距离 其中一开始队列的长度为店的数目 一个点可能有多个订单 关于数据大小: 1.1000*(1000*1000)*2000=2,0000,0000,00 ...