主從非同步複制,Slave 主動拉取 Binlog,受負載/網路影響延遲不可控(毫秒到數十秒)。應用寫入 Master 後立即從 Slave 讀取,會讀到舊資料。
sleep(N):粗暴、延長響應、無法保證Proxy 位於 Client 與 Master/Slave 之間,攔截 SQL 路由:
heartbeat(id BIGINT AUTO_INCREMENT)INSERT INTO heartbeat VALUES (NULL)SELECT MAX(id) FROM heartbeat

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
| 優點 | 缺點 |
|---|---|
| 應用零改動,透明代理 | 每次讀請求雙查 heartbeat,雙倍 QPS 壓力 |
| 強一致性保證(讀自己寫入) | Proxy 單點故障需高可用部署 |
| 連接池複用緩解連接開銷 | 心跳表寫入放大主庫負載 |