RDS MySQL代理連接地址的讀寫屬性和讀權重決定連接地址處理的請求類型和處理方式,您可以根據業務實際需求調整每個代理連接地址的讀寫屬性和讀權重。本文介紹讀寫屬性的含義、處理邏輯以及通過控制臺和API接口設置讀寫屬性和讀權重的方法。
關于RDS數據庫代理的使用問題和更多相關信息,歡迎加入用戶釘釘群(106730000316)進行咨詢、反饋和交流 。
前提條件
實例系列需為高可用系列或集群系列。
說明高可用系列:可以創建MySQL只讀實例做讀寫分離。
集群系列:可以直接使用實例的主備節點做讀寫分離。
讀寫屬性說明
讀寫屬性支持設置為讀寫或只讀。
讀寫:用來支持讀寫分離功能實現業務線性擴展。
該模式下代理連接地址(原代理終端)訪問策略中至少配置一個主實例和一個只讀實例,寫請求都只會發往主實例。支持如設置事務拆分、設置連接池等讀寫分離功能。
只讀:用來支持只讀的業務,比如報表。
該模式下代理連接地址訪問策略中需要至少配置一個只讀實例,主實例不會參與路由,不支持設置事務拆分。
當代理連接地址訪問策略的讀寫屬性設置為只讀時,RDS會根據代理連接地址訪問策略中配置的只讀實例輪詢分配連接,即一個客戶端連接僅對應到一個只讀實例的一個連接,而主實例不會參與到該分配,可用的業務連接總數是所有只讀實例上的連接數之和。
對于RDS MySQL集群系列實例,讀寫屬性設置為讀寫模式時,寫請求只會發往主節點;讀寫屬性設置為只讀時,主節點不會參與路由,RDS會根據代理連接地址訪問策略中配置的備節點輪詢分配連接。
數據庫代理的IP白名單和RDS主實例的IP白名單保持一致。RDS主實例的IP白名單更新,數據庫代理的IP白名單也會同步更新。
為避免單點故障,建議您為一個主實例創建至少兩個只讀實例,并將只讀實例進行跨可用區部署。若想降低跨可用區訪問帶來的網絡延遲,您可以開通就近訪問功能,詳情請參見設置就近訪問。
讀寫屬性處理邏輯
讀寫屬性 | 權限分配方式 | 主實例權重 | 正常情況 | 刪除最后一個只讀實例 | 只讀實例全部故障 |
只讀 | 系統分配或自定義 | 主實例權重不可設置 |
|
|
|
讀寫 | 系統分配 | 等于0 具體請參見系統默認讀權重分配規則。 |
|
|
|
自定義 | 大于0 |
|
|
| |
等于0 |
|
|
|
不轉發:表示在只讀屬性中,主實例不參與只讀請求的轉發。
連接報錯:表示在只讀屬性中,代理訪問策略不可讀不可寫時連接會報錯。
在讀寫模式下,當主實例權重配置為0時,默認不將讀請求轉發到主實例,但是當只讀節點異常,強制Hint指定,或者開啟了事務拆分的情況下,讀請求會被轉發到主實例。
操作步驟
訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側導航欄,單擊數據庫代理。
在連接信息區域,在目標代理連接地址操作列,單擊修改配置。
在彈出的對話框內,在讀寫屬性右側選中讀寫(讀寫分離)或只讀(不連接主實例,無法接受請求)。
在讀權重分配區域,選擇系統分配或自定義:
系統分配:系統根據實例規格自動分配各個實例的讀權重。后續該主實例下新增的只讀實例也會自動按照系統分配的權重加入到讀寫分離鏈路中,無需手動設置。更多信息,請參見系統默認讀權重分配規則。
自定義:手動設置各個實例的讀權重,取值范圍為0~10000。后續該主實例下新增只讀實例的讀權重默認為0,需要手動修改。
就近訪問功能是保證客戶端到代理之間的路由,而讀權重是設置代理到后端MySQL實例之間的路由,兩者互不相關。但需要將二者結合使用,才能做到最小訪問延遲。
實例的讀權重越高,處理的讀請求越多。例如,假設主實例有3個只讀實例,讀權重分別為0、100、200和200,則表示主實例不處理讀請求(寫請求仍然自動發往主實例),3個只讀實例按照1:2:2的比例處理讀請求。
若只讀實例被刪除,則該實例的權重會被自動移除,其他實例權重不變。
不支持為已經設置只讀實例延時復制時間的實例設置權重。
修改本參數實時生效,不會造成業務不可用。修改完成后,已存在的連接不會斷開重連,新連接和存量老連接都會根據新權重進行分配。
相關API
API | 描述 |
查詢RDS實例的數據庫代理詳情。 | |
查詢RDS實例數據庫代理的代理連接地址訪問策略(原代理終端信息)。 | |
修改RDS實例數據庫代理的代理連接地址訪問策略(原設置代理終端)。 |
附錄:通過Hint指定SQL發往主實例、只讀實例或主備節點
在讀寫分離權重分配體系之外,Hint可作為一種SQL補充語法來指定相關SQL到高可用系列的主實例和只讀實例或集群系列的主備節點執行。
RDS讀寫分離支持的Hint格式如下所示:
對于RDS MySQL高可用系列實例:
/*FORCE_MASTER*/
:指定后續SQL到主實例執行。/*FORCE_SLAVE*/
:指定后續SQL到只讀實例執行。
對于RDS MySQL集群系列實例:
/*FORCE_MASTER*/
:指定后續SQL到主節點執行。/*FORCE_SLAVE*/
:指定后續SQL到備節點執行。
對于RDS MySQL高可用系列實例,使用/*FORCE_MASTER*/時,即使主實例的讀權重為0,SQL也會被路由到主實例。
對于RDS MySQL集群系列實例,使用/*FORCE_MASTER*/時,即使主節點的讀權重為0,SQL也會被路由到主節點。
例如,對于RDS MySQL高可用系列實例,在如下語句前加入Hint后,不論權重如何設置,該語句一定會路由到主實例上執行。
/*FORCE_MASTER*/ SELECT * FROM table_name;