在少寫多讀的情境下,主執行個體會有較大的讀請求處理壓力,可能影響到主執行個體的效能。RDS MySQL的讀寫分離功能通過資料庫Proxy 位址(讀寫屬性的代理終端)實現讀寫請求的自動轉寄,將讀請求分流到唯讀執行個體,減輕主執行個體的壓力。
介紹
資料庫代理的讀寫分離功能,可使寫請求自動轉寄到主執行個體,讀請求自動轉寄到各個唯讀執行個體,實現讀寫請求的自動分流,減輕主執行個體的壓力。
基礎系列:不支援。
高可用系列:需要先建立MySQL唯讀執行個體,再開通資料庫代理後使用讀寫分離功能。
叢集系列:可以直接開通資料庫代理並使用讀寫分離功能。
優勢
統一讀寫分離地址,方便維護。
不開通讀寫分離時,您需要在應用程式中分別配置主執行個體和每個唯讀執行個體的串連地址,才能實現將寫請求發往主執行個體而將讀請求發往唯讀執行個體。
RDS讀寫分離功能提供資料庫代理串連地址,您串連該地址後即可對主執行個體和唯讀執行個體進行讀寫操作,讀寫請求被自動轉寄到對應執行個體,可降低維護成本。
同時,您只需添加唯讀執行個體的個數,即可不斷擴充系統的處理能力,應用程式無需做任何修改。
原生鏈路支援,提升效能,減少維護成本。
如果您在雲上自行搭建代理層實現讀寫分離,資料在到達資料庫之前需要經歷多個組件的語句解析和轉寄,對響應延遲有較大的影響。而RDS讀寫分離內建在RDS原生生態裡,能夠有效降低延遲,提升處理速度,同時減少客戶的維護成本。
可設權重和閾值,符合多情境使用。
您可以設定主執行個體和唯讀執行個體的讀請求權重,通過設定不同的權重來控制讀流量的分發,以及設定唯讀執行個體的延遲閾值。
執行個體健全狀態檢查,提升資料庫系統的可用性。
讀寫分離模組將自動對主執行個體和唯讀執行個體進行健全狀態檢查,當發現某個執行個體出現宕機或者延遲超過閾值時,將不再分配讀請求給該執行個體,讀寫請求在剩餘的健康執行個體間進行分配。以此確保單個唯讀執行個體發生故障時,不會影響應用的正常訪問。當執行個體被修複後,RDS會自動將該執行個體納回請求分配體系內。
說明為避免單點故障,建議您為一個主執行個體建立至少兩個唯讀執行個體。
請求轉寄邏輯
只發往主執行個體
INSERT、UPDATE、DELETE、SELECT FOR UPDATE。
所有DDL操作(建表/庫、刪表/庫、變更表結構、許可權等)。
所有事務中的請求。開啟事務拆分功能後的路由詳情請參見設定事務拆分。
RR(可重複讀)隔離等級及以上的非唯讀事務。
使用者自訂函數。
預存程序。
使用到暫存資料表(顯示建立)的請求。
SELECT last_insert_id()。
所有對使用者變數的查詢和更改。
KILL(SQL語句中的KILL,非命令KILL)。
LOCK相關語句 (LOCK TABLE、UNLOCK TABLE等)。
FLUSH相關的語句(如FTWRL)。
SAVEPOINT語句。
發往唯讀執行個體或主執行個體
非事務中的SELECT。
唯讀事務(START TRANSACTION READ ONLY)。
總是發往所有執行個體
所有系統變數的更改。
USE命令。
SHOW PROCESSLIST。
說明執行SHOW PROCESSLIST命令後,代理將返回所有節點的PROCESSLIST匯總資訊。
NAMED PREPARE命令。
COM_CHANGE_USER/COM_QUIT/COM_SET_OPTION等命令。
開啟讀寫分離
僅高可用系列(需搭配唯讀執行個體)和叢集系列執行個體可以使用讀寫分離功能。開通資料庫代理後,執行個體自動開啟讀寫分離,無需您手動操作:
高可用系列:高可用系列執行個體的備節點不可訪問,如您希望實現讀寫分離,需要先建立MySQL唯讀執行個體,再開通資料庫代理。
叢集系列:叢集系列執行個體的備節點可訪問(唯讀),您可以直接開通資料庫代理並使用讀寫分離功能。
使用讀寫分離功能時,您需要通過資料庫代理串連地址()串連RDS執行個體,經過代理串連地址的讀寫請求會根據請求轉寄邏輯自動分發至對應節點處理。開通讀寫分離功能後,您還可以進行以下操作:
設定讀寫屬性和讀權重:更改代理串連地址的讀寫屬性和各節點的讀權重分配,實現業務隔離,調整各節點負載。
查詢SQL命令的分發方向:您可以臨時開通SQL洞察和審計功能(收費,開通後可關閉),查詢每個節點上處理的SQL命令,瞭解每個讀寫請求的分發方向。
代理串連地址的讀寫屬性處理邏輯
讀寫屬性 | 許可權分配方式 | 主執行個體權重 | 正常情況 | 刪除最後一個唯讀執行個體 | 唯讀執行個體全部故障 |
唯讀 | 系統分配或自訂 | 主執行個體權重不可設定 | 主執行個體:不可讀不可寫(不轉寄) Proxy 位址:可讀不可寫 | 主執行個體:不可讀不可寫(不轉寄) Proxy 位址:不可讀不可寫(串連報錯) | 主執行個體:不可讀不可寫(不轉寄) Proxy 位址:不可讀不可寫(串連報錯) |
讀寫 | 系統分配 | 等於0 具體請參見系統預設讀權重分配規則。 | 主執行個體:不可讀可寫 Proxy 位址:可讀可寫 | 主執行個體:可讀可寫 Proxy 位址:可讀可寫 | 主執行個體:可讀可寫 Proxy 位址:可讀可寫 |
自訂 | 大於0 | 主執行個體:可讀可寫 Proxy 位址:可讀可寫 | 主執行個體:可讀可寫 Proxy 位址:可讀可寫 | 主執行個體:可讀可寫 Proxy 位址:可讀可寫 | |
等於0 | 主執行個體:不可讀可寫 Proxy 位址:可讀可寫 | 主執行個體:可讀可寫 Proxy 位址:可讀可寫 | 主執行個體:可讀可寫 Proxy 位址:可讀可寫 |
不轉寄:表示在唯讀屬性中,主執行個體不參與唯讀請求的轉寄。
串連報錯:表示在唯讀屬性中,代理終端不可讀不可寫時串連會報錯。
在讀寫入模式下,當主執行個體權重配置為0時,預設不將讀請求轉寄到主執行個體,但是當唯讀節點異常,強制Hint指定,或者開啟了事務拆分的情況下,讀請求會被轉寄到主執行個體。
更多資訊,請參見設定讀寫屬性和讀權重。