RDS MySQL代理串連地址的讀寫屬性和讀權重決定串連地址處理的請求類型和處理方式,您可以根據業務實際需求調整每個代理串連地址的讀寫屬性和讀權重。本文介紹讀寫屬性的含義、處理邏輯以及通過控制台和API介面設定讀寫屬性和讀權重的方法。
前提條件
執行個體系列需為高可用系列或叢集系列。
說明高可用系列:可以建立MySQL唯讀執行個體做讀寫分離。
叢集系列:可以直接使用執行個體的主備節點做讀寫分離。
讀寫屬性說明
讀寫屬性支援設定為讀寫或唯讀。
讀寫:用來支援讀寫分離功能實現業務線性擴充。
該模式下代理串連地址(原代理終端)存取原則中至少配置一個主執行個體和一個唯讀執行個體,寫請求都只會發往主執行個體。支援如設定事務拆分、設定串連池等讀寫分離功能。
唯讀:用來支援唯讀業務,比如報表。
該模式下代理串連地址存取原則中需要至少配置一個唯讀執行個體,主執行個體不會參與路由,不支援設定事務拆分。
當代理串連地址存取原則的讀寫屬性設定為唯讀時,RDS會根據代理串連地址存取原則中配置的唯讀執行個體輪詢分配串連,即一個用戶端串連僅對應到一個唯讀執行個體的一個串連,而主執行個體不會參與到該分配,可用的Business Connectivity總數是所有隻讀執行個體上的串連數之和。
對於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;