全部產品
Search
文件中心

PolarDB:串連保持

更新時間:Jul 06, 2024

PolarDB新增支援串連保持功能,避免由於一些營運操作(如升級配置、主備切換或升級小版本等)或非營運操作故障(如節點所在伺服器故障)導致的串連閃斷或建立串連短暫失敗的問題,進一步提高PolarDB的高可用性。

前提條件

  • PolarDB資料庫代理(PolarProxy)版本需為2.4.7或以上。如何查看和升級當前資料庫代理版本,請參見小版本升級

  • 叢集版本需為PolarDB MySQL版5.6、5.7或8.0版本且產品系列為叢集版

  • 僅訪問預設叢集地址或者自訂地址並且負載平衡策略配置為基於活躍請求數負載平衡的流量支援串連保持。

背景資訊

PolarDB已通過高可用組件實現了主節點出現故障時快速進行主備切換,來提供高可用的叢集服務。但此類切換過程會對應用程式服務造成影響,導致串連閃斷、建立串連短暫失敗等問題。引起應用程式服務短暫停用情境通常分為如下兩種:

  • 計劃內(Switchover):即由資料庫控制台或後台管控發起的各種營運操作,如升級配置自動/手動主備節點切換升級小版本等。

  • 計劃外(Failover):其他非營運操作引起的故障,比如主節點崩潰,節點所在的主機出現故障等。

通常的解決辦法是重啟應用程式或保證應用程式具備重連機制,但由於開發週期等原因,在開發設計應用程式的前期可能並未考慮到該問題,導致出現大量的非預期行為甚至應用程式的服務不可用。因此PolarDB新增支援串連保持功能,避免由於一些營運操作或非營運操作故障導致的應用程式服務短暫不可用問題,進一步提高PolarDB叢集的高可用性。

實現原理

主節點切換

從串連建立的角度看,PolarDB中的一個會話(Session)包含了一個前端串連(即應用程式和Proxy的串連)和N個後端串連(即Proxy和後端N個資料庫節點的串連)。開啟串連保持功能後,當Proxy與舊主節點(即高可用切換前的主節點)串連斷開時,Proxy與前端應用的串連保持不斷(即應用程式看到的Session),同時Proxy會與新主節點(即高可用切換後的主節點)重建立立串連並且恢複之前的工作階段狀態,以實現對應用程式端無感知的高可用切換。

12

MySQL的串連(會話)通常包括系統變數、使用者變數、暫存資料表、字元集編碼、事務狀態和的Prepare語句狀態資訊。本文以字元集編碼的狀態資訊為例介紹開啟串連保持功能前後的工作階段狀態。

假設應用程式和Proxy間建立了一個串連,並執行了set names utf8; 命令,此時names=utf8就是這個串連的一個狀態。當Proxy在新舊主節點中進行切換時,需要保留這個狀態,否則會出現字元集亂碼問題。所以串連保持的核心在於保證串連切換前後的工作階段狀態一致。

說明

當Proxy將串連從舊主節點切換到新主節點的過程中,會存在短暫的新老資料庫同時不可寫不可讀的時間(具體時間長度受資料庫壓力影響),所以在切換時,Proxy會暫時停止將應用程式的串連請求路由到後端資料庫,並根據新主節點可讀可寫能力的恢復決定路由方向:

  • 若新主節點在60秒內恢複了可寫可讀能力,Proxy會將請求路由到新主節點。

  • 若新主節點的可讀可寫能力未能在60秒內恢複,Proxy會斷開與應用程式間的串連,應用程式需重新發起串連請求(即此時與未使用串連保持功能時的行為一致)。

唯讀節點下線

唯讀節點下線,即從預設叢集地址或自訂地址(並且是基於活躍請求數負載平衡策略)中摘除一個唯讀節點。如果當前摘除的唯讀節點上有正在執行的請求,並且這個請求的執行時間超過60秒(從代理收到唯讀節點要下線的時間開始算),這個請求對應的使用者串連會閃斷。其他不能保持串連的情境見注意事項中的內容;同時代理在收到下線唯讀節點請求時,所有的新串連和空閑新請求都不會再路由到該下線節點。

注意事項

串連保持功能無法保持如下情境中的串連:

  • 當串連切換時,串連(會話)上存在暫存資料表。

  • 當串連切換時,Proxy正在從資料庫接收結果報文但只接收了部分結果報文,比如執行SELECT語句後,需要從資料庫接收一個包含100 MB資料的結果報文,但切換時資料庫只傳輸了10 MB資料。

  • 當串連切換時,串連(會話)上有正在執行中的事務(如begin;insert into;)。

  • 使用cursor或者stmt_send_long_data,並且在切換時cursor或long_data還沒有結束。

說明
  • 對於計劃內(Switchover)發起的切換或下線節點,Proxy會保留最多60秒的冷靜期。如果上述串連能夠在60秒內變成空閑(比如正在執行的請求全部返回,或者事務結束等),Proxy也將會保持這些串連,從而提高串連保持的機率。

  • 對於基於串連數負載平衡策略的地址,若刪除該地址下的唯讀節點,當前唯讀節點上的串連都會閃斷,與使用者直連該唯讀節點的行為一致,即不支援串連保持。

效能測試

  • 測試環境

    • 測試用叢集如下:

      • PolarDB MySQL版8.0版本叢集(預設包含1個主節點和2個唯讀節點)。

      • 節點規格為4核16 GB(polar.mysql.x4.large)。

    • 測試載入器:Sysbench。

    • 測試資料如下:

      • 20張表,其中每張表包含10000行記錄數。

      • 並發度為20。

  • 測試方法

    在不同營運情境下,測試PolarDB叢集的串連保活率(即執行營運操作前後的串連保持比例)。

  • 測試結果

    在如下測試的營運情境中,PolarDB叢集均能保持100%的串連保活率。

    說明
    • 當前升級叢集規格僅支援在未跳級升級規格(如從4核升級至8核)的情境下能夠保持100%的串連保活率,如果是從4核升級到16核(或者更大規格),可能出現串連閃斷。

    • 若刪除唯讀節點時觸發了資料庫代理節點收縮,將導致部分串連的閃斷。

    • 核心小版本升級的情境中僅包括資料庫核心引擎的小版本升級,而不包含資料庫代理的小版本升級,資料庫代理的小版本升級會出現串連閃斷。

    營運情境

    保活率

    主備切換

    100%

    核心小版本升級

    100%

    升級叢集規格

    100%

    增刪節點

    100%