本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
避免綁定 RDS Proxy
當資料庫請求不依賴先前請求的狀態資訊時,多工會更有效率。在這種情況下,RDS Proxy 可以在每一筆交易結束時重複使用連線。這類狀態資訊的範例包括您可以透過 SET
或 SELECT
陳述式變更的大部分變數和組態參數。根據預設,用戶端連線上的 SQL 交易可以在基礎資料庫連線之間進行多工。
您與代理的連線可能會進入一種稱為鎖定的狀態。連線被鎖定時,每一筆後續交易都會使用相同的基礎資料庫連線,直到工作階段結束為止。其他用戶端連線也無法重複使用該資料庫連線,直到工作階段結束為止。工作階段會在用戶端連線中斷時結束。
在偵測到不適用於其他工作階段的工作階段狀態變更時,RDS Proxy 會自動將用戶端連線鎖定至特定資料庫連線。鎖定會降低連線重複使用的有效性。如果所有或幾乎所有的連線都遭遇鎖定,請考慮修改應用程式的程式碼或工作負載,以減少導致鎖定的情況。
例如,您的應用程式會變更工作階段變數或組態參數。在此情況下,稍後的陳述式可能會依賴新的變數或參數才會生效。因此,當 RDS Proxy 處理請求,而變更工作階段變數或組態設定時,會將該工作階段到資料庫的連線鎖定。這樣一來,工作階段狀態對於同一工作階段中的所有後續交易仍然有效。
對於部分資料庫引擎,此規則不適用於您可以設定的所有參數。RDS Proxy 會追蹤某些陳述式和變數。因此,RDS Proxy 不會在您修改工作階段時固定工作階段。在這種情況下,RDS Proxy 只會重複使用其他工作階段的連線,這些工作階段具有與這些設定相同的值。如需 Aurora MySQL 的追蹤陳述式和變數清單,請參閱 RDS Proxy 針對 Aurora MySQL 資料庫追蹤哪些項目。
RDS Proxy 針對 Aurora MySQL 資料庫追蹤哪些項目
RDS Proxy 會追蹤下列 MySQL 陳述式:
DROP DATABASE
DROP SCHEMA
USE
RDS Proxy 會追蹤下列 MySQL 變數:
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
注意
當您在工作階段範圍內設定變數時,RDS Proxy 會追蹤對 TRANSACTION_ISOLATION
和 TRANSACTION_READ_ONLY
變數的變更。不過,如果您將它們設定為下一個交易範圍,RDS Proxy 接腳連線。無論您使用 SET
陳述式或 SET TRANSACTION
陳述式來設定這些值,此行為都適用。
盡可能減少鎖定
RDS Proxy 的效能調校涉及試圖藉由將鎖定降到最低,讓交易層級的連線重複使用 (多工) 達到最大。
您可以執行下列操作,盡可能減少鎖定:
-
避免可能導致鎖定的不必要資料庫要求。
-
在所有連線中一致地設定變數和組態設定。這樣,稍後的工作階段更有可能重複使用具有這些特定設置的連線。
但是,對於 PostgreSQL,設定變數會導致工作階段鎖定。
-
若為 MySQL 引擎系列資料庫,將工作階段鎖定篩選條件套用至代理。如果您知道鎖定並不會影響應用程式的正確操作,就可以免除某些類型的操作將工作階段鎖定。
-
監控 Amazon CloudWatch 指標
DatabaseConnectionsCurrentlySessionPinned
,以查看鎖定發生的頻率。如需有關此 CloudWatch 指標和其他 CloudWatch 指標的資訊,請參閱 使用 Amazon 監控 RDS 代理指標 CloudWatch。 -
如果您使用
SET
陳述式為每個用戶端連線執行相同的初始化,您可以執行此操作,同時保留交易層級的多工。在此情況下,您可以將設定初始工作階段狀態的陳述式移至代理所使用的初始化查詢中。此屬性為一包含一個或多個以分號分隔的 SQL 陳述式的字串。例如,您可以為設定特定組態參數的代理定義初始化查詢。然後,每當它為該代理設定新連線時,RDS Proxy 會套用這些設定。您可以從應用程式的程式碼中移除相應的
SET
陳述式,這樣它們就不會干擾交易層級的多工。如需代理發生鎖定頻率的指標,請參閱 使用 Amazon 監控 RDS 代理指標 CloudWatch。
導致所有引擎系列鎖定的條件
在下列情況下,多工可能會導致意外行為,代理將工作階段鎖定於目前連線:
文字大小大於 16 KB 的任何陳述式會導致代理鎖定工作階段。
導致 Aurora MySQL 鎖定的條件
若為 PostgreSQL,下列互動也會導致鎖定:
-
明確的資料表鎖定陳述式
LOCK TABLE
、LOCK TABLES
或FLUSH TABLES WITH READ LOCK
會導致代理鎖定工作階段。 -
使用
GET_LOCK
建立具名鎖定會導致代理鎖定工作階段。 -
設定使用者或系統變數 (有某些例外狀況) 會將工作階段釘選到代理。如果這會大幅限制連線重複使用,您可以設定
SET
操作以避免鎖定。若要執行此作業,請調整工作階段鎖定篩選條件屬性。如需詳細資訊,請參閱 建立 RDS 代理 和 修改 RDS Proxy。 -
建立一個暫時資料表會導致代理鎖定工作階段。這樣,無論交易邊界如何,暫時資料表的內容在整個工作階段中都會保留。
-
呼叫
ROW_COUNT
和FOUND_ROWS
函數有時會導致鎖定。這些函數導致鎖定的確切情況,在與 MySQL 5.7 相容的 Aurora MySQL 版本之間可能會有所差異。
-
預備陳述式導致代理鎖定工作階段。無論預備陳述式使用 SQL 文字或二進位協定,此規則都適用。
-
當您使用 SET LOCAL 時,RDS Proxy 不會釘選連線。
-
呼叫存放程序和存放函數不會導致鎖定。RDS Proxy 不會偵測由此類呼叫導致的任何工作階段狀態變更。如果您倚賴工作階段狀態在交易間持續存在,請確定您的應用程式不會變更預存常式內的工作階段狀態。例如,RDS Proxy 目前與預存程序不相容,該程序會建立在所有交易中持續存在的暫存資料表。
如果您對應用程式行為具有專業知識,您可以略過特定應用程式陳述式的鎖定行為。若要這麼做,請在建立代理時選擇工作階段鎖定篩選條件選項。您目前可以選擇退出工作階段鎖定,以便設定工作階段變數和組態設定。
導致 Aurora PostgreSQL 鎖定的條件
若是 PostgreSQL,下列互動也會導致鎖定:
-
使用
SET
命令。 -
使用
PREPARE
、DEALLOCATE
、DISCARD
或EXECUTE
命令來管理準備好的陳述式。 -
建立臨時序列、資料表或檢視。
-
宣告游標。
-
捨棄工作階段狀態。
-
在通知管道上接聽。
-
載入程式庫模組,例如
auto_explain
。 -
使用
nextval
和 等函數控制序列setval
。 -
使用
pg_advisory_lock
和 等函數與鎖定互動pg_try_advisory_lock
。注意
RDS Proxy 不會鎖定交易層級諮詢鎖定,特別是
pg_advisory_xact_lock
、pg_try_advisory_xact_lock
、pg_advisory_xact_lock_shared
和pg_try_advisory_xact_lock_shared
。 -
設定參數,或將參數重設為其預設值。具體而言,使用
SET
和set_config
命令將預設值指派給工作階段變數。 -
呼叫存放程序和存放函數不會導致鎖定。RDS Proxy 不會偵測由此類呼叫導致的任何工作階段狀態變更。如果您倚賴工作階段狀態在交易間持續存在,請確定您的應用程式不會變更預存常式內的工作階段狀態。例如,RDS Proxy 目前與預存程序不相容,該程序會建立在所有交易中持續存在的暫存資料表。