

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

# 使用集區管理 Aurora PostgreSQL 連線流失
<a name="AuroraPostgreSQL.BestPractices.connection_pooling"></a>

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

對於初學者來說，您可以改善連線流失率高的 Aurora PostgreSQL 資料庫叢集的回應時間。為了這麼做，您可以使用連線集區，例如 RDS Proxy。*連線集區*為用戶端提供立即可用連線的快取。幾乎所有版本的 Aurora PostgreSQL 都支援 RDS 代理。如需詳細資訊，請參閱[使用 Aurora PostgreSQL 的 Amazon RDS Proxy](Concepts.Aurora_Fea_Regions_DB-eng.Feature.RDS_Proxy.md#Concepts.Aurora_Fea_Regions_DB-eng.Feature.RDS_Proxy.apg)。

如果您的特定版本 Aurora PostgreSQL 不支援 RDS Proxy，您可以使用其他與 PostgreSQL 相容的連線集區工具，例如 PgBouncer。如需進一步了解，請參閱 [PgBouncer](https://www.pgbouncer.org/) 網站。

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

## 記錄連線與中斷連線
<a name="AuroraPostgreSQL.BestPractices.connection_pooling.log_connections"></a>

PostgreSQL `log_connections` 和 `log_disconnections` 參數可以擷取 Aurora PostgreSQL 資料庫叢集的寫入器執行個體、的連線和連線中斷。這些參數預設會被關閉。若要開啟這些參數，請使用自訂參數群組，並將值變更為 1 來開啟。如需自訂參數群組的詳細資訊，請參閱 [Amazon Aurora 資料庫叢集的資料庫叢集參數群組](USER_WorkingWithDBClusterParamGroups.md)。若要檢查設定，請依照下列方式使用 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** (日誌和事件) 標籤。如需詳細資訊，請參閱[檢視並列出資料庫日誌檔案](USER_LogAccess.Procedural.Viewing.md)。

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

```
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 偵測連線流失
<a name="AuroraPostgreSQL.BestPractices.connection_pooling.detect-churn"></a>

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

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

![從 RDS 主控台和選取的 Aurora PostgreSQL 資料庫叢集中存取 Performance Insights 的影像。](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_pooling_PI_1.png)


從「Performance Insights」主控台選擇 **Manage metrics** (管理指標)。若要分析 Aurora PostgreSQL 資料庫叢集的連線和中斷連線動作，請選擇下列指標。這些都是來自 PostgreSQL 的指標。
+ `xact_commit` – 已遞交的交易數量。
+ `total_auth_attempts` – 每分鐘嘗試驗證的使用者連線數目。
+ `numbackends` – 目前連線至資料庫的後端數目。

![從 RDS 主控台和選取的 Aurora PostgreSQL 資料庫叢集中存取 Performance Insights 的影像。](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_churn_PI_4.png)


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

在下圖中，您可以看到有 100 個使用者時運行 pgbench 的影響。顯示連線位於一致向上斜坡的直線。若要進一步了解 pgbench 以及如何使用，請參閱 PostgreSQL 文件中的 [pgbench](https://www.postgresql.org/docs/current/pgbench.html)。

![顯示連線集區需要的 Performance Insights 影像。](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_pooling_PI_2.png)


此影像顯示，如果在沒有連線集區的情況下執行最多 100 個使用者的工作負載，可能會導致在整個工作負載處理期間 `total_auth_attempts` 的數量大幅增加。請注意，最好盡可能讓 `total_auth_attempts` 保持接近零。

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

![Performance Insights 的影像顯示 RDS Proxy 對連線集區的優點。](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_pooling_PI_3.png)


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

## 展示連線集區的好處
<a name="AuroraPostgreSQL.BestPractices.connection_pooling.demo-benefit-pooling"></a>

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

與 psql 一樣，pgbench 是一個 PostgreSQL 用戶端應用程式，您可以在本地用戶端機器上安裝和運行。您也可以從用來管理 Aurora PostgreSQL 資料庫叢集的 Amazon EC2 執行個體進行安裝和執行。如需詳細資訊，請參閱 PostgreSQL 文件中的 [pgbench](https://www.postgresql.org/docs/current/pgbench.html)。

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

**注意**  
pgbench 初始化過程會刪除並重新建立名為 `pgbench_accounts`、`pgbench_branches`、`pgbench_history` 和 `pgbench_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](rds-proxy.md)。