包拯斷案 | MySQL5.7替換路上踩過的坑 一鍵get解決辦法@還故障一個真相

提問:作為DBA運維的你,是否有過這些煩惱

1、業務系統進行替換投產時,發現數據庫回放并行度低

2、雖然2個數據庫集群使用同一份數據,卻在關閉雙一后,二級從庫的回放效率依舊緩慢,不知是什么原因?

心中有章,遇事不慌

作為DBA的你,遇到問題無從下手,除了在問題面前徘徊,還能如何選擇?如果你一次或多次遇到該問題還是無法解決,又很懊惱,該如何排憂呢?關注公眾號,關注《包拯斷案》專欄,讓小編為你排憂解難~

圖片

#包拯秘籍#

一整套故障排錯及應對策略送給你,讓你像包拯一樣斷案如神:

?#首先

遇到此類問題后,我們要做到心中有章(章程),遇事不慌。一定要冷靜,仔細了解故障現象(與研發/用戶仔細溝通其反饋的問題,了解故障現象、操作流程、數據庫架構等信息)

#其次

我們要根據故障現象進行初步分析。心中要想:是什么原因導致回放數據慢?例如:是二級從庫出了問題,還是資源遇到瓶頸?

#然后

針對上述思考,我們需要逐步驗證并排除,確定問題排查方向。

#接著

確定了問題方向,進行具體分析。通過現象得出部分結論,通過部分結論繼續排查并論證。

#最后

針對問題有了具體分析后,再進行線下復現,最終梳理故障報告。

真刀實戰,我們能贏

說了這么多理論,想必實戰更讓你心動。那我們就拿一個真實案例進行分析---某國有大型商業銀行子業務系統要進行替換投產,在替換過程中遇到回放數據慢的問題,該如何快速分析處理:

1.故障發生場景

在項目現場兢兢業業準備數據庫替換上線的你,正計劃把客戶子業務系統中的數據庫從MySQL 5.7.21 替換到GreatDB最新版本,該業務系統采用主從級聯復制,原計劃流程如下:

1.?停止舊環境的一臺從庫(以下稱“一級從庫”),使用冷備方式拷貝一份數據文件副本到新環境。在新環境上使用原地替換的方式,將數據文件替換為GreatDB最新版本(以下稱“二級從庫”);

2.??第二天晚上,啟動之前停止的一級從庫,將二級從庫主從連接到一級從庫上,兩庫開始追趕近3天的增量數據;

3.?第三天凌晨,發現兩臺從庫應用增量數據緩慢,磁盤iops高。為加快追趕增量數據速度,關閉兩臺庫的雙一參數,iops顯著下降。一段時間后,一級從庫接近追平數據,而二級從庫則回放緩慢。發現二級從庫資源使用率較低,沒有瓶頸,因此利用show processlist 查看worker進程,發現回放并行度低,只能中止替換投產工作。

圖片

圖片

(示意圖)

何為“雙一:即系統變量 sync_binlog = 1 和 innodb_flush_log_at_trx_commit = 1,以便從庫的二進制日志和redo log 能即時同步到磁盤,否則已提交的二進制日志可能因意外宕機而丟失。

2.故障分析

一級從庫和二級從庫使用同一份數據,在關閉雙一之前未看到明顯的延遲差異。關閉雙一后,一級從庫回放速度大幅提升,二級從庫回放效率依舊緩慢。正常情況下,如果資源沒有瓶頸,二級從庫應該會出現回放并行度下降的問題。

3.原理分析:結合并行復制原理進行分析

1)基本原理

通過事務分組,優化減少了生成二進制日志所需的操作數。當事務同時提交時,它們將在單個操作中寫入二進制日志。若事務能同時提交成功,則它們不會共享任何鎖,這就意味著它們沒有沖突,可以在Slave上并行執行。

2)事務合并機制

binlog中的事務記錄了兩個值:

  • last_commit上個事務的提交順序號

  • sequence_number本次事務的提交順序號

根據組提交和兩階段提交機制,last_commit值可以合并,即相近事務可以具有相同的last_commit值。事務分發時,last_commit work線程會檢查事務的last_commit, last_commit對應的上一事務完成提交后,本事務才能進行回放。last_commit相同的事務,可同時通過分發階段,即可以并行執行。

3)last_commit值的產生方式

事務提交時,可分成以下三個階段:

  • Stage 1:prepare

    ?獲取全局的提交號,固定為事務的last_commit值,進行innodb redo prepare。

  • Stage 2:binlog flush

    進行redo刷盤,獲得innodb_flush_log_at_trx_commit 的生效點。將事務信息寫入binlog并進行刷盤,則獲得了sync_binlog 的生效點。

  • Stage 3:commit

    進行innodb commit,更新全局提交號。

由于redo和binlog全局只有一份,因此此處只能串行執行。每個Stage同一時間只允許一個線程操作,其它線程的事務將進入每個stage設置的等待隊列。為提高效率,此時需引入組提交機制。當一個線程獲得執行stage的執行權限時,會將【等待隊列】中的事務合并執行提交任務。因此,各階段可以同時存在多個事務。在一定時間內,通過stage 1提交的事務,則具有了相同的last_commit值。

4)關閉雙一下的last_commit

當雙一關閉,執行stage 1和stage 2的時間就會大幅壓縮,等待隊列積累的事務長度會減少,提交就會很快進入Stage 3階段,全局提交號遞增頻率增加。binlog中事務記錄的last_commit值就會快速遞增。從庫使用讀取這份binlog進行回放,并行度就下降了。

???

如下圖所示,關閉雙一后,stage 1和stage 2的執行時間大幅壓縮:

圖片

如下圖所示,開啟雙一情況下,一級從庫binlog的last_commit。二級從庫回放時,8號事務完成后,9-16號事務可以并行回放。

???

圖片

如下圖所示,關閉雙一情況下,一級從庫binlog的last_commit。二級從庫回放時,8號事務完成后,只有9號事務的last_commit為8,退化為串行回放。

??

圖片

? ??

下圖為復制鏈路示意圖:關閉雙一前,一級/二級從庫能高并發回放。關閉雙一后,二級從庫并發降級。

圖片

4.故障優化方案

由于級聯復制追趕增量數據時,既要考慮釋放IO能力,也要兼顧降低last_commit的遞增數。

因此,可以參考以下方法:

1)設置innodb_flush_log_at_trx_commit=0,sync_binlog=1

sync_binlog保持為1,減緩事務進入Stage 3,降低【全局提交號】的遞增速度,保護并行度。

設置innodb_flush_log_at_trx_commit=0,降低IO消耗。同時,事務進入stage 1的效率提升,獲取相同last_commit的概率增大。

2)?設置slave_preserve_commit_order=0

若事務是回放線程發起的,在開啟slave_preserve_commit_order情況下,事務進入Stage 1等待隊列前,會先進入排隊狀態,以保證從庫事務提交順序和主庫保持一致,保護事務提交時間的線性增加。與此同時,會延緩事務進入stage 1隊列,降低提交效率和并行度。從庫延遲大時,可以考慮關閉。這個操作在高并發場景時效果尤其明顯。

3)優化刷臟,釋放iops能力

關閉double write,增大redo,增大buffer_pool,提高臟頁低水位線,調整innodb_io_capacity等。通過調整刷臟相關參數,減少刷臟消耗的磁盤IO。

4)不建議從庫調整組提交等待參數

binlog_group_commit_sync_no_delay_count,這一參數受限于從庫并發量,很難穩定觸發。

binlog_group_commit_sync_delay ,這一參數受限于從庫并行執行,無法通過此參數合并大量事務提交,容易進入無意義的空等,反而減慢事務回放。

5)改變last_commit算法(針對MySQL5.7.22以上版本,GreatDB全系版本支持)?

MySQL5.7.22引入了新的last_commit計算方法,提高并行度。

設置參數如下:

-?? transaction_write_set_extraction=XXHASH64

-?? binlog_transaction_dependency_tracking=WRITESET/WRITESET_SESSION

??

開啟后,事務提交會將改變的行保存在內存寫集合中。新事務提交會比對寫集合,沒有沖突則不遞增last_commit。沖突則清空寫集合,并改變last_commit,此舉可大幅提高并行度。

復盤總結

01

投產暫停原因:

本次替換投產工作暫停,是級聯復制二級從庫回放并行度低引起的,造成二級從庫大幅度延遲。主要是MySQL的級聯復制機制引起的,而非GreatDB問題。

02

維護措施:

替換過程中,一定要做好監控及定期巡檢,確保數據庫處于穩定運行狀態;

03

替換優化方案:

1)替換方案:

針對冷備數據目錄目前間隔兩天才啟動二級從庫追平數據的方案,可以優化替換策略:縮短二級從庫冷備目錄到開始追平數據之間的時間差(1天內),保證二級從庫實際可用的回放時間;

2)后期優化方案:

a.優化slave_preserve_commit_order、innodb_flush_log_at_trx_commit、sync_binlog等數據庫參數,以提升磁盤能力;

b.修改并行復制算法”WRITESET“,大幅提升并行度能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14015.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14015.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14015.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器人開源項目分享,助力一戶一機器人

最初,因隋煬帝思念心切,命工匠按照柳抃的形象制作了木偶機器人,被認為是歷史上最早的機器人之一。這些木偶機器人通過精巧設計的機關,能夠執行坐、起、拜、伏等動作。 如今,隨著科技的發展,機器人已經廣泛…

從ES5邁向ES6:探索 JavaScript 新增聲明命令與解構賦值的魅力

個人主頁:學習前端的小z 個人專欄:JavaScript 精粹 本專欄旨在分享記錄每日學習的前端知識和學習筆記的歸納總結,歡迎大家在評論區交流討論! ES5、ES6介紹 文章目錄 💯聲明命令 let、const🍟1 let聲明符&a…

Linux磁盤初始化與fstab文件更新

環境: Redhat 7.9 本文操作: >>給disk設置分區 (fdisk) >>給disk設置file system格式 (mkfs ) >>創建路徑,并將disk mount上(mkdir和mount ) >>修改fstab文件 初始化Disk 初始化前&#xff…

Vue組件通信 - 組件傳值 / 什么是組件

1.什么是組件通信: 組件(.vue)通過某種方式來傳遞信息以達到某個目的 2.組件通信可以解決什么問題: 每個組件之間都有獨立的作用域,組件間的數據是無法共享的,但在實際開發中我們常常需要讓組件之間共享…

【計算機網絡原理】對傳輸層TCP協議的重點知識的總結

?????? write in front ??????? ?????????大家好,我是xiaoxie.希望你看完之后,有不足之處請多多諒解,讓我們一起共同進步????? . ?? ?xiaoxie?????????—CSDN博客 本文由xiaoxie????????? 原創 CSDN 如…

Spring Bean Map漫游:遍歷背后的生命周期奧秘

1. 引言 在Spring框架中,Bean的生命周期是一個復雜而精妙的過程。其中,遍歷存儲Bean實例的Map(通常是DefaultSingletonBeanRegistry中的singletonObjects)是這一過程中的重要環節。理解這個遍歷過程以及它在Bean生命周期中的作用…

桌面文件不見了怎么恢復?五種方法解決文件恢復難題,建議收藏

不小心誤刪除了桌面文件,導致文件丟失。事實上誤刪的文件并沒有被永久刪除,而是被移動到了回收站中,可以恢復這些文件。本文將分享多種方法,具體步驟如下。 方法一:從回收站中恢復 大多數操作系統都有回收站或垃圾桶的…

【C語言】結構體內存對齊:熱門面試話題

🔥引言 書接上文,我們了解關于結構體的基本知識,這篇將深入剖析結構體中一個重要的知識點:內存對齊 關于內存對齊是屬于熱門面試話題,對此單獨放在一篇來分享 🌈個人主頁:是店小二呀 🌈C語言筆記…

3D工業視覺

前言 本文主要介紹3D視覺技術、工業領域的應用、市場格局等,主要技術包括激光三角測量、結構光、ToF、立體視覺。 一、核心內容 3D視覺技術滿足工業領域更高精度、更高速度、更柔性化的需求,擴大工業自動化的場景。 2D視覺技術基于物體平面輪廓&#…

軟件無線電學習-第二代移動通信系統過程理解

本文知識內容摘自《軟件無線電原理和應用》 無線通信領域讓大家感受最深的是民用移動通信的快速發展。民用移動通信在短短的二十年時間里已發展了三代:20世紀80年代的模擬體制(TACS/AMPS)為第一代移動通信(簡稱1G);20世紀90年代的數字體制(GSMCDMATDMA)…

Git提交和配置命令

一、提交代碼到倉庫 在軟件開發中,版本控制是一個至關重要的環節。而Git作為目前最流行的版本控制系統之一,為我們提供了便捷高效的代碼管理和協作工具。在日常開發中,我們經常需要將本地代碼提交到遠程倉庫,以便于團隊協作和版本…

2024電工杯數學建模B題思路模型代碼

完整內容更新見文末名片 B 題:大學生平衡膳食食譜的優化設計及評價 大學時代是學知識長身體的重要階段,同時也是良好飲食習慣形成的重要時期。這一特 定年齡段的年輕人,不僅身體發育需要有充足的能量和各種營養素,而且繁重的腦…

Java基礎教程 - 9 集合

更好的閱讀體驗:點這里 ( www.doubibiji.com ) 更好的閱讀體驗:點這里 ( www.doubibiji.com ) 更好的閱讀體驗:點這里 ( www.doubibiji.com ) 9 集合 什么是集合&…

【stm32/CubeMX、HAL庫】嵌入式實驗六:定時器(2)|PWM輸出

參考: 【【正點原子】手把手教你學STM32CubeIDE開發】 https://www.bilibili.com/video/BV1Wp42127Cx/?p13&share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c3989f6189fd3 《嵌入式系統基礎與實踐》劉黎明等編著,第九章定時器&#xff0c…

愛普生TG5032SFN溫補晶振在機器人控制中的應用

機器人控制是機器人技術的核心組成部分,它涉及通過傳感器采集外部環境信息,然后經過信號處理、運動規劃和執行控制等步驟,最終實現機器人的運動控制和任務執行。在技術的不斷更選,機器人控制也在不斷進步和演變。智能化機器人具備…

cannot compute sizeof(off_t) when compile netcdf-fortran

export LD_LIBRARY_PATH/netcdf-c/lib:$LD_LIBRARY_PATH

Z緩沖技術在AI去衣中的關鍵角色

引言: 人工智能(AI)技術的飛速發展,為圖像處理領域帶來了革命性的變化。其中,AI去衣技術作為一種新興的應用,引起了廣泛關注。它不僅在多媒體內容的編輯、虛擬現實和增強現實等領域具有重要的應用價值&…

Jenkins 構建 Maven 項目:項目和服務器在一起的情況

bash.sh內容 #!/bin/bash#刪除歷史數據 rm -rf ruoyi-admin.jar# appname$1 appnamevideo.xxxxx.com #獲取傳入的參數 echo "arg:$appname"#獲取正在運行的jar包pid # pidps -ef | grep $1 | grep java -jar | awk {printf $2} pidps -ef | grep $appname | grep ja…

1673. 找出最具競爭力的子序列

題目 給定一個整數數組 nums 和一個正整數 k,返回長度為 k 且最具競爭力的 nums 子序列。 數組的子序列是從數組中刪除一些元素(可能不刪除元素)得到的序列。 在子序列 a 和子序列 b 第一個不相同的位置上,如果 a 中的數字小于…

mysql 刪除特殊字符 表中存了特殊字符 換行符 回車符 word字符 查詢不到

省流: UPDATE t1 SET f1 REPLACE(REPLACE( f1 , CHAR(10), ), CHAR(13), ); 用 replace() 函數將 換行符char(10) 和 回車符char(13) 替換為空字符串。 char(10):換行 char(13):回車 發現表里存進很多換行符,如下圖&#xff1a…