對于支持事務的關系型數據庫來說,事務的完成需要執行commit命令,用于保存該事務操作的相關日志、標記該事務已完成,確保數據的一致性。通常情況下,commit命令執行很快,但也會存在commit是性能瓶頸,影響整體數據庫性能的情況發生。
慢日志分析
對慢日志分析可見,commit操作平均耗時近1分鐘是非正常現象。
MySQL commit機制
mysql數據庫為了保證binlog、redolog中事務的一致性,事務采用了兩階段提交(2pc)機制:
prepare階段
innodb write/sync事務redo、undolog,binlog不做任何操作。
commit階段
mysql層write/syncbinlog,innodb寫 commit 至redolog。
從這個機制可以看出,commit操作包括binlog的落地動作。這就延長了commit動作的時間,也成了一個性能瓶頸,為了優化這一性能問題,mysql5.6推出了組提交機制。
binlog組提交的基本思想是,引入隊列機制保證innodb commit順序與binlog落盤順序一致,并將事務分組,組內的binlog刷盤動作交給一個事務進行,實現組提交目的。
binlog提交將提交分為了3個階段,FLUSH階段,SYNC階段和COMMIT階段。基本流程如下:
FLUSH 階段
持有Lock_log mutex [leader持有,follower等待]
獲取隊列中的一組binlog(隊列中的所有事務)
將binlog buffer到I/O cache
通知dump線程dump binlog
SYNC階段
釋放Lock_log mutex,持有Lock_sync mutex[leader持有,follower等待]
將一組binlog 落盤(sync動作,最耗時,假設sync_binlog為1)
COMMIT階段
釋放Lock_sync mutex,持有Lock_commit mutex[leader持有,follower等待]
遍歷隊列中的事務,逐一進行innodb commit
釋放Lock_commit mutex
喚醒隊列中等待的線程
組提交就是每次sync一組binlog,從而提升效率,而一組binlog的數量則由以下兩個參數決定:
binlog_group_commit_sync_delay=N:在等待N μs后,開始事務刷盤
binlog_group_commit_sync_no_delay_count=N:如果隊列中的事務數達到N個,就忽視binlog_group_commit_sync_delay的設置
參數名 | 參數值 |
sync_binlog | 1 |
binlog_group_commit_sync_delay | 1 |
binlog_group_commit_sync_no_delay_count | 1000 |
以上參數為故障發生時數據庫的參數設置,可以看binlog_group_commit_sync_delay設置為1微妙,即1微妙內sync一組binlog,這對于高并發的dml操作而言對IO壓力相對比較大;sync_binlog參數在組提交機制下其意義也發生了變化,官方文檔如下:
當sync_binlog設置為0或1時,binlog_group_commit_sync_delay時間后sync一組binlog;當sync_binlog設置N(N>1)時binlog_group_commit_sync_delay時間后syncN組binlog。
所以整體上看,故障發生時有大量的dml操作,且因為數據庫的參數設置1微妙sync一組binlog,對IO造成了很大壓力,再加上同時有大量的select查詢,此刻IO已經達到極限,最終造成commit提交阻塞,事務不能及時釋放資源,其它dml操作因不能及時獲取事務鎖、io等資源而延長執行時間。
由于數據庫設置為1微妙sync一組binlog,在大并發dml操作時對IO造成很大壓力,造成commit阻塞和其它dml操作執行延長。由于binlog的sync操作代價相對較高,因此可以增加每組binlog的數量、每次syncbinlog組的數量,減輕對IO的壓力。
設置sync_binlog為1,則commit操作需要等待binlog_group_commit_sync_delay時間才能完成,阻塞了commit操作,設置太大的值(如:1000),則一次syncbinlog量比較大,很容易造成IO波動,如果存大大事務,則IO波動會更大。
binlog_group_commit_sync_delay設置太小,則每組中binlog數量較小,起不到組提交帶來的性能優化,設置太大則阻塞了commit操作很長時間且binlog事務太大。
binlog_group_commit_sync_delay最好設置為10的倍數,不然會引起如下bug:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130192.html
摘要:隔離級別個等級的事務隔離級別,在相同的數據環境下,使用相同的輸入,執行相同的工作,根據不同的隔離級別,可以導致不同的結果。不同事務隔離級別能夠解決的數據并發問題的能力是不同的。 Java知識點總結(JDBC-事務) @(Java知識點總結)[Java, JDBC] 事務 事務基本概念 一組要么同時執行成功,要么同時執行失敗的 SQL 語句。是數據庫操作的一個執行單元! 事務開始于:...
摘要:一致性一個事務中,事務前后數據的完整性必須保持一致。持久性持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。 一、事務概述1.什么是事務一件事情有n個組成單元 要不這n個組成單元同時成功 要不n個單元就同時失敗就是將n個組成單元放到一個事務中2.mysql的事務默認的事務:一條sql語句就是一個事務 默認就開啟事務并提交事...
摘要:今天對象在學習時發現對象的方法并不能清理一級緩存同一下相同查詢條件返回的結果還是舊值。測試代碼如下上網搜索網上搜索找到了相同問題并沒有人解答。例如查看官方文檔實例有一個本地緩存在執行和時被清理。要明確地關閉它獲取打算做更多的工作你可以調用。 今天對象在學習 Mybatis 時發現 org.apache.ibatis.session.SqlSession 對象的 clearCache()...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20