避免固定代理 RDS - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

避免固定代理 RDS

當資料庫請求不依賴先前請求的狀態資訊時,多工會更有效率。在這種情況下,RDS代理可以在每個事務結束時重複使用連接。這類狀態資訊的範例包括您可以透過 SETSELECT 陳述式變更的大部分變數和組態參數。SQL根據預設,用戶端連線上的交易可以在基礎資料庫連線之間多工處理。

您與代理的連線可能會進入一種稱為鎖定的狀態。連線被鎖定時,每一筆後續交易都會使用相同的基礎資料庫連線,直到工作階段結束為止。其他用戶端連線也無法重複使用該資料庫連線,直到工作階段結束為止。工作階段會在用戶端連線中斷時結束。

RDS當 Proxy 偵測到不適用於其他工作階段的工作階段狀態變更時,會自動將用戶端連線釘選到特定的資料庫連線。鎖定會降低連線重複使用的有效性。如果所有或幾乎所有的連線都遭遇鎖定,請考慮修改應用程式的程式碼或工作負載,以減少導致鎖定的情況。

例如,您的應用程式會變更工作階段變數或組態參數。在此情況下,稍後的陳述式可能會依賴新的變數或參數才會生效。因此,當 RDS Proxy 處理變更工作階段變數或組態設定的要求時,會將該工作階段釘選至資料庫連線。這樣一來,工作階段狀態對於同一工作階段中的所有後續交易仍然有效。

對於部分資料庫引擎,此規則不適用於您可以設定的所有參數。RDS代理跟踪某些語句和變量。因此,RDSProxy 不會在您修改工作階段時釘選工作階段。在此情況下,RDSProxy 只會針對其他具有相同設定值的工作階段重複使用連線。如需 Aurora My 的追蹤陳述式和變數清單SQL,請參閱什麼RDS代理追蹤 Aurora 我的SQL資料庫

什麼RDS代理追蹤 Aurora 我的SQL資料庫

以下是RDS代理跟踪的我的SQL聲明:

  • DROP DATABASE

  • DROP SCHEMA

  • USE

以下是RDS代理跟踪的我的SQL變量:

  • AUTOCOMMIT

  • AUTO_INCREMENT_INCREMENT

  • CHARACTER SET (or CHAR SET)

  • CHARACTER_SET_CLIENT

  • CHARACTER_SET_DATABASE

  • CHARACTER_SET_FILESYSTEM

  • CHARACTER_SET_CONNECTION

  • CHARACTER_SET_RESULTS

  • CHARACTER_SET_SERVER

  • COLLATION_CONNECTION

  • COLLATION_DATABASE

  • COLLATION_SERVER

  • INTERACTIVE_TIMEOUT

  • NAMES

  • NET_WRITE_TIMEOUT

  • QUERY_CACHE_TYPE

  • SESSION_TRACK_SCHEMA

  • SQL_MODE

  • TIME_ZONE

  • TRANSACTION_ISOLATION (or TX_ISOLATION)

  • TRANSACTION_READ_ONLY (or TX_READ_ONLY)

  • WAIT_TIMEOUT

盡可能減少鎖定

RDSProxy 的效能調整涉及嘗試透過最小化固定來最大化交易層級連線重複使用 (多工處理)。

您可以執行下列操作,盡可能減少鎖定:

  • 避免可能導致鎖定的不必要資料庫要求。

  • 在所有連線中一致地設定變數和組態設定。這樣,稍後的工作階段更有可能重複使用具有這些特定設置的連線。

    但是,對於 Postgre SQL 設置一個變量會導致會話固定。

  • 對於 My SQL Engine 系列資料庫,請將工作階段釘選篩選器套用至 Proxy。如果您知道鎖定並不會影響應用程式的正確操作,就可以免除某些類型的操作將工作階段鎖定。

  • 透過監控 Amazon CloudWatch 指標DatabaseConnectionsCurrentlySessionPinned查看釘選發生的頻率。如需此測量結果和其他 CloudWatch量度的資訊,請參閱使用 Amazon 監控 RDS 代理指標 CloudWatch

  • 如果您使用 SET 陳述式為每個用戶端連線執行相同的初始化,您可以執行此操作,同時保留交易層級的多工。在此情況下,您可以將設定初始工作階段狀態的陳述式移至代理所使用的初始化查詢中。該屬性是包含一個或多個SQL語句的字符串,用分號分隔。

    例如,您可以為設定特定組態參數的代理定義初始化查詢。然後,RDSProxy 會在為該 Proxy 設定新連線時套用這些設定。您可以從應用程式的程式碼中移除相應的 SET 陳述式,這樣它們就不會干擾交易層級的多工。

    如需代理發生鎖定頻率的指標,請參閱 使用 Amazon 監控 RDS 代理指標 CloudWatch

導致所有引擎系列鎖定的條件

在下列情況下,多工可能會導致意外行為,代理將工作階段鎖定於目前連線:

  • 文字大小大於 16 KB 的任何陳述式會導致代理鎖定工作階段。

導致我的 Aurora 固定的條件 SQL

對於「我」SQL,下列互動也會導致釘選:

  • 明確的資料表鎖定陳述式 LOCK TABLELOCK TABLESFLUSH TABLES WITH READ LOCK 會導致代理鎖定工作階段。

  • 使用 GET_LOCK 建立具名鎖定會導致代理鎖定工作階段。

  • 設定使用者變數或系統變數 (有某些例外) 會導致代理鎖定工作階段。如果這種情況減少了太多的連線重複使用率,請選擇不會造成釘選的SET作業。如需如何設定篩選屬性來執行此作業的資訊,請參閱 建立 RDS Proxy修改RDS代理

  • 建立一個暫時資料表會導致代理鎖定工作階段。這樣,無論交易邊界如何,暫時資料表的內容在整個工作階段中都會保留。

  • 呼叫函數 ROW_COUNTFOUND_ROWSLAST_INSERT_ID 有時會導致鎖定。

    這些功能導致固定的確切情況在與 My SQL 5.7 相容的 Aurora My SQL 版本之間可能會有所不同。

  • 預備陳述式導致代理鎖定工作階段。無論準備好的陳述式使用SQL文字或二進位通訊協定,都會套用此規則

  • RDS代理伺服器在您使用時不會釘選連線SETLOCAL。

  • 呼叫存放程序和存放函數不會導致鎖定。RDSProxy 不會偵測此類呼叫所造成的任何工作階段狀態變更。如果您依賴該會話狀態在事務之間持續存儲,請確保您的應用程序不會更改存儲例程中的會話狀態。例如,RDSProxy 目前與預存程序不相容,該預存程序會建立在所有交易中持續存在的暫存資料表。

如果您對應用程式行為具有專業知識,您可以略過特定應用程式陳述式的鎖定行為。若要這麼做,請在建立代理時選擇工作階段鎖定篩選條件選項。您目前可以選擇退出工作階段鎖定,以便設定工作階段變數和組態設定。

導致固定 Aurora 波斯特的條件 SQL

對於 PostgreSQL,下列互動也會導致固定:

  • 使用SET命令。

  • 使用PREPAREDISCARDDEALLOCATE、或EXECUTE命令來管理準備好的陳述式。

  • 創建臨時序列,表或視圖。

  • 宣告游標。

  • 捨棄工作階段狀態。

  • 在通知頻道上收聽。

  • 載入程式庫模組,例如auto_explain.

  • 使用函數操作序列,例如nextvalsetval

  • 使用諸如pg_advisory_lock和之類的功能與鎖進行交互pg_try_advisory_lock

    注意

    RDSProxy 不會針對交易層級建議鎖定pg_advisory_xact_lock,特別是pg_advisory_xact_lock_sharedpg_try_advisory_xact_lock、、和pg_try_advisory_xact_lock_shared

  • 設定參數,或將參數重設為預設值。具體來說,使用SETset_config命令將默認值分配給會話變量。

  • 呼叫存放程序和存放函數不會導致鎖定。RDSProxy 不會偵測此類呼叫所造成的任何工作階段狀態變更。如果您依賴該會話狀態在事務之間持續存儲,請確保您的應用程序不會更改存儲例程中的會話狀態。例如,RDSProxy 目前與預存程序不相容,該預存程序會建立在所有交易中持續存在的暫存資料表。