全部產品
Search
文件中心

ApsaraDB RDS:設定串連保持

更新時間:Aug 03, 2024

在RDS MySQL執行個體進行切換類的營運操作時,應用程式與代理的串連會有短暫的斷開,會對業務造成一定影響,您可以參考本文使用串連保持功能,保證串連不斷開,提升產品可用性,降低營運成本。

功能簡介

RDS MySQL代理的串連保持功能,即在發生執行個體切換類的操作時,能保持應用程式與代理的串連不斷開,使用者通過Proxy 位址訪問資料庫的應用程式不會收到串連斷開的報錯,如下圖所示。

image.png

image.png

實現原理

資料庫代理串連分為前端串連(代理與用戶端的串連)和後端串連(代理與資料庫的串連),在執行執行個體切換類操作時,能夠在後端串連斷開的情況下,保留前端串連,代理在此基礎上實現了串連保持能力。

對於後端資料庫是RDS MySQL的串連,串連保持的關鍵在於後端串連(代理與後端RDS MySQL串連)的串連狀態恢複。

RDS MySQL的串連狀態通常包括系統變數、使用者變數、暫存資料表、字元集編碼、事務狀態和Prepare語句狀態資訊等。本文將以set names utf8mb4作為串連狀態為例介紹RDS MySQL串連保持的實現原理。

主動切換:

主動切換情境下,RDS MySQL資料庫代理實現串連保持分為三個步驟:

說明

包含主動切換的營運操作:

  • 主動主備切換

  • 升級小版本

  • 修改重啟類參數(修改參數時需重啟執行個體)

  • 變更主執行個體配置

  1. 開始切換:阻塞新的串連和新的請求

    由於代理不具備事務保持能力,因此,對於不同狀態的會話,採取不同的處理方式:

    • 阻塞期間事務活躍的會話:代理將允許存取請求到後端資料庫主節點執行。

    • 阻塞期間新開啟的事務的會話:代理將阻塞請求,用戶端的現象是阻塞等待服務端回包。

    • 阻塞結束事務仍活躍的會話:用戶端與代理的串連將會斷開,後端資料庫會對未提交的事務進行復原。

    image.png

  2. 切換中:切換存量串連

    切換過程中會修改存量串連的切換狀態:

    • 無法持續連線:代理會將整個串連斷開。

    • 能夠持續連線:串連將會切換至新的資料庫節點。

    • 串連池中原資料庫主節點的串連:會被清理。

    image.png

  3. 切換完成:恢複串連

    對於能成功保留的串連,代理與後端新的資料庫主節點建立串連,並且恢複串連狀態。

    image.png

故障切換:

當系統出現故障時,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。

開啟步驟

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側導覽列,單擊資料庫代理

  3. 基本資料地區,單擊串連保持右側的開啟

    說明

    若無串連保持字樣,說明您的執行個體不符合串連保持的開通條件。

使用串連保持

前提條件

  • 已開通資料庫代理。

  • 資料庫代理已開啟串連保持。

操作步驟

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側導覽列,單擊資料庫代理

  3. 根據業務需要配置目標代理串連地址的存取原則,詳情請參見設定資料庫代理串連地址存取原則。其中讀寫類型設定為讀寫(讀寫分離)

  4. 根據業務需要申請目標代理串連地址的內網/外網地址,詳情請參見設定資料庫代理串連地址

  5. 在應用程式中,使用目標代理串連地址的內網/外網地址與連接埠號碼進行資料庫的串連。

  6. 資料庫執行個體進行切換的營運類操作時,資料庫代理會自動實現串連保持功能,使用代理串連地址的應用程式與代理的串連不會斷開。

使用限制

在切換過程中,串連保持功能無法保持如下情境中的串連:

  • 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地址和連接埠不一致。

  • 如果串連上存在使用者自訂的變數,串連能保持,但使用者變數會失效。

關閉串連保持

前提條件

執行個體已開啟串連保持功能。

操作步驟

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側導覽列,單擊資料庫代理

  3. 基本資料地區,在串連保持右側單擊關閉

功能測試

本文僅對主動切換情境進行測試。

測試環境

  • 測試用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

描述

ModifyDBProxy

修改RDS執行個體的資料庫代理功能。

DescribeDBProxy

查詢RDS執行個體的資料庫代理詳情。

相關文檔

開通資料庫代理