分散式 | dble 讀寫分離場景下為什麼普通的讀 sql 傳送到了 master 例項上

愛可生雲資料庫發表於2022-05-31

作者:馬瑩樂

愛可生研發團隊成員,負責 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的介紹文件中是這樣的:

當前覆盤以上資訊,此場景下可供懷疑的點為:

  1. 從節點是否心跳不正常,show @@heartbeat; 看一看
  2. 主從複製狀態是否正常的,可在slave例項上直接下發show slave status檢視主從複製狀態是否正常
  3. 檢視主從複製的延遲時間是否超過閾值,可參考show slave statusSeconds_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)

  1. 先斷定一下在對應版本的dble純讀寫分離場景下,sql發主是否符合當前預期,具體可以參考官方文件和Q&A
  2. 確定實屬應該發從,但是卻發了主的,可以看下心跳狀態是否正常,(根據本次問題,我們除了觀測show @@heartbeat外,最好還是看一下dble.log是否存在其他問題)
  3. 當使用的心跳sql是show slave status時,需要考慮2點:

    • 有沒有開啟配置延遲檢測引數,有延遲相關的引數時,當主從複製延遲超過閾值後,讀sql發主例項是符合預期的
    • 可能是show slave status;的結果返回不符合預期(大概率是複製狀態異常)
  4. 如果使用了最新發版的dble,版本3.22.01.0,還需要考慮純讀寫分離場景下,是否存在讀寫分離後端例項的粘滯性的情況

    dble是否支援組複製?(以下內容已更新在對應的Q&A中)

    參考Q&A#3184,但鑑於以上,在使用MGR時,需要注意避免使用show slave status作為心跳語句,原因為這個sql在組複製模式下返回值為空,不能用來判斷group-member複製狀態正常與否。若在MGR模式下配置了show slave status作為心跳語句會出現如下影響:

  5. 啟動dble之後,日誌會一直報" found MySQL master/slave Replication err
  6. 當啟動了讀操作的負載均衡rwSplitMode為1/2/3時,讀操作不能均衡到slave(其中1會有明顯的報錯,但配置為2,3時,讀sql會默默傳送到master,起不到讀操作的負載均衡作用)

結語

感謝社群使用者 @大鵬 在遇到問題時,能夠積極在社群QQ群裡反饋問題,讓問題走到大家的視野裡。

更感謝每週問題覆盤的dble研發同學,火眼金睛,串聯起了同一使用者陸續幾天的問題片段,科學嚴謹,提出了猜想,使得問題真正原因得以浮出水面。

最後,大家在使用中發現有可改善點、或高頻使用場景的需求時,歡迎在專案上提issue來反饋!感謝~!

相關文章