RDS MySQL代理串連地址的讀寫屬性和讀權重決定串連地址處理的請求類型和處理方式,您可以根據業務實際需求調整每個代理串連地址的讀寫屬性和讀權重。本文介紹讀寫屬性的含義、處理邏輯以及通過控制台和API介面設定讀寫屬性和讀權重的方法。
前提條件
執行個體系列需為高可用系列或叢集系列。
說明高可用系列:可以建立MySQL唯讀執行個體做讀寫分離。
叢集系列:可以直接使用執行個體的主備節點做讀寫分離。
讀寫屬性說明
讀寫屬性支援設定為讀寫或唯讀。
讀寫:用來支援讀寫分離功能實現業務線性擴充。
該模式下代理串連地址(原代理終端)存取原則中至少配置一個主執行個體和一個唯讀執行個體,寫請求都只會發往主執行個體。支援如設定事務拆分、設定串連池等讀寫分離功能。
唯讀:用來支援唯讀業務,比如報表。
該模式下代理串連地址存取原則中需要至少配置一個唯讀執行個體,主執行個體不會參與路由,不支援設定事務拆分。
當代理串連地址存取原則的讀寫屬性設定為唯讀時,RDS會根據代理串連地址存取原則中配置的唯讀執行個體輪詢分配串連,即一個用戶端串連僅對應到一個唯讀執行個體的一個串連,而主執行個體不會參與到該分配,可用的Business Connectivity總數是所有隻讀執行個體上的串連數之和。
對於RDS MySQL叢集系列執行個體,讀寫屬性設定為讀寫模式時,寫請求只會發往主節點;讀寫屬性設定為唯讀時,主節點不會參與路由,RDS會根據代理串連地址存取原則中配置的備節點輪詢分配串連。
資料庫代理的IP白名單和RDS主執行個體的IP白名單保持一致。RDS主執行個體的IP白名單更新,資料庫代理的IP白名單也會同步更新。
為避免單點故障,建議您為一個主執行個體建立至少兩個唯讀執行個體,並將唯讀執行個體進行跨可用性區域部署。若想降低跨可用性區域訪問帶來的網路延遲,您可以開通就近訪問功能,詳情請參見設定就近訪問。
讀寫屬性處理邏輯
讀寫屬性 | 權重分配方式 | 主執行個體權重 | 正常情況 | 刪除最後一個唯讀執行個體 | 唯讀執行個體全部故障 |
唯讀 | 系統分配或自訂 | 主執行個體權重不可設定 |
|
|
|
讀寫 | 系統分配 | 等於0 具體請參見系統預設讀權重分配規則。 |
|
|
|
自訂 | 大於0 |
|
|
| |
等於0 |
|
|
|
不轉寄:表示在唯讀屬性中,主執行個體不參與唯讀請求的轉寄。
串連報錯:表示在唯讀屬性中,代理存取原則不可讀不可寫時串連會報錯。
在讀寫入模式下,當主執行個體權重配置為0時,預設不將讀請求轉寄到主執行個體,但是當唯讀節點異常,強制Hint指定,或者開啟了事務拆分的情況下,讀請求會被轉寄到主執行個體。
權重對營運的影響
如何查看資料庫代理核心小版本請參見查看代理核心小版本。如需升級資料庫代理核心小版本,請參見升級資料庫代理核心小版本。
營運動作 | 核心版本大於等於2.8.41 | 核心版本小於2.8.41 |
權重為0的節點在新會話開啟時,是否建立串連? | 否 | 否 |
權重從非0改為0,節點是否會從存量會話上摘除? | 否 | 否 |
權重從非0改為0,存量會話的路由是否按照最新的權重轉寄? | 否 |
|
權重從0改為非0,節點是否會加入存量會話? | 否 | 是 |
權重從0改為非0,存量會話的路由是否按照最新的權重轉寄? | 否 |
|
摘除權重非0的唯讀節點是否會導致存量會話閃斷? | 否 說明 2.x版本的資料庫代理雖然存在 | 是 |
摘除權重為0的唯讀節點是否會導致存量會話閃斷? | 否 | 如果存在存量會話且會話上有請求在執行,則會閃斷,否則不會。 |
權重為0的唯讀節點上Kill串連,串連是否斷開? | 是 | 在1.x版本的資料庫代理中,如果active session未降至0,則串連會被斷開;否則不會斷開,且被Kill的串連會自動重連。 |
權重非0的唯讀節點上Kill串連,串連是否斷開? |
負載平衡演算法
2.25.4之前版本:僅支援基於權重比例的負載平衡策略。
2.25.4及以上版本:新增基於活躍請求數的負載平衡策略,目前共支援以下兩種路由策略:
基於活躍請求數負載平衡(2.25.4及以上版本)
基於權重比例負載平衡(所有版本均支援)
推薦使用基於活躍請求數的負載平衡策略,因為其叢集峰值效能更好,其次能降低單節點故障對叢集整體的影響。
基於權重比例負載平衡
嚴格按照節點的權重比例分發讀請求。採用Round-Robin演算法,通過節點的current_weight值實現按權重比例分發讀請求。具體流程如下:
選擇規則:每輪調度時,選擇
current_weight值最大的節點;若權重相同,則優先選擇配置列表中順序靠前的節點。權重累加:每輪調度後,所有節點的
current_weight值均增加自身權重。權重重設:若某節點被選中,則其
current_weight減去所有節點權重的總和。
樣本:
主節點權重100,唯讀節點1權重200, 唯讀節點2權重200。
輪次 | 主節點current_weight | 唯讀節點1 current_weight | 唯讀節點2 current_weight | 路由節點 |
1 | 0 | 0 | 0 | 主節點 |
2 | -400 | 200 | 200 | 唯讀節點1 |
3 | -300 | -100 | 400 | 唯讀節點2 |
4 | -200 | 100 | 100 | 唯讀節點1 |
5 | -100 | -200 | 300 | 唯讀節點2 |
6 | 0 | 0 | 0 | 主節點 |
基於活躍請求數負載平衡
請求優先發往負載低的節點。規則是優先路由至當前 (活躍請求數/節點權重) 值最低的節點。
樣本:
主節點權重100,唯讀節點1權重200, 唯讀節點2權重200。
輪次 | 主節點活躍請求數 | 唯讀節點1 活躍請求數 | 唯讀節點2 活躍請求數 | 路由節點 |
1 | 1
| 5
| 6
| 主節點 |
2 | 2 | 4 | 6 | 唯讀節點1 |
3 | 2 | 5 | 3 | 唯讀節點2 |
4 | 1 | 2 | 3 | 唯讀節點1 |
5 | 1 | 2 | 1 | 唯讀節點2 |
6 | 0 | 3 | 3 | 主節點 |
操作步驟
訪問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;附錄二:無感下線唯讀執行個體最佳實務
假設,現有一主兩備的讀寫分離環境,主執行個體A及唯讀執行個體B和C。如果希望無感下線唯讀執行個體C,可以按照以下步驟操作。
訪問RDS執行個體列表,選擇地區並單擊執行個體A的ID。
在左側單擊資料庫代理,在串連拓撲管理地區,單擊修改配置。

在修改代理串連地址(終端)配置中,將待下線唯讀節點C的讀權重設定為0。

前往唯讀執行個體C的監控與警示頁面,觀察會話串連監控指標的active_session並等待其跌至0。
說明僅需關注active_session是否為0,如果長時間不為0,可執行Kill session操作。
前往主執行個體A的資料庫代理頁簽將該唯讀執行個體C從代理串連地址中刪除。