Binlog in Redo功能指在事務提交時將Binlog內容同步寫入到Redo Log中,減少對磁盤的操作,提高數據庫性能。
前提條件
實例版本為MySQL 8.0(內核小版本20200430或以上)。
背景信息
在MySQL關鍵業務場景中,為了業務數據的安全,事務提交時必須實時保存對應的Binlog和Redo Log,即以下兩個參數必須同時設置為1:
sync_binlog = 1;
innodb_flush_log_at_trx_commit = 1;
由于每個事務提交會對磁盤進行兩次I/O操作,雖然Binlog采用了Group Commit的方式合并I/O來提升效率,但兩次I/O等待的本質沒有改變,影響事務處理的效率,當使用云盤存儲時,影響會更明顯。I/O合并的效率是由同時提交的并發事務數量決定的,當并發量不夠時I/O合并的效果也不理想,表現為少量的寫操作事務提交時所需要的時間比較久,響應時間較長。
為了提高事務提交效率,AliSQL精心設計了Binlog in Redo機制(設置參數persist_binlog_to_redo = on
開啟),即在事務提交時將Binlog內容同步寫入到Redo Log中。當事務提交時,只需要將Redo Log保存到磁盤中,從而減少一次對磁盤的操作,而Binlog文件則采用異步的方式,用單獨的線程周期性的保存到磁盤中。在異常重啟后,系統會用Redo Log中的Binlog內容來補齊Binlog文件。由于減少了一次I/O操作,性能得到了提升,響應時間變的更短,同時Binlog文件保存次數的減少,極大地降低了文件系統因文件長度實時變化帶來的文件同步(fsync)壓力,也提升了文件系統的性能。
Binlog in Redo功能不會改變Binlog的格式,基于Binlog的復制及第三方工具也不會受任何影響。
注意事項
開啟Binlog in Redo功能后,本地盤實例如果需要使用物理備份文件恢復到自建數據庫,需要使用RDS提供的XtraBackup工具。安裝XtraBackup工具請參見工具準備。
參數介紹
persist_binlog_to_redo
Binlog in Redo功能開關。全局系統變量,取值:on或off。修改本參數立刻生效,不需要重啟實例。
說明您只需要設置
persist_binlog_to_redo = on
即可正常使用Binlog in Redo功能,不需要修改其他參數(sync_binlog = 1
自動失效)。sync_binlog_interval
Binlog異步保存的間隔。全局系統變量,當
persist_binlog_to_redo = on
時生效。默認值:50,單位:毫秒(ms),通常使用默認值即可。修改本參數立刻生效,不需要重啟實例。
性能壓力測試
測試環境
應用服務器:阿里云ECS實例
RDS實例規格: 32核、64 GB內存、ESSD云盤
實例類型:高可用系列(數據復制方式為異步復制)
測試用例
使用的Sysbench內置用例如下:
oltp_update_non_index
oltp_insert
oltp_write_only
測試結果
oltp_update_non_index
開啟Binlog in Redo后,QPS在低并發場景下提升顯著,延遲也較低。
oltp_insert
開啟Binlog in Redo后,QPS在低并發場景下提升顯著,延遲也較低。
oltp_write_only
開啟Binlog in Redo后,QPS在低并發場景下有所提升,延遲也較低。
Binlog Fsync次數對比
開啟Binlog in Redo后,Binlog fsync的次數大幅降低。
測試總結
oltp_update_non_index和oltp_insert只包含單語句事務,事務提交次數多,而oltp_write_only包含多語句事務(2個UPDATE、1個DELETE、1個INSERT),相比oltp_update_non_index和oltp_insert,事務提交次數較少,所以oltp_update_non_index和oltp_insert的性能提升比oltp_write_only更為明顯。
在低于256并發時,Binlog in Redo功能可以明顯提升性能和降低延遲。對絕大多數的實際使用場景來說,Binlog in Redo效果顯著。
Binlog in Redo功能開啟后會大幅降低Binlog fsync的次數,可以提升文件系統的性能。