設(shè)置連接保持
在RDS MySQL實例進行切換類的運維操作時,應(yīng)用程序與代理的連接會有短暫的斷開,會對業(yè)務(wù)造成一定影響,您可以參考本文使用連接保持功能,保證連接不斷開,提升產(chǎn)品可用性,降低運維成本。
功能簡介
RDS MySQL代理的連接保持功能,即在發(fā)生實例切換類的操作時,能保持應(yīng)用程序與代理的連接不斷開,用戶通過代理地址訪問數(shù)據(jù)庫的應(yīng)用程序不會收到連接斷開的報錯,如下圖所示。
實現(xiàn)原理
數(shù)據(jù)庫代理連接分為前端連接(代理與客戶端的連接)和后端連接(代理與數(shù)據(jù)庫的連接),在執(zhí)行實例切換類操作時,能夠在后端連接斷開的情況下,保留前端連接,代理在此基礎(chǔ)上實現(xiàn)了連接保持能力。
對于后端數(shù)據(jù)庫是RDS MySQL的連接,連接保持的關(guān)鍵在于后端連接(代理與后端RDS MySQL連接)的連接狀態(tài)恢復(fù)。
RDS MySQL的連接狀態(tài)通常包括系統(tǒng)變量、用戶變量、臨時表、字符集編碼、事務(wù)狀態(tài)和Prepare語句狀態(tài)信息等。本文將以set names utf8mb4作為連接狀態(tài)為例介紹RDS MySQL連接保持的實現(xiàn)原理。
主動切換:
主動切換場景下,RDS MySQL數(shù)據(jù)庫代理實現(xiàn)連接保持分為三個步驟:
包含主動切換的運維操作:
主動主備切換
升級小版本
修改重啟類參數(shù)(修改參數(shù)時需重啟實例)
變更主實例配置
開始切換:阻塞新的連接和新的請求
由于代理不具備事務(wù)保持能力,因此,對于不同狀態(tài)的會話,采取不同的處理方式:
阻塞期間事務(wù)活躍的會話:代理將放行請求到后端數(shù)據(jù)庫主節(jié)點執(zhí)行。
阻塞期間新開啟的事務(wù)的會話:代理將阻塞請求,客戶端的現(xiàn)象是阻塞等待服務(wù)端回包。
阻塞結(jié)束事務(wù)仍活躍的會話:客戶端與代理的連接將會斷開,后端數(shù)據(jù)庫會對未提交的事務(wù)進行回滾。
切換中:切換存量連接
切換過程中會修改存量連接的切換狀態(tài):
無法保持的連接:代理會將整個連接斷開。
能夠保持的連接:連接將會切換至新的數(shù)據(jù)庫節(jié)點。
連接池中原數(shù)據(jù)庫主節(jié)點的連接:會被清理。
切換完成:恢復(fù)連接
對于能成功保留的連接,代理與后端新的數(shù)據(jù)庫主節(jié)點建立連接,并且恢復(fù)連接狀態(tài)。
故障切換:
當系統(tǒng)出現(xiàn)故障時,RDS實例會自動進行主備切換,提升一個備節(jié)點為主節(jié)點,這種切換是非預(yù)期的,稱為故障切換(Failover)。
代理會緩存當前正在數(shù)據(jù)庫上執(zhí)行或?qū)⒁D(zhuǎn)發(fā)的SQL語句。當數(shù)據(jù)庫發(fā)生故障時,代理與后端數(shù)據(jù)庫的連接將會斷開。代理感知到數(shù)據(jù)庫Failover后,不會立刻斷開與客戶端的連接,代理會將失敗的讀請求重新轉(zhuǎn)發(fā)到可用的數(shù)據(jù)庫節(jié)點,并且恢復(fù)連接狀態(tài)。
對于失敗的寫請求,代理不能確定數(shù)據(jù)庫是否寫成功,因此故障切換時的會話保持不支持寫請求。
開啟連接保持
2024年01月09日起,符合開啟連接保持功能條件的RDS MySQL實例在開通數(shù)據(jù)庫代理時,會默認開啟連接保持功能。開啟連接保持功能后,您可以隨時關(guān)閉該功能。
前提條件
主動切換的連接保持
RDS實例滿足以下條件:
版本:MySQL 5.6或5.7或8.0
系列:高可用系列、集群系列
存儲類型:云盤、本地盤
代理類型:通用型、獨享型
已開通數(shù)據(jù)庫代理,且代理的內(nèi)核版本不低于1.14.5_20231207。
故障切換的連接保持
RDS實例滿足以下條件:
版本:MySQL 5.6或5.7或8.0
系列:高可用系列、集群系列
存儲類型:云盤、本地盤
代理類型:獨享型
說明通用型數(shù)據(jù)庫代理僅支持主動切換場景下的連接保持,獨享型數(shù)據(jù)庫代理支持主動切換和故障切換場景下的連接保持。
已開通數(shù)據(jù)庫代理,且代理的內(nèi)核版本不低于2.9.1。
開啟步驟
訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側(cè)導(dǎo)航欄,單擊數(shù)據(jù)庫代理。
在基本信息區(qū)域,單擊連接保持右側(cè)的開啟。
說明若無連接保持字樣,說明您的實例不符合連接保持的開通條件。
使用連接保持
前提條件
已開通數(shù)據(jù)庫代理。
數(shù)據(jù)庫代理已開啟連接保持。
操作步驟
訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側(cè)導(dǎo)航欄,單擊數(shù)據(jù)庫代理。
根據(jù)業(yè)務(wù)需要配置目標代理連接地址的訪問策略,詳情請參見配置數(shù)據(jù)庫代理連接地址訪問策略。其中讀寫類型設(shè)置為讀寫(讀寫分離)。
根據(jù)業(yè)務(wù)需要申請目標代理連接地址的內(nèi)網(wǎng)/外網(wǎng)地址,詳情請參見設(shè)置數(shù)據(jù)庫代理連接地址。
在應(yīng)用程序中,使用目標代理連接地址的內(nèi)網(wǎng)/外網(wǎng)地址與端口號進行數(shù)據(jù)庫的連接。
數(shù)據(jù)庫實例進行切換的運維類操作時,數(shù)據(jù)庫代理會自動實現(xiàn)連接保持功能,使用代理連接地址的應(yīng)用程序與代理的連接不會斷開。
使用限制
在切換過程中,連接保持功能無法保持如下場景中的連接:
MySQL服務(wù)端還沒有完全返回包的連接。例如,100 MB的結(jié)果集,只返回了50 MB的結(jié)果集,剩余的結(jié)果集還在返回中。
存在未提交的事務(wù)。
連接上使用過change user語句。
連接上使用過LOAD DATA語句。
存在臨時表。
通過代理地址進行Binlog訂閱的連接。
不支持FOUND_ROWS、ROW_COUNT和LAST_INSERT_ID函數(shù)的調(diào)用,這些函數(shù)可以調(diào)用成功,但是無法保證調(diào)用結(jié)果的正確性。其中
SELECT FOUND_ROWS()
的用法MySQL官方已不推薦,建議您將SELECT FOUND_ROWS()
替換為SELECT COUNT(*) FROM tb1
進行查詢,詳情請參見FOUND_ROWS()。
注意事項
由于連接會重連,所以使用
select connection_id()
查詢當前連接的thread id可能會變化。由于連接會重連,所以
show processlist
或者SQL洞察中顯示的IP地址和端口,可能會與客戶端實際的IP地址和端口不一致。如果連接上存在用戶自定義的變量,連接能保持,但用戶變量會失效。
關(guān)閉連接保持
前提條件
實例已開啟連接保持功能。
操作步驟
訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側(cè)導(dǎo)航欄,單擊數(shù)據(jù)庫代理。
在基本信息區(qū)域,在連接保持右側(cè)單擊關(guān)閉。
功能測試
本文僅對主動切換場景進行測試。
測試環(huán)境
測試用RDS MySQL實例如下:
MySQL 8.0版本、高可用系列。
實例規(guī)格為8核16 GB獨享型規(guī)格(mysql.x2.xlarge.2c)。
測試工具:Sysbench
測試數(shù)據(jù)如下:
100張表,其中每張表包含40000行記錄數(shù)。
并發(fā)度為128。
測試方法
在不同運維場景下,測試RDS MySQL實例的連接保活率(即執(zhí)行運維操作前后的連接保持比例)。
執(zhí)行測試語句如下:
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
上述測試語句中的關(guān)鍵參數(shù)含義如下:
db-driver:數(shù)據(jù)庫引擎
mysql-host:數(shù)據(jù)庫代理地址
tables:數(shù)據(jù)庫中的表數(shù)量
table-size:每張表包含的記錄條數(shù)
threads:并發(fā)度
time:測試時間,單位: 秒
測試結(jié)果
在如下測試的運維場景中,RDS MySQL實例均能保持100%的連接保活率。
主動切換場景 | 保活率 |
升級小版本 | 100% |
主動主備切換 | 100% |
變更主實例配置 | 100% |
修改重啟類參數(shù) | 100% |
相關(guān)API
API | 描述 |
修改RDS實例的數(shù)據(jù)庫代理功能。 | |
查詢RDS實例的數(shù)據(jù)庫代理詳情。 |