一、复制框架

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

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. maven依赖有一个步长原则 如果a 对 b和c都有依赖 如果b的步长近则使用b的

    maven依赖有一个步长原则 如果a 对 b和c都有依赖 如果b的步长近则使用b的

  2. LOJ116 有源汇有上下界最大流(上下界网络流)

    考虑有源汇上下界可行流:由汇向源连inf边,那么变成无源汇图,按上题做法跑出可行流.此时该inf边的流量即为原图中该可行流的流量.因为可以假装把加上去的那些边的流量放回原图. 此时再从原来的源向原来的 ...

  3. HDU4403-模拟、数学

    一道很难的奥数题,给出一个数字串,插入加号和等号使之成立.求成立的算式数. 我的做法是,先分成两段,中间插入等号 ,再分别求出左右两边可能的值和个数,然后对比,把值相等的情况乘起来,加到最终结果上. ...

  4. day27 多继承 super 详细用法

    # 没有使用super的时候的多继承,如果父类的名字变了.或者有什么更改,需要全部都一起改 class FooParent: def bar(self, message): print(message ...

  5. 洛谷P2257 YY的GCD

    今日份是数论 大概是..从小学奥数到渐渐毒瘤 那就简单列一下目录[大雾 同余 质数密度 唯一分解定理 互质 完全剩余系 简化剩余系 欧拉函数 逆元 斐蜀定理 阶(及其性质) 欧拉定理 费马小定理 原根 ...

  6. BZOJ 4212: 神牛的养成计划

    4212: 神牛的养成计划 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 142  Solved: 30[Submit][Status][Discus ...

  7. [luogu4513]小白逛公园

    题目描述 在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公园打了分-.-.小新 ...

  8. 洛谷 P2057 [SHOI2007]善意的投票 解题报告

    P2057 [SHOI2007]善意的投票 题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照 ...

  9. 安装 Minio服务

    #MINIO SERVER Minio是在Apache License v2.0下发布的对象存储服务器.它与Amazon S3云存储服务兼容. 它最适合存储非结构化数据,如照片,视频,日志文件,备份和 ...

  10. Win10删除anaconda重装

    1.找到anaconda安装的文件夹,找到Uninstall-Anaconda.exe,左键双击运行: 2.然后就按照提示开始卸载,会看到如下: 就会卸载完了,然后你就会发现anaconda所在的文件 ...