作者:馬瑩樂
愛可生研發團隊成員,負責 mysql 中介軟體的測試。本人是測試技術愛好者,歡迎大家試用 dble 新功能~
本文來源:原創投稿
*愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。
配置rwSplitMode=3,讀sql為什麼發往了master例項
問題來源與背景
問題源自dble社群QQ群(QQ:669663113)的社群使用者 @大鵬 的反饋,問:
- 配置了dble的讀寫分離,無論rwSplitMode設定為什麼值,查詢總是路由到主節點。
- 判斷髮主發從的方式:直接登入到3個mysql節點,執行show processlist 檢視,主節點有,但從節點沒有查詢語句
在進一步的交流中得知:
- 使用的是dble純讀寫分離功能
- 查詢語句 都是多表關聯的select 語句有簡單引用了view
隨後的本地復現
本地復現I
在本地測試的純讀寫分離場景下,select是發從例項的,沒毛病
但社群使用者這邊在rwSplitMode=3時,這樣的讀sql,很穩定的發了主例項,db.xml截圖如下
從對方提供的截圖中能獲得的資訊是:
rwSplitMode=3
- 心跳sql為
show slave status
,且有開啟延遲檢測delayThreshold="100"
在db.xml的介紹文件中是這樣的:
當前覆盤以上資訊,此場景下可供懷疑的點為:
- 從節點是否心跳不正常,
show @@heartbeat;
看一看 - 主從複製狀態是否正常的,可在slave例項上直接下發
show slave status
檢視主從複製狀態是否正常 - 檢視主從複製的延遲時間是否超過閾值,可參考
show slave status
的Seconds_Behind_Master
指標,有關Q&A: #3104
幾天後,同一社群使用者 @大鵬 又詢問了一個新的問題
dble如果後端連線MySQL MGR,db.xml中的心跳語句應該配置什麼?使用show slave status ,啟動的時候有警告資訊
當時懷疑是mysql版本不低於8.0.26時,主從複製狀態(Slave_IO_State和Slave_SQL_Running_State)狀態文案的更新導致的dble對複製狀態的誤判狀態(後續證明不是這個原因,詳見:本地復現II),
忽略掉了社群使用者使用了mysql的組複製這一關鍵資訊,
其實根據報錯圖片的關鍵字來檢索的話,是可以檢索到這條報錯的Q&A:啟動dble之後,日誌會一直報" found MySQL master/slave Replication err
本地復現II
在後續的本地試驗過程中發現,dble在使用mysql8.0.26版本的普通主從複製,去做讀寫分離的mysql後端時,是正常的:
- 心跳狀態是正常的
- dble.log沒有相關報錯
- 讀sql正常發往slave
所以,當時的懷疑是錯誤的,dble支援後端mysql8.0.26的主從複製,讀sql可正常發從。
本地復現III
迴歸這個問題,嘗試MGR的情況,可以復現社群使用者發現的報錯,且讀寫sql均會發往primary例項。
測試配置:搭建3節點MGR單主模式作為後端dbGroup,配置心跳語句是show slave status;
,啟動 dble
dble雖然可以正常啟動,且show @@heartbeat;
的輸出一直是正常的,但是卻可以在日誌中找到和以上社群使用者提供的一樣的報錯
dble.log
在純讀寫分離場景下,重新測試,讀寫sql均會發往primary例項
讀寫sql均會發往primary例項
小結
讀sql沒有按照預期的發從例項,可以從以下方面著手排查(已補充Q&A)
- 先斷定一下在對應版本的dble純讀寫分離場景下,sql發主是否符合當前預期,具體可以參考官方文件和Q&A
- 確定實屬應該發從,但是卻發了主的,可以看下心跳狀態是否正常,(根據本次問題,我們除了觀測
show @@heartbeat
外,最好還是看一下dble.log是否存在其他問題) 當使用的心跳sql是
show slave status
時,需要考慮2點:- 有沒有開啟配置延遲檢測引數,有延遲相關的引數時,當主從複製延遲超過閾值後,讀sql發主例項是符合預期的
- 可能是
show slave status;
的結果返回不符合預期(大概率是複製狀態異常)
如果使用了最新發版的dble,版本3.22.01.0,還需要考慮純讀寫分離場景下,是否存在讀寫分離後端例項的粘滯性的情況
dble是否支援組複製?(以下內容已更新在對應的Q&A中)
參考Q&A#3184,但鑑於以上,在使用MGR時,需要注意避免使用
show slave status
作為心跳語句,原因為這個sql在組複製模式下返回值為空,不能用來判斷group-member複製狀態正常與否。若在MGR模式下配置了show slave status作為心跳語句會出現如下影響:- 啟動dble之後,日誌會一直報" found MySQL master/slave Replication err
- 當啟動了讀操作的負載均衡rwSplitMode為1/2/3時,讀操作不能均衡到slave(其中1會有明顯的報錯,但配置為2,3時,讀sql會默默傳送到master,起不到讀操作的負載均衡作用)
結語
感謝社群使用者 @大鵬 在遇到問題時,能夠積極在社群QQ群裡反饋問題,讓問題走到大家的視野裡。
更感謝每週問題覆盤的dble研發同學,火眼金睛,串聯起了同一使用者陸續幾天的問題片段,科學嚴謹,提出了猜想,使得問題真正原因得以浮出水面。
最後,大家在使用中發現有可改善點、或高頻使用場景的需求時,歡迎在專案上提issue來反饋!感謝~!