在少寫多讀的場景下,主實例會有較大的讀請求處理壓力,可能影響到主實例的性能。RDS MySQL的讀寫分離功能通過數據庫代理地址(讀寫屬性的代理終端)實現讀寫請求的自動轉發,將讀請求分流到只讀實例,減輕主實例的壓力。
介紹
數據庫代理的讀寫分離功能,可使寫請求自動轉發到主實例,讀請求自動轉發到各個只讀實例,實現讀寫請求的自動分流,減輕主實例的壓力。
優勢
統一讀寫分離地址,方便維護。
不開通讀寫分離時,您需要在應用程序中分別配置主實例和每個只讀實例的連接地址,才能實現將寫請求發往主實例而將讀請求發往只讀實例。
RDS讀寫分離功能提供數據庫代理連接地址,您連接該地址后即可對主實例和只讀實例進行讀寫操作,讀寫請求被自動轉發到對應實例,可降低維護成本。
同時,您只需添加只讀實例的個數,即可不斷擴展系統的處理能力,應用程序無需做任何修改。
原生鏈路支持,提升性能,減少維護成本。
如果您在云上自行搭建代理層實現讀寫分離,數據在到達數據庫之前需要經歷多個組件的語句解析和轉發,對響應延遲有較大的影響。而RDS讀寫分離內置在RDS原生生態里,能夠有效降低延遲,提升處理速度,同時減少客戶的維護成本。
可設權重和閾值,符合多場景使用。
您可以設置主實例和只讀實例的讀請求權重,通過設置不同的權重來控制流量的分發,以及設置只讀實例的延遲閾值。
實例健康檢查,提升數據庫系統的可用性。
讀寫分離模塊將自動對主實例和只讀實例進行健康檢查,當發現某個實例出現宕機或者延遲超過閾值時,將不再分配讀請求給該實例,讀寫請求在剩余的健康實例間進行分配。以此確保單個只讀實例發生故障時,不會影響應用的正常訪問。當實例被修復后,RDS會自動將該實例納回請求分配體系內。
說明為避免單點故障,建議您為一個主實例創建至少兩個只讀實例。
請求轉發邏輯
只發往主實例
INSERT、UPDATE、DELETE、SELECT FOR UPDATE。
所有DDL操作(建表/庫、刪表/庫、變更表結構、權限等)。
所有事務中的請求。
用戶自定義函數。
存儲過程。
EXECUTE語句。
使用到臨時表的請求。
SELECT last_insert_id()。
所有對用戶變量的查詢和更改。
KILL(SQL語句中的KILL,非命令KILL)。
發往只讀實例或主實例
非事務中的SELECT。
COM_STMT_EXECUTE命令。
總是發往所有實例
所有系統變量的更改。
USE命令。
SHOW PROCESSLIST。
說明執行SHOW PROCESSLIST命令后,代理將返回所有節點的PROCESSLIST匯總信息。
COM_STMT_PREPARE命令。
COM_CHANGE_USER/COM_QUIT/COM_SET_OPTION等命令。
讀寫屬性處理邏輯
讀寫屬性 | 權限分配方式 | 主實例權重 | 正常情況 | 刪除最后一個只讀實例 | 只讀實例全部故障 |
只讀 | 系統分配或自定義 | 主實例權重不可設置 | 主實例:不可讀不可寫(不轉發) 代理地址:可讀不可寫 | 主實例:不可讀不可寫(不轉發) 代理地址:不可讀不可寫(連接報錯) | 主實例:不可讀不可寫(不轉發) 代理地址:不可讀不可寫(連接報錯) |
讀寫 | 系統分配 | 等于0 具體請參見系統默認讀權重分配規則。 | 主實例:不可讀可寫 代理地址:可讀可寫 | 主實例:可讀可寫 代理地址:可讀可寫 | 主實例:可讀可寫 代理地址:可讀可寫 |
自定義 | 大于0 | 主實例:可讀可寫 代理地址:可讀可寫 | 主實例:可讀可寫 代理地址:可讀可寫 | 主實例:可讀可寫 代理地址:可讀可寫 | |
等于0 | 主實例:不可讀可寫 代理地址:可讀可寫 | 主實例:可讀可寫 代理地址:可讀可寫 | 主實例:可讀可寫 代理地址:可讀可寫 |
不轉發:表示在只讀屬性中,主實例不參與只讀請求的轉發。
連接報錯:表示在只讀屬性中,代理終端不可讀不可寫時連接會報錯。
在讀寫模式下,當主實例權重配置為0時,默認不將讀請求轉發到主實例,但是當只讀節點異常,強制Hint指定,或者開啟了事務拆分的情況下,讀請求會被轉發到主實例。
更多信息,請參見設置讀寫屬性和讀權重。
操作步驟
注意事項
請參見數據庫代理注意事項。
驗證讀寫分離
請參見驗證讀寫分離。
常見問題
請參見數據庫代理常見問題。