1)master將改變記錄到二進(jìn)制日志(binary log)中(這些記錄叫做二進(jìn)制日志事件渡冻,binary log events)柿菩;
2)slave將master的binary log events拷貝到它的中繼日志(relay log)数焊;
3)slave重做中繼日志中的事件,將改變反映它自己的數(shù)據(jù)檀训。
該過(guò)程的第一部分就是master記錄二進(jìn)制日志王带。在每個(gè)事務(wù)更新數(shù)據(jù)完成之前,master在二日志記錄這些改變件炉。MySQL將事務(wù)串行的寫入二進(jìn)制日志勘究,即使事務(wù)中的語(yǔ)句都是交叉執(zhí)行的。在事件寫入二進(jìn)制日志完成后斟冕,master通知存儲(chǔ)引擎提交事務(wù)口糕。
下一步就是slave將master的binary log拷貝到它自己的中繼日志。首先磕蛇,slave開始一個(gè)工作線程——I/O線程景描。I/O線程在master上打開一個(gè)普通的連接,然后開始binlog dump process秀撇。Binlog dump process從master的二進(jìn)制日志中讀取事件超棺,如果已經(jīng)跟上master,它會(huì)睡眠并等待master產(chǎn)生新的事件呵燕。I/O線程將這些事件寫入中繼日志棠绘。
SQL slave
thread(SQL從線程)處理該過(guò)程的最后一步。SQL線程從中繼日志讀取事件虏等,并重放其中的事件而更新slave的數(shù)據(jù)弄唧,使其與master中的數(shù)據(jù)一致。只要該線程與I/O線程保持一致霍衫,中繼日志通常會(huì)位于OS的緩存中候引,所以中繼日志的開銷很小。
此外敦跌,在master中也有一個(gè)工作線程:和其它MySQL的連接一樣澄干,slave在master中打開一個(gè)連接也會(huì)使得master開始一個(gè)線程逛揩。復(fù)制過(guò)程有一個(gè)很重要的限制——復(fù)制在slave上是串行化的,也就是說(shuō)master上的并行更新操作不能在slave上并行操作麸俘。