一下内容均是根据leader的培训分享整理而成
************************************我是分割线****************************************
mysql5.5 replication
大概过程:
一。首先在master 执行一个事物,提交(mysql默认设置为自动提交),
二。提交之后 写到2个文件,一个是将数据写入datafile(这个数据是结果一致,例如有个数据单元开始数据是1,中间经过2,3等变化,最后是4,那么写入最终结果4), 一个是将事物写入bin_log(binary log),确切说不一定是事物,具体分为3种,1.statement-based logging, 2.row-based loggging,3.mixed logging.
binlog 里是很多的event, binlog开头是4个空位,具体作用不详(据leader讲是event开始的标志)。4个空位后有一位表示Format Description E(FDE),以事物为单位向binlog写数据,一个事物可以包含n个event,binlog结束有xid标志。(toconfirm:xid是一个事物的结束符号还是binlog内容结束的符号?)
每一个event里都有校验位,如果网络传输出现问题可以断点续传之类的,
三。master 把 binlog文件通过一个叫dump的线程传给slave, slave 将接到的event写入一个叫Relay log(中继日志)的文件,然后根据relay log用一个叫applier的东西 做commit(写datafile, 和 binlog)
binlog 和relay log 内容不总是相同,因为可以设置eventsize,如果master上有一个事物写入到binlog后使得size 超过eventsize(可以撑大,因为binlog以事物为单位存,而非event为单位), 这样传给slave后,当relay log达到slave端的event size后就会起新文件写入后续接收到的event.
unsafe的replication, 如果事物中含有rand类的赋值是safe的,因为event记录中有rand的种子, 可是如果有now()这样的赋值就是unsafe,因为有时间差,这时候statement-based logging 就会出错,可以用mixed logging.
mysql5.5版本的replication存在的问题:
主从数据差异:对主的操作可以是多并行,可是向从写入确实将多个并行的操作记录到binlog,然后串行的发送给从, 所以从的数据在没有完全执行完binlog前跟主存在差异, 而且并行到串行执行的效率可能也会差很大。解决方式,对从的操作考虑并行,或者semisynchronize, 可是如果同时并行,主的运行效率可能要下降,因为它既要执行自己的并行操作,还要将binlog里的event并行的发给从。semisychronize是适当降低主的并发操作,等待从,但是如果从的响应过慢,严重影响主的响应,主就要继续执行自己的并发。
************************************我是分割线****************************************
mysql 5.6 replication
一。使用gtid, 而不再是bin log 的pos来标识event 。因为如果存在像 master-->slave1(pos 100)--->slave2(pos 80), master-->slave3(pos150)这样的主从结构,如果master突然down掉,slave3变成主从的话, slave2将无法分辨下一条event的位置, slave2(pos80)只是相对自己相连的slave1里的binlog而言的event pos
二。使用MTS(multiple thread slave) 以schema为单位的多线程,因为对不同schema的操作不会相互影响,所以可以并行
************************************我是分割线****************************************
GroupCommit(组提交), mysql的多个提交并成组,目的是提高写速度,binlog 和groupcommit同用会有问题
toconfirm(mysql bug 70370)
************************************我是分割线****************************************
semisynthronize 过程
半同步的意义eg:用户在主上执行了插入,从的数据还没有更新,用户的主上可以查到新数据,从上却查不到。
为了解决类似上述的问题使用semisynthronize, 执行用户的操作 commit先不要执行,写入binlog, 然后将binlog 里新加入的event dump给Slave, slave 接受好之后给主ACK, 然后主在commit。