MySQL主备复制原理
MySQL master 将数据变更写⼊⼆进制⽇志( binary log, 其中记录叫做⼆进制⽇志事件binary log events,可以通过 show binlog events 进⾏查看)MySQL slave 将 master 的 binary log events 拷贝到它的中继⽇志(relay log)MySQL slave 重放 relay log 中事件,将数据变更反映它⾃⼰的数据canal ⼯作原理
canal 模拟 MySQL slave 的交互协议,伪装⾃⼰为 MySQL slave ,向 MySQL master 发送dump 协议MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )canal 解析 binary log 对象(原始为 byte 流)MySql-Binlog协议详解-流程篇
MySql-Binlog在MySql主从不同⽅⾯发挥着不可或缺的作⽤,同时我们也能通过Binlog实时监控数据的变化。本系列就讲述了怎样接收并解析Binlog。本篇就主要对接收binlog的流程做了⼀下探讨。
Binlog发送接收流程,流程如下图所⽰:
(1)第⼀步和上篇blog⼀样,通过HandShake协议进⾏Client和DB的握⼿认证 (2)握⼿成功以后,Client对DB发送show master status命令,此命令中回带回当前最新binlog存储在哪个⽂件,以及对应哪个偏移量。如果想从当前开始接收binglog,则在后⾯发送binlog dump命令的时候⽤这两个值就好。
(3)发送show global variables like 'binlog_checksum'命令,这是由于binlog event发送回来的时候需要,在最后获取event内容的时候,会增加4个额外字节做校验⽤。mysql5.6.5以后的版本中binlog_checksum=crc32,⽽低版本都是binlog_checksum=none。如果不想校验,可以使⽤set命令设置set binlog_checksum=none(4)最后终于到了发送Dump命令的阶段MySql-Binlog-Dump命令Dump命令包图如下所⽰:
如上图所⽰,在报⽂中塞⼊binlogPosition和binlogFileName即可让master从相应的位置发送binlog eventMySql-Binlog-Event
⼀但发送了BinlogDump命令,master就会在数据库有变化的源源不断的推送binlog event到client。值得注意的是binlog的类型有三种:(1)Statement:每⼀条会修改数据的sql都会记录在binlog中。
(2)Row:不记录sql语句上下⽂相关信息,仅保存哪条记录被修改。(3)Mixedlevel:以上两种Level的混合。⼀.Mysql Binlog格式介绍
Mysql binlog⽇志有三种格式,分别为Statement,MiXED,以及ROW!1.Statement:每⼀条会修改数据的sql都会记录在binlog中。
优点:不需要记录每⼀⾏的变化,减少了binlog⽇志量,节约了IO,提⾼性能。(相⽐row能节约多少性能与⽇志量,这个取决于应⽤的SQL情况,正常同⼀条记录修改或者插⼊row格式所产⽣的⽇志量还⼩于Statement产⽣的⽇志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产⽣⼤量⽇志,因此在考虑是否使⽤ROW格式⽇志时应该跟据应⽤的实际情况,其所产⽣的⽇志量会增加多少,以及带来的IO性能问题。)
缺点:由于记录的只是执⾏语句,为了这些语句能在slave上正确运⾏,因此还必须记录每条语句在执⾏的时候的⼀些相关信息,以保证所有语句能在slave得到和在master端执⾏时候相同 的结果。另外mysql 的复制,像⼀些特定函数功能,slave可与master上要保持⼀致会有很多相关问题(如sleep()函数, last_insert_id(),以及user-definedfunctions(udf)会出现问题).
使⽤以下函数的语句也⽆法被复制:* LOAD_FILE()* UUID()* USER()
* FOUND_ROWS()
* SYSDATE() (除⾮启动时启⽤了 --sysdate-is-now 选项)同时在INSERT ...SELECT 会产⽣⽐ RBR 更多的⾏级锁2.Row:不记录sql语句上下⽂相关信息,仅保存哪条记录被修改。
优点: binlog中可以不记录执⾏的sql语句的上下⽂相关的信息,仅需要记录那⼀条记录被修改成什么了。所以rowlevel的⽇志内容会⾮常清楚的记录下每⼀⾏数据修改的细节。⽽且不会出现某些特定情况下的存储过程,或function,以及trigger的调⽤和触发⽆法被正确复制的问题
缺点:所有的执⾏的语句当记录到⽇志中的时候,都将以每⾏记录的修改来记录,这样可能会产⽣⼤量的⽇志内容,⽐如⼀条update语句,修改多条记录,则binlog中每⼀条修改都会有记录,这样造成binlog⽇志量会很⼤,特别是当执⾏alter table之类的语句的时候,由于表结构修改,每条记录都发⽣改变,那么该表每⼀条记录都会记录到⽇志中。3.Mixedlevel: 是以上两种level的混合使⽤,⼀般的语句修改使⽤statment格式保存binlog,如⼀些函数,statement⽆法完成主从复制的操作,则采⽤row格式保存binlog,MySQL会根据执⾏的每⼀条具体的sql语句来区分对待记录的⽇志形式,也就是在Statement和Row之间选择⼀种.新版本的MySQL中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。⾄于update或者delete等修改数据的语句,还是会记录所有⾏的变更。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务