一下內容均是根據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。