MarriDB/MySQL的binlog group commit技術介紹

chenfeng發表於2016-06-14
我們知道,作業系統使用頁面快取機制來填補記憶體訪問速度和磁碟訪問速度之間的差距。通常情況下,對磁碟檔案的寫都會先寫入到頁面快取中,
然後由作業系統來決定何時將修改過的髒頁重新整理到磁碟上。如果想確保修改已經持久寫到了磁碟,必須呼叫fsync或fdatasync。在關聯式資料庫中,
為了滿足ACID中的持久化屬性,也就是說事務提交併成功返回給客戶端之後,必須保證該事務的所有修改不能丟。無論是在資料庫程式崩潰的情況下,
還是在資料庫所在的伺服器發生當機或斷電的情況下,都必須保證資料不能丟,這就要求資料庫在事務提交過程中呼叫fsync或fdatasync將資料持久化
到磁碟。fsync是一個昂貴的系統呼叫,對於普通的磁碟,每秒只能完成幾百次的fsync操作,很明顯,fsync將會限制每秒提交的事務數,成為關係
資料庫的瓶頸。

對於MarriDB/MySQL來說,這種情況變得更加糟糕。在開啟binlog的情況下,為了保證主庫和從庫之間資料的一致性,MarriDB/MySQL使用了事務的
兩階段提交協議。在這種情況下,為了滿足資料的持久化需求,一個事務的提交最多會導致3次fsync操作。

為了提高MarriDB/MySQL在開啟binlog的情況下單位時間內的事務提交數,就必須減少每個事務提交過程中導致的fsync的呼叫次數。MarriDB從5.3版本開始,
引入了binlog group commit技術來解決這個問題。MySQL從5.6版本開始也加入了binlog group commit技術。

binlog group commit的基本思想是多個併發提交的事務之間共用一次fsync操作來實現事務對binlog修改的持久化。

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

相關文章