前言
在現代雲端架構中,資料庫連線管理是一個關鍵的效能瓶頸。當應用程式規模擴大,特別是在 Serverless 架構下,大量的短暫連線會對資料庫造成巨大壓力。AWS RDS Proxy 正是為了解決這個問題而生的全託管服務。
本文將深入探討 AWS RDS Proxy 的連線池管理機制,從基礎概念到進階設定,幫助您充分發揮這項服務的潛力。
1. RDS Proxy 概述與優勢
什麼是 RDS Proxy?
AWS RDS Proxy 是一個全託管、高可用的資料庫代理服務,位於應用程式與 RDS 資料庫之間。它會維護一個連線池,讓應用程式可以共享這些連線,大幅減少資料庫的連線負擔。
核心優勢
1. 連線池管理
- 自動管理資料庫連線的建立與回收
- 減少連線建立的延遲(通常需要 20-30ms)
- 避免資料庫達到最大連線數限制
2. 提升應用程式彈性
- 在資料庫故障切換期間,自動將連線路由到新的主節點
- 減少故障切換時間,從數分鐘降至數十秒
3. 增強安全性
- 與 AWS Secrets Manager 整合,集中管理資料庫認證
- 支援 IAM 認證,無需在程式碼中儲存密碼
- 強制使用 TLS 加密傳輸
4. Serverless 最佳化
- 特別適合 Lambda 函數的短暫連線模式
- 避免 Lambda 冷啟動時的連線風暴
架構示意
| |
2. 支援的資料庫引擎
RDS Proxy 目前支援以下資料庫引擎:
MySQL 相容引擎
| 引擎 | 支援版本 |
|---|---|
| Amazon RDS for MySQL | 5.6, 5.7, 8.0 |
| Amazon Aurora MySQL | 1.x (MySQL 5.6), 2.x (MySQL 5.7), 3.x (MySQL 8.0) |
PostgreSQL 相容引擎
| 引擎 | 支援版本 |
|---|---|
| Amazon RDS for PostgreSQL | 10, 11, 12, 13, 14, 15, 16 |
| Amazon Aurora PostgreSQL | 10.x, 11.x, 12.x, 13.x, 14.x, 15.x, 16.x |
MariaDB
| 引擎 | 支援版本 |
|---|---|
| Amazon RDS for MariaDB | 10.3, 10.4, 10.5, 10.6 |
SQL Server
| 引擎 | 支援版本 |
|---|---|
| Amazon RDS for SQL Server | 2016, 2017, 2019, 2022 |
3. 建立與設定 RDS Proxy
使用 AWS CLI 建立 RDS Proxy
步驟一:建立 Secrets Manager Secret
首先,將資料庫認證儲存在 Secrets Manager 中:
| |
步驟二:建立 IAM Role
建立 RDS Proxy 使用的 IAM Role,允許其存取 Secrets Manager:
| |
建立 Role:
| |
步驟三:建立 RDS Proxy
| |
步驟四:建立 Target Group 並註冊資料庫
| |
使用 Terraform 建立 RDS Proxy
| |
4. IAM 認證整合
啟用 IAM 認證
IAM 認證讓您可以使用 AWS 認證來連接資料庫,無需管理資料庫密碼。
在 RDS 實例上啟用 IAM 認證
| |
建立資料庫使用者並授予 IAM 認證權限
MySQL:
| |
PostgreSQL:
| |
設定 IAM Policy
為應用程式的 IAM Role 新增連接 RDS Proxy 的權限:
| |
使用 IAM 認證連接 RDS Proxy
Python 範例
| |
Node.js 範例
| |
5. 連線池行為調校
Target Group 設定參數
RDS Proxy 的連線池行為可透過 Target Group 進行調整:
| |
關鍵參數說明
MaxConnectionsPercent
- 定義:RDS Proxy 可使用的最大資料庫連線數百分比
- 預設值:100
- 建議:根據資料庫執行個體類型調整
- 範例:若 RDS 最大連線數為 200,設定 50% 代表 Proxy 最多使用 100 個連線
MaxIdleConnectionsPercent
- 定義:閒置連線佔 MaxConnectionsPercent 的百分比
- 預設值:50
- 建議:Serverless 工作負載可降低至 10-25%
ConnectionBorrowTimeout
- 定義:等待可用連線的最長時間(秒)
- 預設值:120
- 建議:根據應用程式超時設定調整
Session Pinning 管理
Session Pinning 會將連線固定給特定客戶端,降低連線共享效率。
常見觸發 Pinning 的情況
- 使用預備語句(Prepared Statements)
- 設定會話變數
- 使用臨時表
- 鎖定表格
- 使用使用者定義變數
減少 Pinning 的策略
| |
可用的 SessionPinningFilters:
EXCLUDE_VARIABLE_SETS:排除因設定變數而產生的 Pinning
最佳實踐建議
| |
6. Lambda 與 RDS Proxy 整合
為何 Lambda 需要 RDS Proxy?
Lambda 函數的特性會造成資料庫連線問題:
- 冷啟動:每次冷啟動都需要建立新連線
- 並行執行:高併發時會產生大量連線
- 短暫執行:連線建立後很快就會關閉
- 無法共享:每個執行環境獨立,無法共享連線
Lambda 函數設定
Python Lambda 範例
| |
Lambda 函數的 Terraform 設定
| |
Lambda 連線最佳實踐
- 連線重用:利用 Lambda 容器重用機制,在處理函數外初始化連線
- 適當超時:設定合理的連線超時,避免等待過久
- 錯誤處理:妥善處理連線錯誤,實作重試機制
- 監控指標:追蹤連線使用情況和錯誤率
| |
7. 監控與效能指標
CloudWatch 指標
RDS Proxy 提供多種 CloudWatch 指標供監控:
連線相關指標
| 指標名稱 | 說明 | 建議閾值 |
|---|---|---|
ClientConnections | 當前客戶端連線數 | 根據預期流量設定 |
ClientConnectionsNoTLS | 非 TLS 連線數 | 應為 0 |
ClientConnectionsSetupSucceeded | 成功建立的連線數 | 監控趨勢 |
ClientConnectionsSetupFailedAuth | 認證失敗的連線數 | 應接近 0 |
DatabaseConnections | 到資料庫的連線數 | < MaxConnectionsPercent |
DatabaseConnectionsCurrentlyBorrowed | 正在使用的資料庫連線 | 監控峰值 |
AvailabilityPercentage | Proxy 可用性百分比 | > 99.9% |
效能相關指標
| 指標名稱 | 說明 | 建議閾值 |
|---|---|---|
QueryRequests | 查詢請求數 | 監控趨勢 |
QueryRequestsNoTLS | 非 TLS 查詢數 | 應為 0 |
QueryDatabaseResponseLatency | 資料庫回應延遲 | < 100ms |
建立 CloudWatch Dashboard
| |
設定 CloudWatch Alarms
| |
啟用 Debug Logging
| |
查看 Debug 日誌:
| |
8. 故障切換與高可用
RDS Proxy 的高可用架構
RDS Proxy 天生具備高可用性:
- 自動部署在多個可用區域
- 維護與後端資料庫的健康連線池
- 自動偵測資料庫故障並重新路由
故障切換行為
Aurora 叢集故障切換
當 Aurora 主節點故障時:
- RDS Proxy 偵測到連線中斷
- 自動將請求路由到新的主節點
- 應用程式可能收到暫時錯誤
- 重試後即可使用新連線
| |
讀寫分離端點
RDS Proxy 支援建立只讀端點:
| |
應用程式層級的讀寫分離
| |
故障切換測試
定期測試故障切換流程:
| |
總結
AWS RDS Proxy 是一個強大的資料庫連線管理解決方案,特別適合以下場景:
- Serverless 架構:Lambda 函數的大量短暫連線
- 高併發應用:需要高效管理資料庫連線池
- 微服務架構:多個服務共享資料庫連線資源
- 安全要求高的環境:需要 IAM 認證和強制 TLS
關鍵重點回顧
- 選擇適合的連線池參數配置
- 善用 IAM 認證提升安全性
- 監控關鍵指標並設定警報
- 實作應用程式層級的重試邏輯
- 定期測試故障切換流程
透過正確設定和監控 RDS Proxy,您可以大幅提升資料庫的可用性、安全性和效能。