全部產品
Search
文件中心

ApsaraDB RDS:設定串連池

更新時間:Aug 31, 2024

如果您的應用串連建立頻繁(例如短串連情境)或者串連數量很大(大於MySQL資料庫的串連數限制),您可以參考本文使用合適的RDS MySQL資料庫代理串連池,降低應用與資料庫建立串連的頻率來減少MySQL資料庫主線程的開銷,減少資料庫上的總串連數。

選擇串連池

RDS MySQL資料庫代理串連池分為事務級串連池和會話級串連池,您可以按照實際使用情境選擇是否使用串連池,以及使用串連池的類型:

串連池類型

使用情境

事務級串連池(推薦)

  • 業務側多為短串連

  • 串連建立頻繁

  • 串連數量很大(大於MySQL資料庫的串連數限制)

以上情境下,業務不涉及事務級串連池的使用限制,建議優先選擇事務級串連池。

會話級串連池

  • 業務側多為短串連

  • 串連建立頻繁

以上情境下,業務受到事務級串連池的使用限制而無法使用事務級串連池,可使用會話級串連池。

不使用串連池

  • 業務側多為長串連

  • 串連數量很少

  • 業務側已經使用了串連池(例如:Druid、DBCP、C3P0、HikariCP等)

串連池類型介紹

會話級串連池

應用情境

  • 業務側多為短串連

  • 串連建立頻繁

以上情境下,業務受到事務級串連池的使用限制而無法使用事務級串連池,可使用會話級串連池。

作用

降低應用與資料庫建立串連的頻率來減少MySQL資料庫主線程的開銷。

工作原理

前端串連與後端串連

在用戶端(應用)與資料庫建立串連時,以資料庫代理為中間節點可將該串連分為前端串連(用戶端與資料庫代理的串連)和後端串連(資料庫代理與資料庫的串連)。如下圖所示。

未開啟串連池時的串連建立過程

未開啟串連池時,每條由用戶端發起的會話都需要建立前端串連和後端串連。會話結束後,前端串連和後端串連均斷開,等到下次用戶端發起會話請求時,再重新建立新的前端串連和後端串連。如下圖所示。

使用這種建立串連的方式,每次會話都要重建立立後端串連,對資料庫的主線程的開銷較大。

會話級串連池工作原理

對於會話級串連池,當用戶端發起的會話建立串連時,先建立前端串連,然後判斷串連池中是否存在可用的後端串連:

說明

判斷是否為可用串連的條件:user、clientip和dbname等參數值是否一致。

  • 若存在,則直接使用。

  • 若不存在,則與資料庫建立新的後端串連。

會話結束後,前端串連斷開,後端串連放入串連池,待新的會話建立串連時,可直接使用該後端串連。

這樣,就降低了資料庫代理與資料庫建立串連的頻率,從而減少了資料庫主線程的開銷。

串連建立的流程如下圖所示。

對於會話級串連池,一個會話需要佔用一個後端串連,直到會話結束才會釋放後端串連到串連池,如下圖所示。

使用限制

無。

注意事項

對於會話級串連池,在一個會話未結束之前,即便該會話處於閑置狀態,沒有事務需要處理,其後端串連也不能為其他會話使用,所以不能減少資料庫的總串連數。

事務級串連池(推薦)

應用情境

  • 業務側多為短串連

  • 串連建立頻繁

  • 串連數量很大(大於MySQL資料庫的串連數限制)

以上情境下,業務不涉及事務級串連池的使用限制,建議優先選擇事務級串連池。

作用

  • 降低應用與資料庫建立串連的頻率來減少MySQL資料庫主線程的開銷。

  • 減少資料庫上的總串連數。

工作原理

開啟事務級串連池後,當用戶端發起串連會話請求時,只會先與資料庫代理建立前端串連,代理不會馬上將其與後端資料庫建立串連;當需要處理請求時,從事務級串連池裡尋找是否存在可用的後端串連:

說明

判斷是否為可用後端串連的條件:userdbname和部分系統變數的參數值是否一致。

  • 若存在,則從串連池裡直接擷取後端並使用,並在當前事務結束後將該串連放回事務級串連池,方便下個請求繼續使用。

  • 若不存在,代理會與資料庫建立一個新的後端串連。

對於事務級串連池,在一段時間內,多個會話可共用一個後端串連。如下圖所示,事務活躍的串連會佔用後端串連,事務非活躍的串連不會佔用後端串連。

這樣,在一段時間內,同一個後端串連,就可以處理多個進行中的會話的交易處理請求,可以帶來以下好處:

  • 減少與資料庫建立串連的頻率

    後端串連在一段時間內與資料庫並沒有斷開,能夠減少與資料庫建立串連的頻率,從而減少資料庫主線程的開銷。

  • 減少與資料庫的總串連數

    多個進行中的會話共用了一個後端串連,避免了閑置串連(會話未結束,但前端串連為非活躍狀態)對後端串連資源的佔用,減少了資料庫上的總串連數。

說明

資料庫代理本身並沒有最大串連數的限制,串連數的限制是由後端資料庫的規格決定。

使用限制

  • 執行以下操作時,串連將被鎖定直至串連結束(即該串連不會再被放到串連池裡供其他使用者串連使用):

    • 執行PREPARE語句或命令。

    • 建立暫存資料表。

    • 修改使用者變數。

    • 大報文(例如16 MB以上)。

    • 使用LOCK TABLE。

    • 多語句。

    • 預存程序調用。

  • 不支援FOUND_ROWS、ROW_COUNT和LAST_INSERT_ID函數的調用,這些函數可以調用成功,但是無法保證調用結果的正確性。其中:

    • 1.13.11及以上的資料庫代理版本支援在SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT *語句後直接使用SELECT FOUND_ROWS()命令。但MySQL官方已不推薦該用法,建議您將SELECT FOUND_ROWS()替換為SELECT COUNT(*) FROM tb1進行查詢,詳情請參見FOUND_ROWS()

    • 1.13.11及以上的資料庫代理版本支援在INSERT後直接使用SELECT LAST_INSERT_ID()語句,來保證查詢結果正確性。

注意事項

  • 對於設定了wait_timeout的串連,wait_timeout在用戶端的表現可能不會生效,因為每次請求都會從串連池中擷取串連,當wait_timeout逾時後,只有串連池中的後端串連會斷開,而後端串連斷開並不會導致用戶端串連斷開。

  • 除了sql_modecharacter_set_servercollation_servertime_zone這四個變數以外,如果業務依賴其他session層級的系統變數,那麼需要用戶端在建連之後顯式執行set語句,否則串連池可能會複用系統變數已經被更改過的串連。

  • 由於串連可能會被複用,您可以使用select connection_id()查詢當前串連的thread id。

  • 由於串連可能會被複用,所以show processlist或者SQL洞察顯示的IP地址和連接埠可能和用戶端實際的IP地址和連接埠不一致。

  • 資料庫代理會將所有節點上的show processlist結果合并後返回,在事務級串連池開啟後,前端串連和後端串連的thread id無法對應。這導致kill命令可能會報錯,但是實際上kill命令已經正常執行成功,可再通過show processlist確定相應的串連是否斷開。

設定串連池

前提條件

已開通資料庫代理

注意事項

  • 當前串連池功能不支援同一個帳號對不同IP有不同的許可權。如果您為同一個帳號的不同IP設定了不同的庫或者表許可權,開通串連池可能會導致許可權錯誤問題。例如,user@192.xx.xx.1設定了database_a的許可權,而user@192.xx.xx.2沒有database_a的許可權,可能會導致串連複用時許可權出錯。

  • 本文介紹的串連池功能是指RDS MySQL資料庫代理的串連池功能,不影響用戶端的串連池功能,如果您的用戶端已經支援串連池,則可以不使用資料庫代理的串連池功能。

  • 串連池不能解決由於存在大量慢SQL,導致的串連堆積問題,建議自行最佳化SQL,或者在MySQL側排查慢的原因。

  • 當資料庫代理核心小版本低於2.9.1時,讀寫屬性為唯讀串連地址不支援設定串連池。當資料庫代理核心小版本為2.9.1及以上時,讀寫屬性為讀寫和唯讀串連地址均支援設定串連池。

操作步驟

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

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

  3. 串連資訊地區,您可以通過兩種方法開啟串連池:

    說明
    • 預設關閉串連池。

    • 修改串連池類型後,僅對新串連生效。

    • 方法一:將滑鼠置於代理串連地址(終端)ID右側的image.png表徵圖,在彈出的對話方塊中單擊開啟事務級串連池開啟會話級串連池,然後在彈出的對話方塊中單擊確定

      image.png

    • 方法二:在目標代理串連地址操作列,單擊修改配置,在彈出的對話方塊中,在串連池右側選中目標串連池類型,即開啟了對應類型的串連池。

      說明

      如果原來已經開啟了某類串連池,重新選擇串連池類型,可修改類型。

      image.png

相關API

API

描述

DescribeDBProxy

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

DescribeDBProxyEndpoint

查詢RDS執行個體資料庫代理的串連地址資訊。

ModifyDBProxyEndpoint

修改RDS執行個體資料庫代理串連地址存取原則。

相關概念

  • 短串連:指僅在短時間持續連線。例如PHP應用程式,用戶端開啟一個串連,執行一個簡單的查詢,然後關閉串連。優點是不需要長期佔用串連通道,缺點是每次發送業務都要建一次串連,建立串連耗費MySQL資料庫主線程的開銷大。

  • 長串連:指長時間持續連線。例如,可能有一個Web伺服器或應用程式伺服器開啟許多到MySQL伺服器的串連,並保持它們開啟,直到用戶端(Web/Application伺服器)停止,可能要持續數月。優點是與資料庫建立串連的次數相對較少,耗費MySQL資料庫主線程的開銷小。缺點是需要長期佔用串連通道。

常見問題

Q:串連數達到多少,建議開啟串連池?

A:串連數如果可能超過MySQL資料庫的串連數上限, 建議開啟事務級串連池。

Q:串連池的串連保持時間是多少?

A:10秒。

Q:使用串連池對執行個體效能有影響嗎?

A:使用串連池後,短串連情境下,執行個體效能會有10%左右的提升。

Q:事務級串連池和會話級串連池的作用有何差異?

A:事務級串連池不僅可以減少MySQL資料庫主線程的開銷,還可以減少資料庫上的總串連數。

會話級串連池只能減少MySQL資料庫主線程的開銷,不能減少資料庫上的總串連數。

Q:事務級串連池和會話級串連池在工作原理上有何不同?

A:

串連池類型

會話是否可以共用後端串連

取後端串連的時機

把後端串連放回串連池的時機

會話與後端串連的映射關係

事務級

處理事務時

處理完一個事務(此時會話可能沒結束)

N:1

會話級

建立會話時

會話結束

N:N

Q:資料庫代理出現串連斷開的問題,是否因為應用和資料庫代理都用了串連池的功能?

A:串連斷開的原因很多,需要根據具體情況分析,不一定是因為應用和資料庫代理都用了串連池的功能。