Mysql

如何避免複製滯後,以防所有在 master 上的寫入和在副本上的讀取?

  • January 31, 2022

我一直堅持複製滯後問題。我正在嘗試重構我的數據庫基礎架構。第一步是讀寫分離。我使用 ProxySQL 來實現它。現在我有 masterDb 執行所有 INSERT 和 UPDATES 和 2 個副本,我路由所有 SELECT。

但我面臨的主要問題是複制滯後。因為通常當您更改數據庫中的某些內容時,您會立即讀取數據並期望在查詢結果中包含新數據,但是由於複製滯後,我會收到過時的數據。Google搜尋後,我發現這篇文章https://www.percona.com/blog/2018/11/29/mysql-high-availability-stale-reads-and-how-to-fix-them/並根據此資訊2018 年的最佳選擇是“ProxySQL 2.0 GTID 一致讀取”

2018年有更新嗎?也許你們知道更好的解決方案?請分享!

有些SELECTs存在以支持您將要執行的插入/更新/刪除。您不得將它們發送到副本;它們必須在主節點中完成,通常在與寫操作相同的事務中。檢查 ProxySQL 沒有這樣做。

除了比爾提到的之外,其他技巧也是可能的。通過在複製流中插入一些內容,然後在 Replica 上檢查它,您可能能夠查看您的寫入是否已到達 Replica。在複製變為多執行緒之前,這工作得很好。所以要提防暗示這個技巧的舊建議。

您也可以計劃將您的應用程序更改為至少有兩種連接方式——通過代理或故意訪問主節點。

另一個問題——任何對副本新鮮度的檢查都必須與SELECT您將要做的相同。這是因為不同的連接可能會命中不同的 Replica。複製品不一定同樣新鮮。(一個大SELECT的一個副本可以在很多方面減慢複製速度。)

伙計們

由於您已經在執行 3 台伺服器,您不妨考慮切換到 Percona PXC(或 MySQL 5.7 + Galera,或內置 Galera 的 MariaDB)。它在SELECT級別上提供了一個“wsrep”方法,以確保數據同步。同時,它提供更好的 HA 支持、自動故障轉移和(可選)寫入任何節點。

引用自:https://dba.stackexchange.com/questions/306801