MySQL复制相关(持续更新)

一、异步复制

异步复制原理图

after commit
  • master:
    • Dump_Thread,通知IO_Thread数据变更
  • slave:
    • IO_Thread,拉取binlog增量
    • SQL_Thread,SQL逻辑重放

异步复制流程

  1. master 写undo、redo
  2. master 发起commit,写binlog(filename,position)
  3. master 完成提交事务
  4. slave 通过IO_Thread拉取binlog的filename,position,并写入到本地的relaylog中
  5. slave 通过SQL_Thread逻辑重放relaylog中的SQL(单线程)

两种场景

  1. 实时同步(IO_Thread主从没有延迟),写数据之前通知IO_Thread有变更,IO_Thread拉取binlog增量
  2. 主从长时间延迟(全备恢复),IO_Thread直接去主库本地磁盘拉取binlog增量

复制中的坑

  1. row模式下,表最好是有主键,其次要有普通索引。否则sql_thread重放需要全表扫描匹配,速度非常慢(mysql5.7中做了优化)


    sql_thread重放

二、半同步复制(MySQL 5.5 after commit)

半同步复制流程图

after commit

半同步复制流程

  1. master 写undo、redo
  2. master 发起commit,sync binlog(filename,position)
  3. master 存储引擎commit完成
  4. master_sender_thread 等待slave_reciver_thread返回ack(等待过程中会阻塞下一个事务)
  5. master_sender_thread接收到slave_reciver_thread返回的ack,并返回给客户端,客户端才可以继续操作

after带来的三个问题

  1. 性能问题:AFTER_COMMIT半同步是单线程处理的,master把事务发送完毕后,要接受和处理slave的ack应答,处理完ack后才能继续发送下一个事务,对性能影响比较大
  2. master commit完成后才开始等待slave的ACK,其实这个时候在master上事务已经提交完成并且其他客户端已经可以读到,只是提交该事物的客户端处于等待状态。
  3. 如果master等待ack时master crash,而slave又未接收到该事务的话,那么切换到从库后就会出现读取的结果不一致的情况(因为主库已commit而从库未收到该事务binlog)

三、增强半同步复制(MySQL 5.7 after sync)

增强半同步复制流程图

after sync

增强半同步复制流程

  1. master 写undo、redo
  2. master 发起commit,sync binlog(filename,position)
  3. master 通过单独的semisync_reciver_thread等待slave_reciver_thread返回ack,此过程中master_sender_thread可以处理其他事务的请求
  4. semisync_reciver_thread接收到slave_reciver_thread返回的ack,并返回给客户端
  5. master 存储引擎层commit

增强半同步解决的问题

  1. AFTER_SYNC采用双工处理,master采用单独semisync_reciver_thread处理ack应答,不阻塞其他事务,提升性能
  2. AFTER_SYNC等待ack的操作是在引擎层commit之前处理,避免了其他客户端脏读
  3. 在等待ack的期间master crash,由于master引擎层未commit,如果slave未接受到该事务,那么数据是一致的

增强半同步带来的新问题

极端情况:在master sync binlog(写入xid)后,且在发送日志之前,这个时间master crash了。那么slave是没有拿到master的binlog增量的,而master重启后的crash recovery会认为该事务已写到binlog中,然后进行重做。这样就会导致主从不一致

5.7增强半同步配置

  1. master
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
set global rpl_semi_sync_master_enabled=ON;
  1. slave
 install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
  set global rpl_semi_sync_slave_enabled=ON;
  1. 主要参数
  • mster:
    • rpl_semi_sync_master_enabled=ON 表示在master上已经开启半同步复制模式。
    • rpl_semi_sync_master_timeout=10000 该参数默认为10000毫秒,即10秒,可以调整,表示如果主库在某次事务中等待事件超过10秒,则降级为异步复制模式,不再等待slave,如果master探测到slave恢复,则会自动回到半同步模式。
    • rpl_semi_sync_master_wait_no_slave=ON 表示是否允许master每个事务提交后都要等待slave的确认信号,默认是ON,即每一个事务都会等待,如果是OFF,则slave追赶上之后,也不会回到半同步模式。
    • rpl_semi_sync_master_trace_level=32 表示开启半同步复制模式时的调试级别,默认是32
  • slave:
    • rpl_semi_sync_slave_enabled=ON
    • rpl_semi_sync_master_trace_level=32

四、并行复制

并行复制的演变

  • MySQL 5.6 是基于库级别的并行复制(适用于单实例多库而且库之间的写入分布比较平均的情况,比较鸡肋,可以忽略)
  • MySQL 5.7 是基于事务级别的并行复制(主要介绍)
  • MySQL 8.0 是基于行级别的并行复制(太新还没来得及研究,后面补上)

MySQL 5.7基于行的并行复制

原理:
与组提交结合,一个组提交的事务都是可以并行回放,因为这些事务都已进入到事务的prepare阶段,则说明事务之间没有任何冲突(否则就不可能提交)。

复制中的重要参数

  • log-bin = /binlog_dir
  • binlog_format = row
  • binlog_row_image = full //默认full
  • gtid_mode = on
  • enforce_gtid_consistency = on //打开gtid之前必须打开此选项,服务器通过允许仅执行可使用GTID安全记录的语句来强制执行GTID一致性(开启后强制检测gtid一致性,在事务中更改非事务表将会报错)
  • binlog_group_commit_sync_delay = 100 //单位(微秒)。如果不启用组提交,则每次提交一个事务,binlog做一次fsync。如果启用了binlog-group-commit,此时sync_binlog=N代表每N组事务,而不是每N个事务。建议设置sync_binlog=1
  • binlog_group_commit_sync_no_delay_count = 10
  • binlog_order_commit = off //开启后事务提交顺序与binlog顺序一致,默认on,设置为off则事务可并行提交,对数据一致性可能产生影响。如果启用了binlog-group-commit,则设置为off
  • transaction_write_set_extraction = on //8.0特性,5.7默认off
  • binlog_transation_dependency_tracking = COMMIT_ORDER //等同于打开binlog_order_commit,基于行级别并行复制配置成writeset_session
  • binlog_transation_dependency_history_size = 25000 //控制队列长度
  • slave_net_timeout = 20|30 //io_thread超时时间
  • log_slave_updates
  • slave_parallel_type = LOGICAL_CLOCK //从库开启并行复制
  • slave_parallel_type = 4|8
  • slave_preserve_commit_order = on //保证从库提交顺序与主库一致,前置条件log-bin,log_slave_update,slave_parallel_type = LOGICAL_CLOCK
  • slave_rows_search_algorithms = TABLE_SCAN,INDEX_SCAN //配置成INDEX_SCAN,HASH_SCAN,当没主键的表复制中可以用hash索引
  • relay_log_info_reposity = table //crash-safe replication
  • sync_relay_log_info = 1
  • relay_log_recovery = 1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 一、复制架构衍生史 在谈这个特性之前,我们先来看看MySQL的复制架构衍生史。 在2000年,MySQL 3.23...
    张伟科阅读 11,276评论 0 9
  • https://www.cnblogs.com/along21/p/8011596.html https://bl...
    SkTj阅读 3,122评论 1 4
  • mysql主从复制 主从复制慨述 构建大型,高性能应用程序的基础主服务器复制负责更新,且将更新写入二进制日志文件,...
    肖金光xjg阅读 875评论 0 1
  • 这次学习内容中好多提到地球环境,因为想要更多,更富裕,终于威胁到自己赖以生存的地球环境。这点让我想起看过的一...
    严露露阅读 167评论 0 0
  • 唐巧:http://blog.devtang.com/blog/archives/ 王巍:http://www.o...
    苍家有井名为空阅读 628评论 0 2