使用集區管理 Aurora PostgreSQL 連線流失 - Amazon Aurora

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

使用集區管理 Aurora PostgreSQL 連線流失

當用戶端應用程式經常連線和中斷連線,以致 Aurora PostgreSQL 資料庫叢集回應時間變慢時,就表示叢集正在經歷連線流失。每個與 Aurora PostgreSQL 資料庫叢集端點的新連線都會消耗資源,因而減少可用於處理實際工作負載的資源。我們建議您遵循以下討論的一些最佳實務來管理連線流失問題。

對於初學者來說,您可以改善連線流失率高的 Aurora PostgreSQL 資料庫叢集的回應時間。為了這麼做,您可以使用連線集區,例如 RDS Proxy。連線集區為用戶端提供立即可用連線的快取。幾乎所有版本的 Aurora PostgreSQL 都支援 RDS 代理。如需更多詳細資訊,請參閱 使用 Aurora PostgreSQL 的 Amazon RDS Proxy

如果您的特定版本 Aurora PostgreSQL 不支援 RDS Proxy,您可以使用其他與 PostgreSQL 相容的連線集區工具,例如 PgBouncer。如需進一步了解,請參閱 PgBouncer 網站。

如需查看您的 Aurora PostgreSQL 資料庫叢集是否會受益於連線集區,您可以檢查用於連線和連線中斷的 postgresql.log 檔案。您也可以使用 Performance Insights,找出 Aurora PostgreSQL 資料庫叢集遇到多少連線流失。在以下內容中您可以找到這兩個主題的相關資訊。

記錄連線與中斷連線

PostgreSQL log_connectionslog_disconnections 參數可以擷取 Aurora PostgreSQL 資料庫叢集的寫入器執行個體、的連線和連線中斷。這些參數預設會被關閉。若要開啟這些參數,請使用自訂參數群組,並將值變更為 1 來開啟。如需自訂參數群組的詳細資訊,請參閱 使用資料庫叢集參數群組。若要檢查設定,請依照下列方式使用 psql 和查詢連線至 Aurora PostgreSQL 的資料庫叢集端點。

labdb=> SELECT setting FROM pg_settings WHERE name = 'log_connections'; setting --------- on (1 row) labdb=> SELECT setting FROM pg_settings WHERE name = 'log_disconnections'; setting --------- on (1 row)

當這兩個參數都開啟時,記錄會擷取所有的新連線和中斷連線。您會看到每個新授權連線的使用者和資料庫。在斷線時,也會記錄工作階段持續時間,如以下範例所示。

2022-03-07 21:44:53.978 UTC [16641] LOG: connection authorized: user=labtek database=labdb application_name=psql 2022-03-07 21:44:55.718 UTC [16641] LOG: disconnection: session time: 0:00:01.740 user=labtek database=labdb host=[local]

若要檢查您的應用程式是否有連線流失,請開啟這些參數 (如果尚未開啟)。然後以實際的工作負載和時間間隔執行應用程式,收集 PostgreSQL 日誌檔中的資料以進行分析。您可以在 RDS 主控台中檢視日誌檔。選擇 Aurora PostgreSQL 資料庫叢集的寫入器執行個體,然後選擇 Logs & events (日誌和事件) 標籤。如需更多詳細資訊,請參閱 檢視並列出資料庫日誌檔案

或者,您可以從控制台下載日誌檔並使用以下命令序列。此序列會尋找每分鐘授權和捨棄的連線總數。

grep "connection authorized\|disconnection: session time:" postgresql.log.2022-03-21-16|\ awk {'print $1,$2}' |\ sort |\ uniq -c |\ sort -n -k1

在範例輸出中,您可以看到授權連線中出現尖峰,然後從 16:12:10 開始連線中斷。

..... ,...... ......... 5 2022-03-21 16:11:55 connection authorized: 9 2022-03-21 16:11:55 disconnection: session 5 2022-03-21 16:11:56 connection authorized: 5 2022-03-21 16:11:57 connection authorized: 5 2022-03-21 16:11:57 disconnection: session 32 2022-03-21 16:12:10 connection authorized: 30 2022-03-21 16:12:10 disconnection: session 31 2022-03-21 16:12:11 connection authorized: 27 2022-03-21 16:12:11 disconnection: session 27 2022-03-21 16:12:12 connection authorized: 27 2022-03-21 16:12:12 disconnection: session 41 2022-03-21 16:12:13 connection authorized: 47 2022-03-21 16:12:13 disconnection: session 46 2022-03-21 16:12:14 connection authorized: 41 2022-03-21 16:12:14 disconnection: session 24 2022-03-21 16:12:15 connection authorized: 29 2022-03-21 16:12:15 disconnection: session 28 2022-03-21 16:12:16 connection authorized: 24 2022-03-21 16:12:16 disconnection: session 40 2022-03-21 16:12:17 connection authorized: 42 2022-03-21 16:12:17 disconnection: session 40 2022-03-21 16:12:18 connection authorized: 40 2022-03-21 16:12:18 disconnection: session ..... ,...... ......... 1 2022-03-21 16:14:10 connection authorized: 1 2022-03-21 16:14:10 disconnection: session 1 2022-03-21 16:15:00 connection authorized: 1 2022-03-21 16:16:00 connection authorized:

有了這些資訊,您就可以決定您的工作負載是否可以從連線集區工具中獲益。如需更詳細的分析,您可以使用 Performance Insights。

使用 Performance Insights 偵測連線流失

您可以使用 Performance Insights 來評估您 Aurora PostgreSQL 相容版本資料庫叢集的連線流失。當您建立 Aurora PostgreSQL 資料庫叢集時,預設會開啟 Performance Insights 的設定。如果您在建立資料庫叢集時清除此選項,請修改叢集以開啟此功能。如需更多詳細資訊,請參閱 修改 Amazon Aurora 資料庫叢集

透過在 Aurora PostgreSQL 資料庫叢集上執行的 Performance Insights,您可以選擇要監控的指標。您可以在主控台中的導覽窗格存取效能洞見。您也可以從 Aurora PostgreSQL 資料庫叢集的寫入器執行個體的 Monitoring (監控) 標籤存取 Performance Insights,如下圖所示。

從 RDS 主控台和選取的 Aurora PostgreSQL 資料庫叢集中存取 Performance Insights 的影像。

從「Performance Insights」主控台選擇 Manage metrics (管理指標)。若要分析 Aurora PostgreSQL 資料庫叢集的連線和中斷連線動作,請選擇下列指標。這些都是來自 PostgreSQL 的指標。

  • xact_commit – 已遞交的交易數量。

  • total_auth_attempts – 每分鐘嘗試驗證的使用者連線數目。

  • numbackends – 目前連線至資料庫的後端數目。

從 RDS 主控台和選取的 Aurora PostgreSQL 資料庫叢集中存取 Performance Insights 的影像。

若要儲存設定並顯示連線動作,請選擇 Update graph (更新圖表)。

在下圖中,您可以看到有 100 個使用者時運行 pgbench 的影響。顯示連線位於一致向上斜坡的直線。若要進一步了解 pgbench 以及如何使用,請參閱 PostgreSQL 文件中的 pgbench

顯示連線集區需要的 Performance Insights 影像。

此影像顯示,如果在沒有連線集區的情況下執行最多 100 個使用者的工作負載,可能會導致在整個工作負載處理期間 total_auth_attempts 的數量大幅增加。

使用 RDS Proxy 連線集區時,連線嘗試會在工作負載開始時增加。設定連線集區之後,平均值會下降。交易和後端使用所使用的資源在整個工作負載處理過程中保持一致。

Performance Insights 的影像顯示 RDS Proxy 對連線集區的優點。

如需搭配 Aurora PostgreSQL 資料庫叢集使用 Performance Insights 的詳細資訊,請參閱 在 Amazon Aurora 上使用績效詳情監控資料庫負載。若要分析指標,請參閱 使用績效詳情儀表板來分析指標

展示連線集區的好處

如前所述,如果您判斷 Aurora PostgreSQL 資料庫叢集有連線流失問題,您可以使用 RDS Proxy 來改善效能。接下來,您可以找到一個範例,其中顯示連線置於集區以及不置於集區時處理工作負載的差異。此範例使用 pgbench 建立交易工作負載的模型。

與 psql 一樣,pgbench 是一個 PostgreSQL 用戶端應用程式,您可以在本地用戶端機器上安裝和運行。您也可以從用來管理 Aurora PostgreSQL 資料庫叢集的 Amazon EC2 執行個體進行安裝和執行。如需詳細資訊,請參閱 PostgreSQL 文件中的 pgbench

若要逐步執行這個範例,您必須先在資料庫中建立 pgbench 環境。下面的命令是初始化指定資料庫中 pgbench 資料表的基本範本。此範例使用預設的主要使用者帳戶,postgres,用於登入。視需要針對您的 Aurora PostgreSQL 資料庫叢集進行變更。您在叢集的寫入器執行個體上的資料庫中建立 pgbench 環境。

注意

pgbench 初始化過程會刪除並重新建立名為 pgbench_accountspgbench_branchespgbench_historypgbench_tellers 的資料表。請確定當您初始化 pgbench 時,您選擇用於 dbname 的資料庫不會使用這些名稱。

pgbench -U postgres -h db-cluster-instance-1.111122223333.aws-region.rds.amazonaws.com -p 5432 -d -i -s 50 dbname

針對 pgbench,請指定下列參數:

-d

在 pgbench 執行時輸出偵錯報告。

-h

選擇 Aurora PostgreSQL 資料庫叢集的寫入器庫執行個體的端點。

-i

初始化資料庫中的 pgbench 環境,以進行基準測試。

-p

識別用於資料庫連線的連接埠。Aurora PostgreSQL 的預設值通常是 5432 或 5433。

-s

指定用於將資料列填入資料表的擴展係數。預設擴展係數為 1,會在 pgbench_branches 資料表中產生 1 個資料列,在 pgbench_tellers 資料表中產生 10 個資料列,以及在 pgbench_accounts 資料表中產生 10 萬個資料列。

-U

指定 Aurora PostgreSQL 資料庫叢集的寫入器執行個體的使用者帳戶。

設定 pgbench 環境後,您可以使用或不使用連線集區來執行基準測試。預設測試包含每筆交易在指定時間內重複執行的 SELECT、UPDATE 和 INSERT 的一系列五個命令。您可以指定擴展係數、用戶端數量和其他詳細資料,以建立您自己的使用案例的模型。

舉例來說,接下來的命令會以 20 個並行連線 (-c 選項) 執行基準測試 60 秒 (時間為-T 選項)。-C 選項每次都會使用新連線執行測試,而不是每個用戶端工作階段執行一次。此設定可提供連線額外負荷的指示。

pgbench -h docs-lab-apg-133-test-instance-1.c3zr2auzukpa.us-west-1.rds.amazonaws.com -U postgres -p 5432 -T 60 -c 20 -C labdb Password:********** pgbench (14.3, server 13.3) starting vacuum...end. transaction type: <builtin: TPC-B (sort of)> scaling factor: 50 query mode: simple number of clients: 20 number of threads: 1 duration: 60 s number of transactions actually processed: 495 latency average = 2430.798 ms average connection time = 120.330 ms tps = 8.227750 (including reconnection times)

在 Aurora PostgreSQL 資料庫叢集的寫入器執行個體上執行 pgbench,而不重複使用連線,表示每秒只會處理大約 8 筆交易。這在 1 分鐘的測試期間總共提供了 495 筆交易。

如果您重複使用連線,Aurora PostgreSQL 資料庫叢集對使用者數目的回應速度將快上近 20 倍。透過重複使用,系統會處理 9,042 筆交易,而在相同的時間量和相同數量的使用者連線中則處理 495 筆交易。不同之處在於:在以下情況中,每個連線都被重複使用。

pgbench -h docs-lab-apg-133-test-instance-1.c3zr2auzukpa.us-west-1.rds.amazonaws.com -U postgres -p 5432 -T 60 -c 20 labdb Password:********* pgbench (14.3, server 13.3) starting vacuum...end. transaction type: <builtin: TPC-B (sort of)> scaling factor: 50 query mode: simple number of clients: 20 number of threads: 1 duration: 60 s number of transactions actually processed: 9042 latency average = 127.880 ms initial connection time = 2311.188 ms tps = 156.396765 (without initial connection time)

這個範例說明,將連線置於集區可以大幅改善回應時間。如需針對 Aurora PostgreSQL 資料庫叢集設定 RDS Proxy 的詳細資訊,請參閱 使用 Amazon RDS Proxy for Aurora