#MySQL# mysql5.7新特性之半同步複製

bitifi發表於2018-04-28

一 : 增強半同步複製

    ① 半同步複製(5.5 5.6)

     
        過程分析:
        1 > session 發出commit請求
        2 > flush binlog and fsync binlog
        3 > InnoDB 引擎層 commit 
        4 > 傳送binlog到SLAVE,等待slave傳送ack確認
        5 > slave 接受binlog 寫入relay log ,刷盤完成傳送ack確認包給master
        6 > master 返回 commit ok 資訊給session
        
        另外 (master 等待事務A 的 ACK的時候當機,此時新事務B在當機之前開啟):
        1> binlog 未傳送到從庫:
            事務B獲取到事務A提交的內容, 此時當機故障切換到slave,事務B獲取到的內容卻丟失了。事務A commit沒有收到反饋資訊(則需要業務判斷了)。
        2> binlog 已經傳送給從庫 :
            事務B獲取到事務A提交的內容,故障切換到salve ,B仍然獲取到A提交的內容,沒毛病。事務A commit沒有收到反饋資訊,若重新執行該事務,則相當於執行兩次A事務(則需要業務判斷了)。

    ② 增強半同步複製(5.7)
        由該引數 rpl_semi_sync_master_wait_point=AFTER_SYNC/AFTER_COMMIT 兩個值選擇是否啟用增強半同步
        當  半同步模式為 AFTER_COMMIT 時,為以上分析的情況
        當  半同步模式為 AFTER_SYNC 模式時,則:
        
           過程分析:
           1 > session 發出commit請求
           2 > flush binlog and fsync binlog
           3 > 傳送binlog到SLAVE,等待slave傳送ack確認
           4 > slave 接受binlog 寫入relay log ,刷盤完成傳送ack確認包給master
           5 > InnoDB 引擎層 commit 

           6 > master 返回 commit ok 資訊給session

           另外(master 等待事務A 的 ACK的時候當機,此時新B在當機之前啟)
           1> 事務B讀取不到事務A的內容,因為事務A的ENGINE層有提交(無損複製)
               
二 : 半同步複製增加 ACK執行緒

    ① mysql5.5 mysql5.6
        1> master dump thread 傳送binlog events 給 slave 的IO thread,等待 slave 的ack回包
        2> slave 接受binlog events 寫入redo log ,返回 ack 包給master dump thread
        3> master dump thread 收到ack包 ,給session返回commit ok,然後繼續傳送寫一個事務的binlog。

    ② mysql5.7 新增ack執行緒
        1> master dump thread 傳送binlog events 給 slave 的IO thread,開啟ack執行緒等待 slave 的ack回包,dump 執行緒繼續向slaveIO thread傳送下一個事務的binlog。
        2> slave 接受binlog events 寫入redo log ,返回 ack 包給master ack執行緒,然後給session返回commit ok。
 
    可以看到,mysql5.7半同步複製中增加了一個 ACK執行緒專門用來進行semi 複製的ACK確認,這提高了複製的tps。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30496894/viewspace-2153514/,如需轉載,請註明出處,否則將追究法律責任。

相關文章