首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL Proxy 解決主從同步延遲導致讀寫不一致方案

     編輯:MySQL 資料庫相關知識

問題本質

主從非同步複制,Slave 主動拉取 Binlog,受負載/網路影響延遲不可控(毫秒到數十秒)。應用寫入 Master 後立即從 Slave 讀取,會讀到舊資料。

常見權宜之計

  • 寫入後 sleep(N):粗暴、延長響應、無法保證
  • 應用層快取寫入資料:複雜度高、一致性難保證

MySQL Proxy 核心方案

架構原理

Proxy 位於 Client 與 Master/Slave 之間,攔截 SQL 路由:

  • 讀(SELECT)→ Slave
  • 寫(INSERT/UPDATE/DELETE)→ Master

同步延遲檢測機制:心跳表

  1. Master 建立單欄自增表 heartbeat(id BIGINT AUTO_INCREMENT)
  2. 所有寫入操作觸發 Trigger 更新 heartbeat:INSERT INTO heartbeat VALUES (NULL)
  3. Proxy 讀請求到來時,並發查詢 Master/Slave 的 SELECT MAX(id) FROM heartbeat
  4. 兩者相等 → Slave 同步追上 → 路由至 Slave
  5. 不相等 → Slave 落後 → 路由至 Master(強一致讀)

心跳表觸發機制

Proxy 路由決策

Lua 腳本關鍵鉤子

function read_query(packet)
    if packet:byte() == proxy.COM_QUERY then
        local sql = packet:sub(2)
        if sql:match("^%s*(INSERT|UPDATE|DELETE)") then
            proxy.queries:append(1, {type=proxy.MYSQL_SEND_QUERY, ...}) -- 發往 Master
        else
            -- 檢查 heartbeat 同步狀態
            proxy.queries:append(2, {type=proxy.MYSQL_SEND_QUERY, ...}) -- 決定 Slave 或 Master
        end
    end
end

優缺點權衡

生產級增強

  • Proxy 叢集 + Keepalived/VIP 高可用
  • 心跳表改用獨立低頻寫入,避免每筆業務寫入都觸發
  • 引入 GTID 並監控 Seconds_Behind_Master 替代心跳表
  • 考慮 ProxySQL 原生支援讀寫分離、查詢路由、快取
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
優點缺點
應用零改動,透明代理每次讀請求雙查 heartbeat,雙倍 QPS 壓力
強一致性保證(讀自己寫入)Proxy 單點故障需高可用部署
連接池複用緩解連接開銷心跳表寫入放大主庫負載