在RDS MySQL執行個體進行切換類的營運操作時,應用程式與代理的串連會有短暫的斷開,會對業務造成一定影響,您可以參考本文使用串連保持功能,保證串連不斷開,提升產品可用性,降低營運成本。
功能簡介
RDS MySQL代理的串連保持功能,即在發生執行個體切換類的操作時,能保持應用程式與代理的串連不斷開,使用者通過Proxy 位址訪問資料庫的應用程式不會收到串連斷開的報錯,如下圖所示。
實現原理
資料庫代理串連分為前端串連(代理與用戶端的串連)和後端串連(代理與資料庫的串連),在執行執行個體切換類操作時,能夠在後端串連斷開的情況下,保留前端串連,代理在此基礎上實現了串連保持能力。
對於後端資料庫是RDS MySQL的串連,串連保持的關鍵在於後端串連(代理與後端RDS MySQL串連)的串連狀態恢複。
RDS MySQL的串連狀態通常包括系統變數、使用者變數、暫存資料表、字元集編碼、事務狀態和Prepare語句狀態資訊等。本文將以set names utf8mb4作為串連狀態為例介紹RDS MySQL串連保持的實現原理。
主動切換:
主動切換情境下,RDS MySQL資料庫代理實現串連保持分為三個步驟:
包含主動切換的營運操作:
主動主備切換
升級小版本
修改重啟類參數(修改參數時需重啟執行個體)
變更主執行個體配置
開始切換:阻塞新的串連和新的請求
由於代理不具備事務保持能力,因此,對於不同狀態的會話,採取不同的處理方式:
阻塞期間事務活躍的會話:代理將允許存取請求到後端資料庫主節點執行。
阻塞期間新開啟的事務的會話:代理將阻塞請求,用戶端的現象是阻塞等待服務端回包。
阻塞結束事務仍活躍的會話:用戶端與代理的串連將會斷開,後端資料庫會對未提交的事務進行復原。
切換中:切換存量串連
切換過程中會修改存量串連的切換狀態:
無法持續連線:代理會將整個串連斷開。
能夠持續連線:串連將會切換至新的資料庫節點。
串連池中原資料庫主節點的串連:會被清理。
切換完成:恢複串連
對於能成功保留的串連,代理與後端新的資料庫主節點建立串連,並且恢複串連狀態。
故障切換:
當系統出現故障時,RDS執行個體會自動進行主備切換,提升一個備節點為主節點,這種切換是非預期的,稱為故障切換(Failover)。
代理會緩衝當前正在資料庫上執行或將要轉寄的SQL語句。當資料庫發生故障時,代理與後端資料庫的串連將會斷開。代理感知到資料庫Failover後,不會立刻斷開與用戶端的串連,代理會將失敗的讀請求重新轉寄到可用的資料庫節點,並且恢複串連狀態。
對於失敗的寫請求,代理不能確定資料庫是否寫成功,因此故障切換時的會話保持不支援寫請求。
開啟串連保持
2024年01月09日起,符合開啟串連保持功能條件的RDS MySQL執行個體在開通資料庫代理時,會預設開啟串連保持功能。開啟串連保持功能後,您可以隨時關閉該功能。
前提條件
主動切換的串連保持
RDS執行個體滿足以下條件:
版本:MySQL 5.6或5.7或8.0
系列:高可用系列、叢集系列
儲存類型:雲端硬碟、本地碟
代理類型:通用型、獨享型
已開通資料庫代理,且代理的核心版本不低於1.14.5_20231207。
故障切換的串連保持
RDS執行個體滿足以下條件:
版本:MySQL 5.6或5.7或8.0
系列:高可用系列、叢集系列
儲存類型:雲端硬碟、本地碟
代理類型:獨享型
說明通用型資料庫代理僅支援主動切換情境下的串連保持,獨享型資料庫代理支援主動切換和故障切換情境下的串連保持。
已開通資料庫代理,且代理的核心版本不低於2.9.1。
開啟步驟
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列,單擊資料庫代理。
在基本資料地區,單擊串連保持右側的開啟。
說明若無串連保持字樣,說明您的執行個體不符合串連保持的開通條件。
使用串連保持
前提條件
已開通資料庫代理。
資料庫代理已開啟串連保持。
操作步驟
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列,單擊資料庫代理。
根據業務需要配置目標代理串連地址的存取原則,詳情請參見設定資料庫代理串連地址存取原則。其中讀寫類型設定為讀寫(讀寫分離)。
根據業務需要申請目標代理串連地址的內網/外網地址,詳情請參見設定資料庫代理串連地址。
在應用程式中,使用目標代理串連地址的內網/外網地址與連接埠號碼進行資料庫的串連。
資料庫執行個體進行切換的營運類操作時,資料庫代理會自動實現串連保持功能,使用代理串連地址的應用程式與代理的串連不會斷開。
使用限制
在切換過程中,串連保持功能無法保持如下情境中的串連:
MySQL服務端還沒有完全返回包的串連。例如,100 MB的結果集,只返回了50 MB的結果集,剩餘的結果集還在返回中。
存在未提交的事務。
串連上使用過change user語句。
串連上使用過LOAD DATA語句。
存在暫存資料表。
通過Proxy 位址進行Binlog訂閱的串連。
不支援FOUND_ROWS、ROW_COUNT和LAST_INSERT_ID函數的調用,這些函數可以調用成功,但是無法保證調用結果的正確性。其中
SELECT FOUND_ROWS()
的用法MySQL官方已不推薦,建議您將SELECT FOUND_ROWS()
替換為SELECT COUNT(*) FROM tb1
進行查詢,詳情請參見FOUND_ROWS()。
注意事項
由於串連會重連,所以使用
select connection_id()
查詢當前串連的thread id可能會變化。由於串連會重連,所以
show processlist
或者SQL洞察中顯示的IP地址和連接埠,可能會與用戶端實際的IP地址和連接埠不一致。如果串連上存在使用者自訂的變數,串連能保持,但使用者變數會失效。
關閉串連保持
前提條件
執行個體已開啟串連保持功能。
操作步驟
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列,單擊資料庫代理。
在基本資料地區,在串連保持右側單擊關閉。
功能測試
本文僅對主動切換情境進行測試。
測試環境
測試用RDS MySQL執行個體如下:
MySQL 8.0版本、高可用系列。
執行個體規格為8核16 GB獨享型規格(mysql.x2.xlarge.2c)。
測試載入器:Sysbench
測試資料如下:
100張表,其中每張表包含40000行資料。
並發線程數為128。
測試方法
在不同營運情境下,測試RDS MySQL執行個體的串連保活率(即執行營運操作前後的串連保持比例)。
執行測試語句如下:
sysbench --db-driver=mysql --mysql-host=127.X.X.1 --mysql-port=3306 --mysql-user=username --mysql-password='' --tables=100 --table-size=40000 --threads=128 --mysql-db=sbtest --report-interval=5 --time=600 oltp_read_write run
上述測試語句中的關鍵參數含義如下:
db-driver:資料庫引擎
mysql-host:資料庫Proxy 位址
tables:資料庫中的表數量
table-size:每張表包含的記錄條數
threads:並發線程數
time:測試時間,單位: 秒
測試結果
在如下測試的營運情境中,RDS MySQL執行個體均能保持100%的串連保活率。
主動切換情境 | 保活率 |
升級小版本 | 100% |
主動主備切換 | 100% |
變更主執行個體配置 | 100% |
修改重啟類參數 | 100% |
相關API
API | 描述 |
修改RDS執行個體的資料庫代理功能。 | |
查詢RDS執行個體的資料庫代理詳情。 |