避免固定代理 RDS - Amazon Relational Database Service

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

避免固定代理 RDS

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

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

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

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

對於部分資料庫引擎,此規則不適用於您可以設定的所有參數。RDS代理跟踪某些語句和變量。因此,RDSProxy 不會在您修改工作階段時釘選工作階段。在此情況下,RDSProxy 只會針對其他具有相同設定值的工作階段重複使用連線。如需針對資料庫引擎追蹤哪些 RDS Proxy 的詳細資訊,請參閱下列內容:

SQL伺服器資料庫的RDS代RDS理追蹤

以下是代RDS理跟踪SQL服務器語句:

  • USE

  • SET ANSI_NULLS

  • SET ANSI_PADDING

  • SET ANSI_WARNINGS

  • SET ARITHABORT

  • SET CONCAT_NULL_YIELDS_NULL

  • SET CURSOR_CLOSE_ON_COMMIT

  • SET DATEFIRST

  • SET DATEFORMAT

  • SET LANGUAGE

  • SET LOCK_TIMEOUT

  • SET NUMERIC_ROUNDABORT

  • SET QUOTED_IDENTIFIER

  • SET TEXTSIZE

  • SET TRANSACTION ISOLATION LEVEL

什麼RDS代理跟踪 MariaDB 和我RDS的數據庫 RDS SQL

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

  • DROP DATABASE

  • DROP SCHEMA

  • USE

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

  • 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 的任何陳述式會導致代理鎖定工作階段。

造成針對 Microsoft SQL 伺服器釘選RDS的條件

對RDS於 SQL Server,下列互動也會導致固定:

  • 使用多個活動結果集(MARS)。如需相關資訊MARS,請參閱SQL伺服器文件。

  • 使用分散式交易協調器 (DTC) 通訊。

  • 建立暫存資料表、交易、游標或預備陳述式。

  • 使用下列 SET 陳述式:

    • SET ANSI_DEFAULTS

    • SET ANSI_NULL_DFLT

    • SET ARITHIGNORE

    • SET DEADLOCK_PRIORITY

    • SET FIPS_FLAGGER

    • SET FMTONLY

    • SET FORCEPLAN

    • SET IDENTITY_INSERT

    • SET NOCOUNT

    • SET NOEXEC

    • SET OFFSETS

    • SET PARSEONLY

    • SET QUERY_GOVERNOR_COST_LIMIT

    • SET REMOTE_PROC_TRANSACTIONS

    • SET ROWCOUNT

    • SET SHOWPLAN_ALLSHOWPLAN_TEXTSHOWPLAN_XML

    • SET STATISTICS

    • SET XACT_ABORT

導致針對 MariaDB 和我RDS的釘選的條件 RDS SQL

對於 MariaDB 和我的SQL,以下交互也會導致固定:

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

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

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

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

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

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

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

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

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

造成 Postgre 固定的RDS條件 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 目前與預存程序不相容,該預存程序會建立在所有交易中持續存在的暫存資料表。