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

MySQL 讀寫分離基礎篇:原理、Lua 腳本與連接池必要性

     編輯:MySQL 資料庫相關知識

讀寫分離基本架構

Application
    │
    ▼
MySQL Proxy (Lua Router)
    │
    ├──▶ Master (Read/Write)  -- 事務、寫入
    │
    └──▶ Slave1, Slave2... (Read Only)  -- 非事務 SELECT

為什麼需要連接池

MySQL 協議流程:

  1. TCP 連線建立
  2. 握手認證(用戶/密碼/權限)
  3. 3. 查詢/結果循環

若在收到 SELECT 才建立連線,認證延遲會嚴重影響效能。Proxy 必須預先建立並維護對每個後端的已認證連線池,查詢到達時直接從池取用、用完歸還。

Lua 讀寫分離核心邏輯

-- 非事務 SELECT → 選擇負載最低的空閒 Slave
if is_in_transaction == 0 and
   packet:byte() == proxy.COM_QUERY and
   packet:sub(2, 7):upper() == "SELECT" then

    local best_idx = 0
    local min_clients = -1

    for i = 1, #proxy.servers do
        local s = proxy.servers[i]
        if s.type == proxy.BACKEND_TYPE_RO and s.idling_connections > 0 then
            if min_clients == -1 or s.connected_clients < min_clients then
                min_clients = s.connected_clients
                best_idx = i
            end
        end
    end

    if best_idx > 0 then
        proxy.connection.backend_ndx = best_idx
    end
end

return proxy.PROXY_SEND_QUERY

關鍵判斷點

條件路由目標
事務中 (BEGIN/START TRANSACTION 後)Master
INSERT/UPDATE/DELETE/REPLACEMaster
非事務 SELECTSlave (負載均衡)
DDL / 管理指令Master

部署最小拓撲

  • 1 台 Master(寫入)
  • ≥1 台 Slave(讀取,同步複制)
  • 1 台 MySQL Proxy(或多台 + VIP 高可用)

常見問題與對策

  1. 主從延遲導致讀舊資料:關鍵業務強制走 Master、或用半同步複制 rpl_semi_sync_master=1。
  2. Proxy 單點故障:多 Proxy 實例 + Keepalived/VIP 或 DNS 輪詢。
  3. 連接池耗盡:調大 pool_size、監控 idling_connections、應用端連線池配合調整。
  4. 準備語句路由錯誤:需在 prepare_query 階段同樣判斷並綁定後端。

進階擴展:分片

同樣在 Lua 中解析 SQL 提取分片鍵,映射到對應分片組:

local shard_id = hash(user_id) % shard_count
proxy.connection.backend_ndx = shard_map[shard_id]

學習路徑建議

  1. 搭建 Master-Slave 複制驗證同步。
  2. 2. 單獨測試 Proxy 直連 Master/Slave 確認連通。 3. 套用讀寫分離 Lua 腳本,壓測驗證路由正確性。 4. 加入監控、高可用、熔斷機制。

掌握基礎原理與 Lua 腳本邏輯,即可理解讀寫分離中間件的核心運作機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved