MySQL5.7新特性半同步複製之AFTER_SYNC/AFTER_COMMIT的過程分析和總結
MySQL 5.7增強了半同步複製,rpl_semi_sync_master_wait_point增加了AFTER_SYNC的值,由該引數AFTER_SYNC/AFTER_COMMIT兩個值選擇是否啟用增強半同步.
當半同步模式為 AFTER_COMMIT時:
過程分析如下:
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事務(則需要業務判斷了)。
當半同步模式為 AFTER_SYNC(5.7版本推薦使用)時:
過程分析如下:
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層還沒有提交(無損複製)
dump thread過程分析:
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。
過程總結:
Master在收到slave的應答後才Commit事務--after_sync(5.6上Master在commit後,才等待Slave的應答--after commit).
因此在確認事務複製到Slave上之前,併發的事務看不到當前事務的資料.
當Master出現故障時,所有已經提交的事務都複製到了Slave上.
預設採用無資料丟失的應答等待機制after_sync。使用者也可以選擇使用5.6的應答等待機制after_commit
設定方法:
mysql> SET rpl_semi_sync_master_wait_point= AFTER_SYNC;
Master接收到N個slave的應答後,才commit 事務.
使用者可以設定應答Slave的數量:
mysql> SET GLOBAL rpl_semi_sync_master_wait_for_slave_count= N;
當半同步模式為 AFTER_COMMIT時:
過程分析如下:
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事務(則需要業務判斷了)。
當半同步模式為 AFTER_SYNC(5.7版本推薦使用)時:
過程分析如下:
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層還沒有提交(無損複製)
dump thread過程分析:
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。
過程總結:
Master在收到slave的應答後才Commit事務--after_sync(5.6上Master在commit後,才等待Slave的應答--after commit).
因此在確認事務複製到Slave上之前,併發的事務看不到當前事務的資料.
當Master出現故障時,所有已經提交的事務都複製到了Slave上.
預設採用無資料丟失的應答等待機制after_sync。使用者也可以選擇使用5.6的應答等待機制after_commit
設定方法:
mysql> SET rpl_semi_sync_master_wait_point= AFTER_SYNC;
Master接收到N個slave的應答後,才commit 事務.
使用者可以設定應答Slave的數量:
mysql> SET GLOBAL rpl_semi_sync_master_wait_for_slave_count= N;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2143986/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- #MySQL# mysql5.7新特性之半同步複製MySql
- MySQL半同步複製--after_commitMySqlMIT
- Mysql5.7半同步複製MySql
- MySQL5.7半同步複製報錯案例分析MySql
- MySQL5.7主從複製-半同步複製搭建MySql
- MySQL的非同步複製和半同步複製MySql非同步
- MySQL 5.7中sync_binlog引數和半同步中after_commit和after_sync的區別MySqlMIT
- MySQL主從複製之半同步複製MySql
- MySQL的半同步複製MySql
- MySQL主從複製、半同步複製和主主複製MySql
- MySQL 半同步複製MySql
- MySQL半同步複製MySql
- MySQL增強半同步引數rpl_semi_sync_master_wait_point值AFTER_SYNC和AFTER_COMMITMySqlASTAIMIT
- MySQL主從複製、半同步複製和主主複製概述MySql
- 【MySQL】半同步與增強半同步複製MySql
- MySQL 8 複製(二)——半同步複製MySql
- mysql 5.7半同步複製MySql
- Mariadb之半同步複製叢集配置
- 【Mysql】mysql公開課之-mysql5.7複製特性MySql
- 【Mysql】mysql5.7新特性之-並行複製實現原理與調優MySql並行
- mysql半同步複製的設定MySql
- 多從庫時半同步複製不工作的BUG分析
- MySQL的主從複製、半同步複製、主主複製詳解MySql
- mysql5.5中的半同步複製MySql
- 【總結】mysql半同步MySql
- MySQL(二):主從複製結構、半同步複製、雙主複製結構、利用SSL實現安全的MySQL主從複製MySql
- 主從複製、雙主複製及半同步複製、以及基於SSL的複製
- MySQL 半同步複製+MMM架構MySql架構
- MySQL半同步複製--after_rollbackMySql
- mysql5.5半同步複製探究MySql
- 配置mysql5.5主從複製、半同步複製、主主複製MySql
- mysql線上建立半同步複製的從庫MySql
- 半同步複製報錯mysql8.0.25MySql
- mysql5.5.9半同步複製功能部署MySql
- MySQL 5.5半同步複製的配置與監控MySql
- MySQL 同步複製及高可用方案總結MySql
- MySQL增強(Loss-less)半同步複製MySql
- MySQL5.5半同步複製實現原理MySql