Amazon RDS 與 Aurora 是 AWS 上大多數工作負載的資料層,在 SOA-C02 中它們穩穩落在 Domain 2(可靠性與業務連續性)的核心地帶——Task Statement 2.1 要求「實作可擴展性與彈性」,Task Statement 2.2 要求「實作高可用性與韌性環境」。SAA-C03 問的是「這個工作負載該用 Multi-AZ 還是 Read Replica?」,SOA-C02 問的是「Failover 花了 8 分鐘而非預期的 90 秒——你會改什麼?」、「Read Replica 落後 600 秒且還在擴大——根本原因是什麼?」以及「一個 ALTER 參數變更顯示 pending-reboot——它實際上什麼時候生效?」RDS 與 Aurora 韌性正是 SysOps 層級與架構師層級分歧最明顯的主題:架構師選拓撲,SysOps 工程師負責維持它的運作、調整參數、執行 Failover,並在凌晨三點接手 pager。
本指南從運維角度完整走過 RDS 與 Aurora 韌性:Multi-AZ Failover 在底層如何實際運作、Multi-AZ DB Cluster(較新的三節點變體)與傳統 Multi-AZ 有何不同、Aurora 的六向儲存複製如何實現 30 秒以內的 Failover、如何在不違反耐久性的前提下設定 Read Replica、何時 RDS Proxy 是應對連線風暴的正確工具、static 與 dynamic 參數對 Maintenance Window 意味著什麼、Blue/Green Deployment 如何在不改寫應用程式碼的情況下切換資料庫,以及 Performance Insights 如何找出那個正在燒掉 CPU 的 SQL 語句。你也會看到反覆出現的 SOA-C02 場景:Replica 晉升執行手冊、Failover 時間疑難排解、Parameter Group 套用方法混淆、建立後無法切換的加密設定,以及 Cluster Endpoint 與 Instance Endpoint 的陷阱——幾乎每兩位考生就有一位中招。
為什麼 RDS 與 Aurora 韌性是 SOA-C02 Domain 2 的核心
官方 SOA-C02 Exam Guide v2.3 在 Task Statement 2.1 下明確點名 RDS 與 Aurora Replica(「實作 Amazon RDS replicas 和 Amazon Aurora Replicas」),並在 Task Statement 2.2 下框定 Multi-AZ 部署(「區分單一 Availability Zone 與 Multi-AZ 部署的用途……適用於 Amazon RDS」)。這兩項技能合起來涵蓋了關聯式資料庫在 AWS 上的完整運維生命週期——佈建 Replica、設定 Multi-AZ、監控 Lag、執行 Failover,以及從備份中還原。RDS 與 Aurora 韌性也間接出現在 Domain 1(針對 DatabaseConnections、ReplicaLag、FreeableMemory 設 CloudWatch alarm)、Domain 3(佈建 Multi-AZ DB 的 CloudFormation 範本)、Domain 4(DB 憑證的 KMS 加密與 Secrets Manager 輪換)以及 Domain 6(用於查詢調整的 Performance Insights、提升連線效率的 RDS Proxy)之中。
在 SysOps 層級,問題的框架是運維而非架構設計。SAA-C03 問「哪種 RDS 部署拓撲具備最高可用性?」,並獎勵選出 Multi-AZ DB Cluster 或 Aurora 的考生。SOA-C02 問「生產資料庫上週 Failover 兩次——你會先看哪些 metrics,以及會改什麼設定?」答案幾乎不是「換一種拓撲」,而是 BinLogDiskUsage、ReplicaLag、Maintenance Window 時間點、Parameter Group 的 apply_method,或是 Promotion Tier 的排序。Domain 2 的每個其他主題都依賴 RDS 與 Aurora 韌性:ELB 與 Auto Scaling 後方的應用程式層(EC2 主題)仰賴資料庫保持正常;備份與 DR 主題依靠 RDS PITR 與 Aurora Cluster Snapshot;Domain 6 的效能調整主題則倚仗 Performance Insights 與 RDS Proxy。
- Multi-AZ deployment(傳統):一種 RDS 部署,包含一個 Primary Instance 與位於不同 Availability Zone 的一個同步 Standby,共用一個在 Failover 時切換的 DNS Endpoint。Standby 不提供流量服務。
- Multi-AZ DB Cluster:較新的 RDS 部署,包含一個 Writer 與跨三個 AZ 的兩個可讀 Standby,使用半同步複製。可讀 Standby 透過 Reader Endpoint 提供讀取流量服務。
- Read Replica(RDS):RDS Primary 的非同步副本,提供讀取流量服務。大多數引擎每個 Primary 最多 15 個。本身並非高可用性機制。
- Aurora Cluster:一個邏輯資料庫,包含一個 Writer 與最多 15 個 Aurora Replica,共用一個在三個 AZ 間六向複製的分散式儲存磁碟區。
- Cluster Endpoint(Aurora):Writer Endpoint,始終指向目前的 Primary。
- Reader Endpoint(Aurora):負載平衡的 DNS Endpoint,將讀取連線分發到所有 Aurora Replica。
- Custom Endpoint(Aurora):使用者定義的 Endpoint,指向叢集 Instance 中的特定子集(例如報表讀取池)。
- Instance Endpoint:每個 Instance 的 DNS 名稱,繞過叢集層級的負載平衡。
- Promotion Tier:0–15 的優先順序值,決定 Failover 時的晉升順序;數字越低代表優先順序越高。
- Parameter Group:資料庫引擎參數的具名集合;
static參數需要重新開機,dynamic參數立即生效。 - Maintenance Window:每週 30 分鐘的時間槽,AWS 在此期間可能套用修補程式與待處理的參數變更。
- Blue/Green Deployment:一種受管 RDS 功能,建立 Blue(生產)資料庫的同步化 Green 副本,讓你進行測試,然後以原子方式交換 Endpoint。
- RDS Proxy:受管連線池 Proxy,吸收連線風暴並在 DB Failover 時透明地維持連線。
- Performance Insights:受管 RDS 儀表板,顯示以 SQL 語句、Wait Event、Host 和 User 分解的 DB Load(Average Active Sessions)。
- Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html
白話文解釋 RDS 與 Aurora 韌性
RDS 與 Aurora 的術語堆疊得很快——Multi-AZ vs Multi-AZ DB Cluster vs Read Replica vs Aurora Replica vs Reader Endpoint vs Cluster Endpoint。三個類比可以讓這些概念牢牢地固定在腦海中。
類比一:夜市攤位的備用廚師
單一 AZ 的 RDS Instance 就像夜市裡只有一個師傅的攤位。師傅生病沒來,攤位就停賣——直到找到新師傅才能重新開張。傳統 Multi-AZ RDS 是一個主攤位加上隔壁巷子一個同步跟做每道菜的備用師傅。備用師傅同步複製每道料理的步驟(同步複製),但從不對客人服務——他存在的唯一目的是主師傅突然不能來的那一天。當這天來臨,攤位老闆(RDS 控制平面)把「現在開賣」的牌子翻到巷子那邊,讓同一個電話號碼(DNS Endpoint)接通到備用師傅的攤位。切換需要 60 到 120 秒。
Multi-AZ DB Cluster 是三條街各一個攤位組成的連鎖夜市——一個主師傅負責出菜,另外兩條街各有一個師傅既能接配菜訂單(沙拉、飲料,即讀取請求)又同步跟著主師傅做主菜。主師傅倒下時,其中一位師傅在約 35 秒內接手,因為他們原本就在做大部分的工作了。客人打去問「今天有什麼推薦?」的電話(Reader Endpoint)本來就是接到旁邊的師傅,所以問問題的電話根本沒感覺到主師傅換了人。
Aurora 是一個中央備料廚房加上最多 15 個出餐站。有一個寫入站把新菜放上輸送帶(共用分散式儲存磁碟區),最多 15 個讀取站從輸送帶上取菜送給客人。輸送帶本身在三條街上有六份完全一樣的副本同時運轉——同時失去兩條街也不會損失任何一道菜。當寫入站故障,最近的出餐站在大約 30 秒內轉換成「寫入」模式,排隊等待的客人移到下一個站。
RDS Read Replica 是散佈在城市各處的行動餐車衛星。主攤位非同步地把每道菜的配方傳給它們(每隔幾秒)。只想看菜單的客人可以去餐車,減輕主攤位的負擔。但餐車不接受新訂單,而且有時候配方會落後一些。落後太多的餐車就有很高的 Replica Lag。
類比二:圖書館的館規手冊
DB Parameter Group 是圖書館的館規手冊。Static 參數是印在正式手冊裡的規定(max_connections、shared_buffers)——要更改它們,你必須重印手冊並在週一早上重新開館(重新開機)。Dynamic 參數是公佈欄上的告示(autovacuum_naptime、log_min_duration_statement)——換一張告示,館員幾分鐘內就能看到。Apply method pending-reboot 意思是「我們更新了手冊草稿,但館員用的還是舊版,等下次重新開館才換」。Dynamic 參數的 Apply method immediate 就是現在就換上的公佈欄告示,立刻生效。
Maintenance Window 是每週的固定打烊時間,清潔人員(AWS)在這時段做例行工作——小版本升級、OS 修補、套用你排隊等待的 pending-reboot 參數。如果你把視窗設在週日凌晨三點,而有 pending-reboot 的參數在等待,那就是在那時候套用。Major 版本升級比較像是整修裝潢——只在你明確批准時才進行,就算已排程也一樣。
類比三:公司總機接待員
RDS Proxy 是公司的前台接待員。沒有接待員時,每位訪客(應用程式連線)直接走向特定員工(資料庫連線槽)。當 500 位訪客同時湧進一個小辦公室(Lambda 暴增、流量尖峰),辦公室的座位不夠,開始拒絕訪客(too many connections)。有接待員時,訪客在大廳排隊;接待員維持著與員工之間固定數量的對話,一旦有空位,下一位訪客就被接通。辦公室大樓換地址(DB Failover),接待員悄悄移到新大樓,訪客幾乎沒有感覺——接待員的號碼是一樣的。RDS Proxy 就是這樣處理資料庫連線的:池化、多工,並在 Failover 時維持應用程式端 socket,同時悄悄重新連接到新的 Primary。
在 SOA-C02 中,當題目混合 Multi-AZ 與 Read Replica 時,夜市攤位的類比最實用。Multi-AZ = 為了韌性而同步跟做的備用師傅,但從不服務客人;Read Replica = 服務菜單讀取但會落後主攤位的行動餐車。Aurora = 有多個出餐站共用一條輸送帶的中央廚房。考試中的錯誤答案是把 Read Replica 當成 HA——它們是水平擴展,不是韌性。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html
RDS Multi-AZ:同步 Standby 與自動 Failover
傳統 Multi-AZ 是每種 RDS 引擎(PostgreSQL、MySQL、MariaDB、Oracle、SQL Server)的第一線 HA 機制。大多數考生聽到「RDS 韌性」時第一個想到的就是它。
架構
在傳統 Multi-AZ 中,RDS 在同一 Region 的兩個 AZ 中佈建兩個 Instance:
- 一個 Primary,處理所有讀取與寫入。
- 一個 Standby,維持 Primary 儲存的同步、逐位元組副本。Standby 不提供任何流量服務——對應用程式而言是不可見的。
複製在儲存層是同步的(SQL Server 使用引擎層面的鏡像或 AlwaysOn)。Primary 上的每次 commit 都會阻塞,直到 Standby 確認已將寫入持久化到其 EBS 磁碟區。這意味著對於已提交的交易,RPO 實際上為零。代價是與單一 AZ 相比,每筆交易多了一點延遲。
Endpoint 與 DNS
整個 Multi-AZ 配對只有一個 DNS Endpoint——例如 mydb.abc123.us-east-1.rds.amazonaws.com。Endpoint 解析到目前 Primary 的 IP 位址。Failover 時,RDS 更新 DNS 記錄,讓同一個 hostname 現在指向新的 Primary(原先的 Standby,現已晉升)。
自動 Failover 觸發條件
RDS 持續監控 Primary,並在以下情況觸發自動 Failover:
- Primary Instance 故障(硬體、Hypervisor 或 AZ 中斷)。
- Primary 所在 AZ 失去網路連線。
- Primary EBS 磁碟區發生儲存故障。
- 計畫性 Maintenance 期間的計算故障。
- 手動 Failover,透過帶有
ForceFailover=true的RebootDBInstanceAPI,或透過主控台「Reboot」並勾選 Failover 核取方塊。
Standby 故障並不會觸發任何切換——Standby 會在背景被替換,同時 Primary 持續提供服務。
Failover 時間
傳統 Multi-AZ Failover 端對端需要 60 到 120 秒。 計時包括:
- 偵測 Primary 故障(10–30 秒,視故障模式而定)。
- 將 Standby 晉升為 Primary(DB 引擎復原、log replay)。
- DNS 傳播——CNAME 已更新,但用戶端 DNS 快取和 JDBC 連線池可能保留舊條目,直到重新解析。
使用 JDBC driver 並設定 TCP 層 keep-alive 與短 DNS TTL 的應用程式恢復最快。有長期連線且積極用戶端 DNS 快取(尤其是 JVM 預設的永久快取)的應用程式,會在快取有效期間持續失敗,通常要到手動重啟才能恢復。
- 傳統 Multi-AZ RDS Failover:通常 60 到 120 秒。
- Multi-AZ DB Cluster Failover:通常低於 35 秒(AWS 文件中常寫成「less than 35s」)。
- Aurora Failover:當叢集中存在 Aurora Replica 時通常低於 30 秒;若無 Replica,Aurora 必須啟動新 Instance,可能需要數分鐘。
- 每個 RDS Primary 最多 Read Replica 數量:MySQL、MariaDB、PostgreSQL 為 15 個;Oracle 與 SQL Server 為 5 個(視引擎而定,請查閱最新文件)。
- 每個 Aurora Cluster 最多 Aurora Replica 數量:15 個。
- 備份保留期:自動備份 1–35 天(手動 Snapshot:無限期,直到你刪除)。
- PITR 粒度:保留視窗內的任意秒。
- Maintenance Window 最短長度:30 分鐘。
- Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html
Multi-AZ 不做的事
這是 Multi-AZ 上最常被 SOA-C02 測試的陷阱:
傳統 Multi-AZ Standby 純粹是 Failover 目標。它無法被你的應用程式存取,不會以獨立 Endpoint 的形式出現,也無法用來擴展讀取。選擇 Multi-AZ 來「將報表查詢從 Primary 卸載」的考生會答錯。讀取擴展的正確答案是 Read Replica(RDS)、Aurora Replica(Aurora),或 Multi-AZ DB Cluster(較新的三節點變體,其中 Standby 是可讀的)。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html
Multi-AZ 也無法防範邏輯損壞——如果 Primary 執行了 DROP TABLE,它會立即複製到 Standby,兩端的資料表都消失了。邏輯復原需要自動備份與 Point-in-Time Restore(後面會介紹)。
Multi-AZ DB Cluster:現代三節點變體
2022 年 AWS 為 MySQL 和 PostgreSQL 推出了 Multi-AZ DB Cluster——一種較新的部署拓撲,解決了傳統 Multi-AZ 的兩個限制。
架構
Multi-AZ DB Cluster 包含:
- 三個 Instance 跨三個 AZ:一個 Writer 加兩個可讀 Standby。
- 引擎層面的半同步複製(MySQL binary log shipping、PostgreSQL streaming replication)。
- Writer 上的 commit 在兩個 Standby 中至少一個確認後即被認可——不需要等兩個都確認。
對外暴露三個 Endpoint:
- Writer Endpoint — 指向目前的 Writer。
- Reader Endpoint — 對兩個 Standby 進行負載平衡以服務讀取流量。
- Per-instance Endpoint — 三個 Instance 各一個,供你需要精確指定某個 Instance 時使用。
為什麼它存在
相較於傳統 Multi-AZ 的兩項運維優勢:
- Failover 低於 35 秒 — 比傳統 Multi-AZ 快一倍,因為 Standby 已在運行引擎且快取是熱的。
- 可讀 Standby — Standby 終於物盡其用,提供讀取流量服務,縮小與 Aurora 的差距。
何時選擇哪種
- Multi-AZ DB Cluster:引擎為 MySQL 或 PostgreSQL、需要 35 秒以內 Failover,且可將可讀 Standby 用於部分讀取卸載。
- 傳統 Multi-AZ:引擎為 Oracle、SQL Server 或 MariaDB(目前尚不支援 Multi-AZ DB Cluster),或需要同步複製以確保嚴格 RPO=0(Multi-AZ DB Cluster 的半同步模型存在微小的理論 RPO 視窗)。
- Aurora:需要最低 Failover 時間、六向儲存複製和最多 15 個可讀 Replica——且引擎為 MySQL 或 PostgreSQL 相容。
在 SOA-C02 中,「Multi-AZ」這個詞含義過載。閱讀每道題目時要注意修飾語。「Multi-AZ deployment」通常指傳統的兩個 Instance Multi-AZ。「Multi-AZ DB Cluster」或「Multi-AZ DB Cluster deployment」特指三個 Instance 的變體。Failover 時間、讀取可擴展性和引擎支援都不同。混淆兩者是 SOA-C02 最常見的錯誤之一。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts.html
RDS Read Replica:非同步讀取擴展
Read Replica 是 RDS Primary 的非同步副本,可透過自己的 DNS Endpoint 存取,專門服務讀取流量。
Read Replica 的用途
- 讀取擴展 — 將
SELECT查詢卸載到一個或多個 Replica,以降低 Primary 負載。 - 跨 Region 災難復原 — 跨 Region Read Replica 是 RDS 低 RPO/低 RTO DR 的標準模式。
- 工作負載隔離 — 繁重的報表查詢可在專用 Replica 上執行,不影響交易流量。
- 遷移目標 — 你可以將 Read Replica 晉升為獨立 Primary,用於引擎升級或主要版本遷移。
複製機制
RDS Read Replica 使用引擎原生非同步複製——MySQL binlog/GTID、PostgreSQL streaming WAL、MariaDB binlog。複製持續運行,Lag 由 ReplicaLag CloudWatch metric(以秒為單位)追蹤。健康的 Replica 有幾秒的 Lag;持續數十秒或不斷增長的 Lag 是問題。
最大數量
- MySQL、MariaDB、PostgreSQL:每個 Primary 最多 15 個 Read Replica。
- Oracle:通常最多 5 個 Read Replica(視引擎而定)。
- SQL Server:支援有限——某些版本存在 Read Replica,但有引擎特定的限制。
你也可以在 MySQL/MariaDB 上建立 Read Replica 的 Read Replica(串聯),以鏈接複製,適用於非常高的讀取扇出或地理分佈。
晉升 Read Replica
要將 Read Replica 用作新 Primary(用於 DR 或遷移),呼叫 PromoteReadReplica API。晉升會:
- 停止來自原始 Primary 的複製。
- 移除 Read Replica 的唯讀標誌——它現在可以接受寫入。
- 切斷關係——不會自動重新附加。
- 不會變更 Endpoint。Replica 保留其原始 DNS 名稱;應用程式必須重新設定連線字串以指向晉升後的 Instance。
晉升本身需要幾分鐘(取決於引擎和待處理的複製積壓)。對於 DR,典型 RTO 為 5–15 分鐘,包括晉升加上應用程式重新設定加上 DNS 更新。
::warning這是 SOA-C02 在 Read Replica 上最常測試的陷阱。Read Replica 不是高可用性機制。Primary 故障時,RDS 不會自動晉升 Read Replica。你必須手動啟動 PromoteReadReplica(或透過你用 EventBridge + Lambda 建立的自動化)。自動 Failover 的答案是 Multi-AZ(傳統或 DB Cluster)或 Aurora。把 Read Replica 與 HA 混淆是必錯的答案。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ReadRepl.html
::
Replica Lag——原因與修復
ReplicaLag 上升表示 Replica 無法跟上 Primary 的寫入量。常見原因:
- 舊版 MySQL 的單執行緒複製套用 — 使用並行複製(multi-threaded slave)修復,或升級引擎版本。
- Primary 上長時間執行的交易,在提交前阻塞 log shipping。
- Replica Instance 類別小於 Primary — 對於寫入密集的工作負載,Replica 應與 Primary Instance 類別匹配或更大。
- Replica I/O 瓶頸 — 將 Replica 的儲存從 gp2 切換到帶有 Provisioned IOPS 的 gp3,或切換到 io2 Block Express 以獲得次毫秒延遲。
- Replica 被讀取飽和 — 增加另一個 Replica 並進行負載平衡;或使用 Aurora Reader Endpoint 以獲得內建負載平衡。
針對 ReplicaLag 設定 CloudWatch alarm(每個 Replica 的 dimension DBInstanceIdentifier),閾值根據你的應用程式需求設定——通常為 60–300 秒。
Aurora 架構:Writer 加最多 15 個 Reader 共用分散式儲存
Aurora 是 AWS 重新設計的關聯式資料庫引擎,在 SQL 層與 MySQL 和 PostgreSQL 相容,但具有根本不同的儲存與複製架構。
儲存層
Aurora 的 Writer 和 Reader 沒有用於實際資料的本機磁碟。它們共用一個分散式 Cluster Volume,自動在三個 Availability Zone 間六向複製(每個 AZ 兩份副本)。寫入在六份副本中的四份持久化後被認可(寫入 quorum);讀取可以在六份中的三份完成(讀取 quorum)。這意味著 Aurora 能夠承受:
- 整個 AZ 加一份額外副本的損失而不丟失資料。
- 整個 AZ 的損失而不損失讀取可用性。
Cluster Volume 以 10-GiB 為單位自動增長,最多 128 TiB,舊分段持續重新平衡以避免熱點。
計算層
一個 Cluster 有一個 Writer 和最多 15 個 Aurora Replica。Cluster 中的所有 Instance 看到的是同一個共用儲存——Replica 不是在製作本機副本,而是直接從同一個底層 Volume 讀取。這產生了三個 Aurora 獨有的運維特性:
- 複製幾乎是即時的 — 通常只有 10–20 毫秒的 Lag,因為沒有 log shipping;Replica 只是讀取稍新一點的頁面版本。
- Failover 很快 — 當至少一個 Replica 存在時低於 30 秒,因為 Replica 的快取已是熱的且儲存是共用的。
- Replica 獨立擴展讀取 — 它們從 Writer 正在更新的同一個 Volume 讀取,除了複製訊號外不對 Writer 造成額外負擔。
Aurora Endpoint
Aurora 暴露四種 Endpoint 類型:
- Cluster(Writer)Endpoint — 指向目前 Primary 的 DNS 名稱。始終可寫入。用於應用程式寫入。
- Reader Endpoint — 在 Cluster 中所有 Aurora Replica 間進行負載平衡的 DNS 名稱。用於應用程式唯讀查詢。
- Custom Endpoint — 使用者定義的 Endpoint,指向所選 Cluster Instance 子集(例如,指向兩個專用於 BI 查詢的大型 Replica 的
reportingEndpoint)。 - Instance Endpoint — 每個 Instance 的 DNS 名稱。繞過叢集層級路由——適用於診斷、Replica 特定測試或遷移腳本。
Failover 行為
Aurora Failover 在 Writer 故障、AZ 故障或手動呼叫 FailoverDBCluster API 時觸發。控制平面:
- 偵測 Writer 故障(10–20 秒,視健康檢查頻率而定)。
- 根據 Promotion Tier 選擇最高優先級的 Replica(0 最高,15 最低;同級別按 Instance 大小打破平局,傾向於匹配 Writer)。
- 將選定的 Replica 晉升為 Writer(儲存已共用,因此不需要資料移動)。
- 更新 Cluster Endpoint DNS 以指向新 Writer。
- 舊 Replica 重新附加到新 Writer 以進行複製訊號傳送。
總時間:當至少一個 Replica 存在時通常低於 30 秒。若 Cluster 沒有 Replica,Aurora 必須啟動新 Instance,這可能需要數分鐘——這是「Aurora 韌性」設定錯誤的最糟情況。
在你最希望在 Failover 中成為 Writer 的 Replica 上設定 Promotion Tier 0(通常是最大的、位於大多數客戶端所在 AZ 的 Replica),並在你不希望被晉升的專用報表 Replica 上設定較高的 Tier。AWS 優先選擇編號最小的 Tier;平局按 Instance 大小打破。SOA-C02 測試這個場景:「Aurora 晉升了一個無法承受生產寫入負載的小型報表 Replica」——解決方法是重新排序 Promotion Tier,而不是增加更多 Replica。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.AuroraHighAvailability.html
Aurora Global Database(範圍外重點)
Aurora Global Database 將 Cluster 跨 Region 延伸,具備次秒跨 Region 複製和受管跨 Region Failover。SOA-C02 並不深入測試 Global Database(那更屬於 SAP 層級),但你應該知道它存在,並且它是「RPO 低於 1 秒跨 Region」場景的答案。
Aurora Replica Auto Scaling:Reader Endpoint 行為
Reader Endpoint 使用 Round-robin DNS 策略在所有 Replica 間進行負載平衡。SOA-C02 上有兩個重要的運維細節:
DNS 負載平衡
Reader Endpoint 的 DNS 以短 TTL 解析(通常為 5 秒)。每次新連線都進行一次新的 DNS 查詢並落到不同的 Replica——這就是為什麼永久保持連線的 JDBC 連線池可能會固定在一個 Replica 上,造成 Cluster 負載不均。解決方法是應用程式層面的連線循環(max connection lifetime)或 RDS Proxy,它在 Aurora 之上實現了適當的負載平衡。
Replica 的 Aurora Auto Scaling
Aurora 支援基於 CloudWatch metrics 的 Application Auto Scaling 用於讀取 Replica 數量——通常是跨 Replica 平均的 CPUUtilization 或 DatabaseConnections。Scaling 策略可以按需求將 Replica 數量從最小值(例如 2)增加到最大值(例如 8)。這是「讀取負載在上班時間和夜間之間相差 10 倍」場景的 SysOps 層級功能。
在 SOA-C02 中,當題目描述「我們增加了更多 Aurora Replica,但現有的應用程式連線仍然全部打到原本的兩個 Replica」,答案是連線池行為:長期 JDBC 連線不會重新解析 DNS。解決方法是 RDS Proxy(在連線層進行負載平衡)或在連線池設定中套用 connectionTimeout/maxLifetime 以定期回收連線。增加更多 Replica 在連線從不重新解析的情況下無濟於事。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.Endpoints.html
RDS Proxy:Lambda 與高並發工作負載的連線池
RDS Proxy 是一個完全受管的資料庫 Proxy,用於池化和共用到後端 RDS 或 Aurora 資料庫的連線。
RDS Proxy 存在的原因
它解決的三個運維痛點:
- Lambda 連線風暴 — 每次 Lambda 呼叫都開啟一個新 DB 連線,在突發負載下會耗盡資料庫的連線預算。RDS Proxy 維持固定的連線池並從中服務 Lambda。
- 高連線數應用程式 — PHP-FPM、傳統 Rails 應用程式和短期 Worker 可能使
max_connections達到飽和。RDS Proxy 將數千個用戶端連線多工到一個小型後端連線池。 - Failover 透明性 — RDS Proxy 在 Failover 時維持應用程式端 TCP socket,同時重新連接到新 Primary,將應用程式的 Failover 影響從 60–120 秒縮短到幾秒。
設定機制
你建立一個與一個 RDS Instance 或 Aurora Cluster 關聯的 RDS Proxy。Proxy:
- 存在於你的 VPC 中(每個子網路一個 ENI)。
- 使用 Secrets Manager 取得資料庫憑證——IAM 主體呼叫 Proxy,Proxy 呼叫 Secrets Manager 取得實際 DB 憑證。
- 透過 IAM 身份驗證或 DB 憑證對用戶端進行身份驗證。
- 有自己的 Endpoint,應用程式連接到這個 Endpoint(而不是直接連接到 DB 的 Endpoint)。
- 支援 Aurora 的讀寫分離(帶有唯讀模式的 Proxy Endpoint)。
限制與注意事項
- RDS Proxy 為每次查詢增加幾毫秒延遲。
- 它不是免費的——按底層資料庫 Instance 的 vCPU 計費。
- Pinning 可能阻止連線共用——當一個 Session 保持開啟的交易、使用特定設定的準備語句,或設定 Session 變數時,Proxy 會將用戶端「固定」到一個特定的後端連線,直到 Session 關閉。高 Pinning 率會削弱多工的好處;CloudWatch metric
DatabaseConnectionsCurrentlySessionPinned追蹤這一點。
Failover 加速
RDS Proxy「透明 Failover」的好處是 SOA-C02 上最常測試的功能。Primary 故障時:
- 應用程式到 Proxy 的連線保持開啟。
- Proxy 的後端連線中斷。
- Proxy 悄悄重新連接到新 Primary。
- 應用程式進行中的查詢可能失敗(Proxy 無法重播),但下一個查詢在幾秒內成功——沒有 socket 重置,沒有 DNS 重新解析。
在 SOA-C02 中,當場景描述「Lambda 函數呼叫 RDS 資料庫在尖峰期間遇到 too many connections 錯誤」,答案是 RDS Proxy。Lambda 的突發模式(數千個並發呼叫,每個都開啟新連線)正是 RDS Proxy 的設計用途。提高 max_connections 是臨時修復,可能損害資料庫的記憶體佔用;RDS Proxy 是永久答案。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.html
Parameter Group:Static、Dynamic 與 Apply Method 陷阱
DB Parameter Group 是資料庫引擎參數(max_connections、shared_buffers、wait_timeout 等)的具名集合。每個 RDS Instance 恰好關聯一個 Parameter Group;多個 Instance 可以共用同一個 Group。
Static 與 Dynamic 參數
每個參數都有 static 或 dynamic 的 apply_type:
- Static 參數需要資料庫重新開機才能生效。變更 Static 參數會將 Instance 狀態設為
pending-reboot。變更不會套用,直到下次重新開機——由你啟動、Multi-AZ Failover,或 Maintenance Window 修補。 - Dynamic 參數立即或最多幾秒內生效,無需重新開機。
哪些參數是 Static 或 Dynamic 的清單視引擎而定,在 Parameter Group 主控台中可見。幾個例子:
- MySQL
max_connections— 大多數版本上是 Dynamic(變更立即生效)。 - MySQL
innodb_buffer_pool_size— Static(需要重新開機)。 - PostgreSQL
shared_buffers— Static。 - PostgreSQL
log_min_duration_statement— Dynamic。
ModifyDBInstance 上的 Apply Method
透過 API 或主控台變更參數時,你選擇 ApplyMethod:
immediate— 盡快套用。對於 Dynamic 參數,這是即時的;對於 Static 參數,這意味著「立即重新開機資料庫」(API 呼叫也會重新開機 Instance)。pending-reboot— 在下次重新開機時套用,無論是手動、Maintenance Window 觸發還是 Multi-AZ Failover。這是許多流程中 Static 參數的預設值。
陷阱是對於 Static 參數,immediate 觸發重新開機——這是停機時間。不了解這一點的 SysOps 工程師可能因為點擊 innodb_buffer_pool_size 的「Apply」而使生產環境停機。
預設與自訂 Parameter Group
RDS 為每個引擎版本提供預設 Parameter Group(唯讀)。你無法修改預設 Group——要自訂任何內容,你必須建立自訂 Parameter Group,修改它,然後將其關聯到你的 Instance。將新的 Parameter Group 與 Instance 關聯本身對許多參數來說也是一個 pending-reboot 的變更。
一位 SysOps 考生在自訂 Parameter Group 上設定 max_connections(在某些版本上是 Static),看到 Instance 狀態為 pending-reboot,然後就離開了,期待它在下次 Maintenance Window 期間套用。它確實會。但對於某些 Parameter Group 和某些 Multi-AZ 拓撲,Maintenance Window 並不總是重新開機 Instance——只有修補程式和版本升級才會。確定性的修復方法是透過 RebootDBInstance 明確地重新開機。SOA-C02 用「我們三天前變更了參數,但它還沒有生效」這樣的場景來測試——答案是重新開機 Instance,而不是等 Maintenance Window。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html
DB Cluster Parameter Group(Aurora)
Aurora 引入了第二種 Parameter Group 類型:DB Cluster Parameter Group,包含在 Cluster 層面套用的參數(跨 Cluster 中的所有 Instance)。Instance 層面的 Parameter Group 仍然存在,用於 Per-instance 參數。哪個層面的參數屬於哪裡是引擎特定的。
Maintenance Window:修補程式與待處理變更何時套用
每個 RDS Instance 都有一個 Maintenance Window——每週 30 分鐘(或更長)的時間槽,AWS 在此期間可能套用排程工作。
Maintenance Window 期間發生什麼
- 必要的 Minor Engine 修補程式 — AWS 標記為必要的安全修補程式和錯誤修復。
- OS 層面修補程式 — 用於底層 RDS 受管 Instance。
- 帶有
ApplyMethod=pending-reboot的待處理修改(有時——見上方的陷阱)。
此視窗不會觸發自動 Major 版本升級——這些需要透過 ModifyDBInstance 上的 MajorVersionUpgrade=true 明確選擇加入。
設定視窗
你可以設定視窗的星期幾和開始時間。如果你不指定,AWS 會自行選擇。對於 Multi-AZ Instance,AWS 先對 Standby 套用修補程式,然後 Failover 到現在已修補的 Standby,再修補原始 Primary——將停機時間最小化為一次 Failover(60–120 秒)。
必要與可選修補程式
對於嚴重安全修補程式,AWS 可能在你的視窗之外強制套用必要的修補程式。可選的修補程式等待視窗,只有在你設定 AutoMinorVersionUpgrade=true 時才套用。SysOps 工程師應查看 RDS 主控台中的 Recommended Actions 儀表板,了解有哪些待處理項目。
Multi-AZ Instance 在 Maintenance Window 修補期間會經歷短暫 Failover——通常 60–120 秒。將視窗排程在你的流量低谷(凌晨三點是全球應用程式的常見選擇,根據 Region 調整)。單一 AZ Instance 在修補期間會完全停機——有時 5–15 分鐘。SOA-C02 用「應用程式週日早上停機 10 分鐘」的場景來測試——答案是 Maintenance Window 加上單一 AZ 拓撲。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Maintenance.html
Performance Insights:慢查詢的 DB Load 分解
RDS Performance Insights 是一個受管效能儀表板,將資料庫負載分解為負責的 SQL 語句、Wait Event、Host 和 User。
核心 Metric:DB Load(Average Active Sessions)
標題 Metric 是 DB Load,以 Average Active Sessions (AAS) 衡量——每秒採樣一次,正在活躍執行或等待資源的 Session 的平均數量。DB Load 為 5 AAS 意味著平均有五個 Session 在任何給定時刻正在工作。
儀表板隨時間繪製 DB Load,顏色編碼按:
- Wait Event — 每個 Session 在等待什麼(CPU、I/O、鎖、log file sync、網路等)。
- SQL — 按負載貢獻排名的 Top SQL 語句。
- Host — 驅動負載的客戶端 IP/hostname。
- User — DB 使用者/角色。
DB Load 超過 vCPU 數量時
圖表上有一條水平線標記 Instance 類別的 vCPU 數量。當 DB Load 超過 vCPU 數量時,資料庫受 CPU 限制——Session 正在排隊等待 CPU。當 DB Load 很高但主要由 I/O 等待組成時,資料庫受 I/O 限制——切換到帶有 Provisioned IOPS 的 gp3 或 io2 Block Express 是典型的修復方法。
Performance Insights vs CloudWatch Metrics
CloudWatch 顯示聚合 Metrics——CPUUtilization、DatabaseConnections、ReadIOPS。Performance Insights 顯示這些 Metrics 的成因——哪個 SQL、哪個 Wait Event、哪個 User。兩者互補:透過 CloudWatch 發出 Alarm,透過 Performance Insights 深入找到根本原因。
保留期
- 免費層:最近 7 天的 Performance Insights 資料。
- 長期保留:最多 2 年(付費)。
場景模式:p99 查詢延遲突然飆升
典型的 SOA-C02 疑難排解場景:
- CloudWatch 發出 Alert:
WriteLatency的 Alarm 或自訂應用程式端 p99 Metric 觸發。 - 開啟 Performance Insights:在 RDS 主控台導航到 DB Instance 的 Performance Insights 分頁。
- 識別 DB Load 圖表上的峰值 — 通常是在 Latency Alarm 的同一時間,DB Load 急劇上升超過 vCPU 線。
- 將分解切換到「Top SQL」:識別在峰值期間貢獻最多負載的 SQL 語句。通常是一個流氓查詢(缺少 WHERE 子句、沒有索引的新儀表板查詢、引入 N+1 的部署)。
- 將分解切換到「Wait Events」:確認 SQL 在等待什麼。
cpu意味著查詢計算昂貴;io:DataFileRead意味著它在做全表掃描或缺少索引;Lock:transactionid意味著它被另一個交易阻塞。 - 補救:添加缺少的索引、終止有問題的 Session、回滾部署,或添加 Read Replica 以吸收負載。
在 SOA-C02 中,每個「資料庫突然變慢」的場景都應該走過這個流程。考試通常給你一個 CloudWatch Alarm 並詢問「下一步是什麼?」——答案是 Performance Insights,而不是泛泛的「調查」。具體來說:Top SQL 識別查詢,Wait Events 識別瓶頸類別。兩者結合讓你決定是添加索引、擴展 Instance、添加 Replica,還是回滾部署。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.html
Blue/Green Deployment:無停機的 Schema 變更
RDS Blue/Green Deployment 是一個受管功能,建立生產資料庫的同步化副本,讓你在 Green 副本上進行重大變更,並在準備好時以原子方式交換 Endpoint。
功能說明
你從 Blue 環境(你的生產資料庫)開始。RDS 啟動一個 Green 環境,它是從 Blue 接收 Streaming Replication 的邏輯副本。你可以在 Green 上:
- 升級引擎 Major 版本。
- 變更 Parameter Group。
- 套用在生產環境上會鎖定資料表的 Schema 變更。
- 端對端測試新設定。
準備好後,你觸發切換(Switchover)——RDS 以原子方式交換 DNS Endpoint,使應用程式現在在同一個 hostname 下打到 Green Instance。切換通常需要不到 1 分鐘,且現有連線會中斷(應用程式重新連接到新的 Green Primary)。
使用場景
- Major 版本升級 — 在 Green 上測試,透過短暫停機而非長時間升級視窗進行切換。
- Schema 遷移 — 在 Green 上執行
ALTER TABLE,不阻塞生產流量,然後切換。 - 需要重新開機的 Parameter Group 變更 — 在 Green 上套用,切換而不是重新開機 Blue。
- Instance 類別變更 — 在 Green 上佈建較大的 Instance 類別,然後切換。
限制
- Blue/Green 目前支援 RDS for MySQL、MariaDB 和 PostgreSQL,以及 Aurora MySQL 和 Aurora PostgreSQL。
- 複製使用原生引擎 binlog/WAL Streaming,因此需要在來源上啟用 binlog。
- 切換時會短暫中斷進行中的連線——應用程式必須重新連接。
- 切換期間的長時間執行交易可能失敗。
在 SOA-C02 中,當場景描述「我們需要將 RDS MySQL 從 5.7 升級到 8.0,並盡量降低生產影響」,答案是 Blue/Green Deployment。替代方案——就地 Major 版本升級、手動 Snapshot+Restore 或外部複製工具——都有更多停機時間或運維風險。Blue/Green 是帶有自動複製、測試和原子切換的 AWS 受管路徑。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/blue-green-deployments-overview.html
Point-in-Time Restore:運維復原工具
RDS 自動備份結合每日 Snapshot 和連續的交易 log 擷取,允許在保留視窗(1–35 天)內Point-in-Time Restore (PITR) 到任意秒。
PITR 的工作原理
當你啟用自動備份(BackupRetentionPeriod >= 1),RDS 會:
- 在 Backup Window 期間每日對儲存磁碟區進行 Snapshot。
- 持續將交易 log 傳送到 S3。
- 允許從
EarliestRestorableTime到LatestRestorableTime(通常是最近 5 分鐘)的任意秒進行還原。
PITR 建立新的 DB Instance——它不會覆寫原始 Instance。你無法「就地還原」。
常見使用場景
- 從邏輯損壞中復原 — 在 14:32 發生
DROP TABLE意外;PITR 到 14:31:55,將刪除的資料表複製回生產環境。 - 部署前的安全網 — 在高風險遷移前記錄時間戳記;如果出錯,PITR 到該時間戳記。
- 取證 — 在攻擊時間點還原資料庫副本,用於事件分析。
限制
- PITR 視窗受
BackupRetentionPeriod限制(自動備份 1–35 天;手動 Snapshot 無保留限制)。 - PITR 還原不是即時的——花費的時間與資料庫大小成正比(大型資料庫通常需要 30 分鐘到數小時)。
- 還原的 Instance 獲得新的 Endpoint——必須更新應用程式設定。
- 自動備份保留期:最少 1 天(維持 PITR 啟用的最低要求)到最多 35 天。
- 手動 Snapshot:無限期保留,直到你刪除。
- Aurora Cluster Snapshot 保留期:自動備份同樣 1–35 天;手動 Snapshot 在刪除前持續保留。
- PITR 粒度:保留視窗內的任意秒,最多到
LatestRestorableTime(通常是 5 分鐘前)。 - Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PIT.html
ElastiCache 用於快取:Redis vs Memcached,置於 RDS 之前
ElastiCache 是 AWS 受管的記憶體快取服務,支援兩種引擎:
- Redis — 功能豐富,支援複製、持久性、複雜資料類型(列表、集合、排序集合、Stream)、Pub/Sub、交易,以及具有自動 Failover 的 Multi-AZ。大多數現代應用程式的預設選擇。
- Memcached — 簡單、多執行緒、分片,無複製或持久性。功能較少,但對於簡單鍵值工作負載,每節點的原始吞吐量略高。
為什麼快取屬於這個主題
SOA-C02 綱要將快取與 RDS 韌性歸在 Task Statement 2.1 之下,因為快取是讀取密集工作負載不應只是一直增加 Read Replica 的運維答案。命中快取的請求永遠不會碰到資料庫——節省成本並為寫入流量釋放資料庫資源。
快取放置模式
- Cache-aside(延遲載入) — 應用程式先檢查快取;Cache miss 時,查詢 DB 並將結果存入快取。簡單,對快取故障有韌性。
- Write-through — 應用程式同時寫入快取和 DB。快取始終是新鮮的,但寫入較慢。
- Read Replica + 快取 — 結合 Aurora Reader Endpoint 與 ElastiCache;快取吸收熱鍵,Replica 處理 Cache miss。
Redis Multi-AZ 與自動 Failover
對於 HA,ElastiCache Redis 支援 Cluster 模式停用(一個分片,帶 Replica)和 Cluster 模式啟用(多個分片,每個帶 Replica)。兩者都可以在不同 AZ 中擁有 Replica,並在 Primary 故障時自動 Failover 到 Replica——行為類似於 RDS Multi-AZ。
在 SOA-C02 中,當場景描述「RDS 上的讀取負載導致 CPU 飽和;我們需要擴展」——添加 Read Replica 是一個答案,添加快取通常是更好的答案。熱讀工作負載的快取命中率 80–95% 意味著資料庫 CPU 大幅下降,無需佈建更多計算資源。考試通常同時提供兩個選項;當工作負載有一小組頻繁讀取的項目時,優先選擇快取。Reference: https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/WhatIs.html
鬆耦合架構:SQS 作為緩衝器
Task Statement 2.1 明確提到「實作鬆耦合架構」。在 SOA-C02 中,標準答案是 Amazon SQS 作為應用程式層之間的緩衝器。
為什麼 SQS 屬於韌性範疇
當下游元件(資料庫、外部 API、Worker 叢集)無法跟上上游負載時,同步耦合會向後傳播故障——上游元件在等待時耗盡記憶體,然後上游的上游也故障,依此類推。SQS 解耦各層:上游將訊息寫入佇列然後繼續;下游以自己的節奏拉取訊息。
常見模式
- Web 層 → SQS → Worker 層 → RDS — Web 層接受請求並排隊作業;Worker 以資料庫可持續的速率處理。
- 突發吸收 — 突然的流量峰值填充佇列,而不是使資料庫崩潰。
- 對暫時性故障的重試 — SQS 訊息可見性逾時 + Dead-letter Queue 優雅地處理暫時性下游故障。
運維特性
- Standard Queue:至少一次傳遞,盡力排序。
- FIFO Queue:在訊息群組內恰好一次處理,有序。
- Visibility Timeout:消費者讀取訊息後訊息不可見的時間;若消費者在刪除前崩潰,訊息重新出現。
- Dead-letter Queue:多次失敗的訊息移到這裡供檢查。
RDS 加密:建立後無法切換
這是一個關鍵的 SOA-C02 陷阱,符合這個主題的運維角度。
限制
RDS 靜態加密在 Instance 建立時設定,之後無法變更。 你無法:
- 就地加密現有的未加密 Instance。
- 就地解密現有的已加密 Instance。
- 將已加密 Instance 上的 KMS 金鑰更改為不同的金鑰。
解決方法
要加密現有的未加密資料庫:
- 對未加密的 Instance 進行手動 Snapshot。
- 將 Snapshot 複製到新 Snapshot,指定 KMS 金鑰——此副本已加密。
- 將已加密的 Snapshot 還原到新 Instance。
- 將流量切換到新 Instance(DNS 更新或 Blue/Green Deployment)。
更換 KMS 金鑰也適用相同的工作流程——用新金鑰複製 Snapshot,然後還原。這是 SOA-C02 出現頻率最高的陷阱之一,無法在此選項「修改 Instance 並啟用加密」的情況下答對的考生將失分。
這是 SOA-C02 出現頻率最高的陷阱之一。場景描述一位 SysOps 工程師需要加密現有生產資料庫,並詢問最簡單的路徑。錯誤答案是「修改 Instance 並啟用加密」——根本沒有這樣的選項。正確答案涉及帶有 KMS 加密的 Snapshot 複製 + 還原,可選擇封裝在 Blue/Green Deployment 中進行切換。更換 KMS 金鑰也適用同樣的陷阱——Snapshot-copy-restore 是唯一的路徑。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html
場景模式:讀取密集應用程式導致 Primary CPU 飆升
典型的 SOA-C02 疑難排解流程:
- CloudWatch Alarm 觸發:RDS Primary 的
CPUUtilization > 80%Alarm。 - 開啟 Performance Insights:DB Load 顯示 4 vCPU Instance 上持續 6 AAS——資料庫受 CPU 限制。
- Top SQL 揭示來自報表儀表板的幾個
SELECT查詢貢獻了 70% 的負載。 - 決策樹:
- 若工作負載是真正的讀取密集且查詢多樣 → 添加 Read Replica 並將報表路由到 Replica Endpoint。
- 若工作負載有一組熱門的重複查詢 → 添加 ElastiCache 並快取頻繁讀取的鍵。
- 若工作負載有一個特定的慢查詢 → 添加索引,改寫查詢。
- 若讀取均勻分佈且應用程式可以使用 Reader Endpoint → 遷移到 Aurora 並使用帶有 Auto Scaling Replica 的 Cluster Reader Endpoint。
- 實作:
- 使用相同或更大的 Instance 類別佈建 Read Replica。
- 更新應用程式碼或資料庫連線字串,將 SELECT 路由到 Replica。
- 在
ReplicaLag(> 60 秒)和 Replica 的CPUUtilization上設定 CloudWatch Alarm。
錯誤答案是「擴展 Primary 規格」——垂直擴展只是拖延問題,對於持續的讀取負載,水平擴展比垂直擴展成本更低。
場景模式:Aurora Failover 時間比預期更長
典型的 Aurora 疑難排解流程:
- 生產 Failover 花了 4 分鐘,而不是預期的 30 秒以內行為。
- 檢查 Cluster 拓撲:是否存在至少一個 Aurora Replica?若無,Aurora 必須從頭啟動新 Instance——這解釋了長 Failover。
- 檢查 Promotion Tier:是否晉升了正確的 Replica?若 Tier-0 Replica 不可用(早些時候失敗且尚未替換),Aurora 可能選擇了容量不足的 Tier-15 報表 Replica。
- 在 Failover 時檢查 Replica Lag(Aurora 有自己的 Metric:
AuroraReplicaLag,以毫秒為單位)。若 Replica 落後超過閾值(60 秒),Aurora 可能跳過它進行晉升。 - 檢查應用程式端的連線快取 — 對 Writer Endpoint 保留過時 DNS 的長期 JDBC 連線,在 JVM DNS 快取有效期間(預設為永久)會持續嘗試舊的(現為 Replica 的)Instance。應用程式端的修復是 JVM 安全策略中的
networkaddress.cache.ttl=10。
修復通常是:(a) 確保在不同 AZ 中至少有 2 個 Promotion Tier 0 的 Replica,(b) 在應用程式中設定短 DNS TTL,(c) 在 AuroraReplicaLag > 60s 上設定 CloudWatch Alarm。
常見陷阱:Cluster Endpoint vs Instance Endpoint 混淆
Cluster Endpoint 始終指向 Writer。Reader Endpoint 在 Replica 間進行負載平衡。Instance Endpoint 指向一個特定的 Instance,無論其角色。
一個常見的 SOA-C02 錯誤:應用程式使用原始 Writer 的 Instance Endpoint 進行連線。Failover 後,該 Instance 現在是 Replica——但由於應用程式使用 per-instance DNS 名稱,寫入仍然發送到那裡。結果:每次寫入都出現 read-only filesystem 錯誤。
修復方法是始終透過 Cluster Endpoint(寫入)和 Reader Endpoint(讀取)進行連線。Instance Endpoint 僅適用於真正需要精確指定某個 Instance 的診斷工具和遷移腳本。
在 SOA-C02 中,當場景描述「Aurora Failover 後,應用程式在 INSERT 時開始收到 read-only 錯誤」,根本原因是應用程式使用了現在已成為 Replica 的 Instance Endpoint。修復方法是連線字串設定:使用 Cluster Endpoint 進行寫入。這個陷阱也是 Blue/Green Deployment 和 Aurora Failover 指南強調「透過 Endpoint 而非 Instance 連線」的原因。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.Endpoints.html
SOA-C02 vs SAA-C03:運維視角
| 問題類型 | SAA-C03 視角 | SOA-C02 視角 |
|---|---|---|
| Multi-AZ vs Read Replica | 「哪個提供高可用性?」 | 「Failover 花了 8 分鐘——問題在哪?」 |
| Aurora vs RDS | 「哪個引擎支援最多 Replica 數量?」 | 「Aurora 晉升了錯誤的 Replica——修復 Promotion Tier 排序。」 |
| 參數變更 | 「自訂 Parameter Group。」 | 「我們 3 天前變更了 max_connections,但還沒套用——為什麼?」 |
| Maintenance Window | 「在離峰時間排程修補。」 | 「應用程式週日停機 10 分鐘——單一 AZ + Maintenance Window。」 |
| RDS Proxy | 「使用 Proxy 進行連線池。」 | 「Lambda 導致 too many connections 錯誤——使用 Secrets Manager 身份驗證設定 RDS Proxy。」 |
| 效能調整 | 「使用 Performance Insights。」 | 「p99 延遲飆升——Performance Insights → Top SQL → Wait Events → 在 orders.customer_id 上添加索引。」 |
| 加密 | 「使用 KMS 靜態加密。」 | 「生產 DB 未加密,必須加密——Snapshot-copy-restore 是唯一路徑。」 |
| Blue/Green | 「安全部署升級。」 | 「以最小停機時間進行 Major 版本升級——Blue/Green Deployment,驗證 Green,切換。」 |
| Read Replica | 「水平擴展讀取。」 | 「Replica Lag 正在增長——Replica Instance 類別小於 Primary,切換到帶有 Provisioned IOPS 的 gp3。」 |
| 跨 Region DR | 「使用跨 Region Replica。」 | 「晉升跨 Region Replica——晉升後應用程式必須更新連線字串。」 |
SAA 考生選擇拓撲;SOA 考生運維它、疑難排解它,並從運維故障中復原。
考試訊號:如何辨識 RDS-Aurora 上的 Domain 2.1/2.2 題目
- 「Failover 時間比預期更長」 — 答案涉及 Promotion Tier、Replica 存在性、Replica Lag 或應用程式端 DNS 快取。
- 「讀取流量壓垮了 Primary」 — 答案涉及 Read Replica、Aurora Reader Endpoint 或 ElastiCache。
- 「Multi-AZ Standby 閒置,我們可以用它讀取嗎?」 — 傳統 Multi-AZ:不行;Multi-AZ DB Cluster:可以;Aurora:可以(Replica 服務讀取)。
- 「參數變更還沒生效」 — 答案涉及 Static vs Dynamic Apply Method,加上重新開機。
- 「Lambda 遇到
too many connections」 — 帶有 Secrets Manager 的 RDS Proxy。 - 「以最小停機時間進行 Major 版本升級」 — Blue/Green Deployment。
- 「資料庫查詢突然變慢」 — Performance Insights → Top SQL → Wait Events。
- 「加密現有的未加密資料庫」 — 帶有 KMS 的 Snapshot 複製,還原為新 Instance。
- 「從昨天誤刪的 DROP TABLE 還原」 — PITR 到刪除前一分鐘,還原到新 Instance。
- 「Failover 後,應用程式在寫入時收到 read-only 錯誤」 — 應用程式使用 Instance Endpoint 而非 Cluster Endpoint。
- 「Replica Lag 正在增長」 — 檢查 Replica Instance 類別、儲存類型和複製拓撲。
Domain 2 佔 16%。Task Statement 2.1 和 2.2 合起來佔其中的大部分,RDS/Aurora 韌性是與 Auto Scaling/ELB 並列測試最重的主題。預期在這個範疇內有 5 到 8 道題——如果考試偏向資料層場景,有時更多。精通 Cluster Endpoint 陷阱、Parameter Apply Method 陷阱和 Multi-AZ vs Replica 的區別,光靠這三點就能贏得 3 到 4 分。Reference: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html
決策矩陣 — 各 SysOps 目標的 RDS/Aurora 選擇
| 運維目標 | 主要選擇 | 備註 |
|---|---|---|
| 無讀取卸載的同步 Standby HA | 傳統 Multi-AZ | 所有 RDS 引擎;Failover 60–120 秒。 |
| HA + 可讀 Standby,MySQL 或 PostgreSQL | Multi-AZ DB Cluster | Failover < 35 秒;三節點,三個 AZ。 |
| HA + 15 個可讀 Replica + 30 秒以內 Failover | Aurora Cluster | 僅 MySQL/PostgreSQL 相容。 |
| 僅讀取擴展,非 HA | RDS Read Replica | 最多 15 個;僅手動晉升。 |
| 跨 Region DR | 跨 Region Read Replica | 故障時晉升;手動切換。 |
| Lambda 的連線風暴 | RDS Proxy | 池化連線;Failover 時透明。 |
| 以最小停機時間進行 Major 版本升級 | Blue/Green Deployment | 在 Green 上測試,原子切換。 |
| 從邏輯損壞中復原 | Point-in-Time Restore | 還原到新 Instance;最多 35 天保留期。 |
| 加密現有的未加密資料庫 | 帶 KMS 的 Snapshot 複製,還原為新 Instance | 無法就地加密。 |
| 快取熱門讀取 | ElastiCache(Redis) | Cache-aside 模式;降低 DB 負載。 |
| 解耦寫入峰值 | 各層之間的 SQS Queue | 緩衝器以保護資料庫。 |
| 識別慢查詢 | Performance Insights → Top SQL | 加上 Wait Events 以識別瓶頸類別。 |
| 對 Replica Lag 設 Alarm | CloudWatch 上的 ReplicaLag(RDS)或 AuroraReplicaLag(Aurora) |
閾值通常為 60–300 秒。 |
| Aurora 中的自動 Failover 順序 | Promotion Tier(0–15) | 數字越低 = 優先順序越高。 |
| 套用參數變更而不重新開機 | Dynamic 參數,apply_method=immediate |
Static 參數需要重新開機。 |
| 排程修補 | Maintenance Window | 每週 30 分鐘時間槽;修補期間 Multi-AZ Failover。 |
常見陷阱回顧 — RDS 與 Aurora 韌性
陷阱 1:Multi-AZ Standby 提供讀取服務
它不提供(傳統 Multi-AZ)。Multi-AZ DB Cluster Standby 可以;Aurora Replica 可以;傳統 Multi-AZ Standby 是不可見的。
陷阱 2:Read Replica 自動 Failover
它們不會。Read Replica 是非同步的;晉升必須透過 PromoteReadReplica 手動進行。HA 使用 Multi-AZ 或 Aurora。
陷阱 3:Cluster Endpoint vs Instance Endpoint
Failover 後,Cluster Endpoint 跟隨新 Writer。使用 per-instance Endpoint 的應用程式會持續打到現在已成為 Replica 的 Instance,並在寫入時收到 read-only 錯誤。
陷阱 4:Parameter Apply Method 混淆
Dynamic 參數立即生效。Static 參數需要重新開機——pending-reboot 不會可靠地按排程自動套用;重新開機以確保生效。
陷阱 5:RDS 加密是可變更的
它不是。加密在建立時設定,無法切換。解決方法是 Snapshot-copy-restore。
陷阱 6:PITR 覆寫原始 Instance
它不會。PITR 建立新 Instance;你必須重新導向流量。
陷阱 7:Maintenance Window 不會造成停機
對於單一 AZ(完整重啟)和 Multi-AZ(短暫 Failover)都會。
陷阱 8:Aurora Failover 始終在 30 秒以內
只有當至少一個 Aurora Replica 存在時。若無 Replica,Aurora 啟動新 Instance——Failover 可能需要數分鐘。
陷阱 9:增加更多 Replica 會自動平衡現有連線
基於 DNS 的負載平衡只影響新連線。長期 JDBC 連線保持在目前的 Replica 上,直到被回收。使用 RDS Proxy 或連線池 max-lifetime 來強制重新平衡。
陷阱 10:RDS Proxy 是免費或低成本的
它按底層資料庫的 vCPU 計費。對於小型資料庫,費用可能超過資料庫本身。在 Failover 透明性或連線池化收益足以證明成本合理的地方使用它。
FAQ — RDS 與 Aurora 韌性
Q1:Multi-AZ 與 Multi-AZ DB Cluster 的差異是什麼?
傳統 Multi-AZ 是兩個 Instance 的拓撲:一個 Primary 服務所有流量,另一個在不同 AZ 的同步 Standby 不服務流量,對應用程式不可見。Failover 需要 60–120 秒。適用於所有 RDS 引擎。
Multi-AZ DB Cluster 是三個 Instance 的拓撲:一個 Writer 加上跨三個 AZ 的兩個可讀 Standby,使用半同步複製。Failover 在 35 秒以內。Standby 透過 Reader Endpoint 服務讀取流量。截至 2026 年,僅適用於 MySQL 和 PostgreSQL。
這個區別在 SOA-C02 上很重要,因為考試頻繁使用「Multi-AZ」作為簡稱,你必須閱讀修飾語。「Multi-AZ deployment」或「Multi-AZ standby」通常指傳統;「Multi-AZ DB Cluster」特指三節點變體。
Q2:為什麼 Read Replica 不是高可用性機制?
Read Replica 使用非同步複製——它們落後 Primary 幾秒或幾分鐘。Primary 故障時,RDS 不會自動晉升 Read Replica。由於複製 Lag,Replica 甚至可能遺失已提交的交易。要將 Read Replica 用於 HA,你需要:
- 手動呼叫
PromoteReadReplica。 - 將應用程式連線字串更新到 Replica 的 Endpoint。
- 接受等於故障時刻複製 Lag 的潛在資料遺失。
這是一個手動災難復原程序,RTO 為 5–15 分鐘,RPO 非零。對於自動、2 分鐘以內 Failover 且零資料遺失,你需要 Multi-AZ(傳統)、Multi-AZ DB Cluster 或 Aurora。SOA-C02 反覆測試這個精確的區別。
Q3:如何在 MySQL 工作負載中選擇 Aurora 與 RDS Multi-AZ DB Cluster?
兩者都在三個 AZ 上提供具有可讀 Standby 的 HA。決策因素:
- 成本 — Aurora 每個 Instance 小時通常更貴;Multi-AZ DB Cluster 使用一般 MySQL 定價。
- Failover 時間 — Aurora 通常在 30 秒以內;Multi-AZ DB Cluster 在 35 秒以內。相近。
- Read Replica 數量 — Aurora 支援 15 個;Multi-AZ DB Cluster 有 2 個可讀 Standby。
- 儲存擴展 — Aurora 以 10 GiB 為單位自動無縫增長至 128 TiB;Multi-AZ DB Cluster 使用常規 RDS 儲存並需要手動擴展。
- 引擎相容性 — Aurora 與 MySQL/PostgreSQL 相容,但並非 100% 相同(某些 MySQL 功能行為不同)。Multi-AZ DB Cluster 是原生 MySQL 或 PostgreSQL。
- 災難復原 — Aurora 支援 Global Database 以實現次秒跨 Region 複製;Multi-AZ DB Cluster 依靠跨 Region Read Replica。
對於在 AWS 上需要強 HA + 讀取擴展的大多數新工作負載,Aurora 是首選。SOA-C02 在「最高可用性和最多 Replica」場景中偏好 Aurora,但在「MySQL 相容 HA 而不引入引擎差異」場景中測試 Multi-AZ DB Cluster。
Q4:如何為 Lambda 密集工作負載設定 RDS Proxy?
標準設定:
- 在 Secrets Manager 中儲存 DB 憑證,啟用自動輪換(典型 30 天輪換)。
- 在與資料庫相同的 VPC 中,在至少兩個 AZ 的子網路中建立 RDS Proxy。
- 如果你希望 Lambda 函數透過 IAM 進行身份驗證(Lambda 程式碼中無 DB 憑證),附加 IAM 身份驗證到 Proxy。
- 設定連線池大小 — 通常是小型 DB 的
max_connections的 100%,大型多租戶 DB 則更低。 - 為 Aurora 分別設定讀寫 Endpoint — Proxy 支援路由到 Replica 的獨立唯讀 Endpoint。
- 更新 Lambda 函數以連接到 Proxy Endpoint 而非 DB Endpoint。
- 監控
DatabaseConnectionsCurrentlySessionPinned— 高 Pinning 率削弱多工好處;調查保持連線的 Session 層級操作。
Q5:RDS Multi-AZ Failover 如何影響應用程式連線?
Multi-AZ Failover 期間:
- Primary 的 DB Endpoint 在 Failover 期間(60–120 秒)不可達。
- RDS 更新 DNS CNAME 以指向新 Primary(原 Standby)。
- 目前開啟的應用程式連線被中斷——沒有透明的連線遷移。
- 切換期間的新連線嘗試可能失敗,直到 DNS 傳播。
- 一旦 DNS 解析到新 Primary,應用程式就可以成功重新連線。
應用程式必須:
- 實作帶有指數退避的重試邏輯來處理連線錯誤。
- 在連線層設定短 DNS TTL(JVM
networkaddress.cache.ttl=10是標準例子;JVM 預設是「永久快取」,這會破壞 Failover)。 - 使用帶有健康檢查的連線池,回收壞連線。
- 選擇性使用 RDS Proxy,讓 Proxy 代表應用程式吸收 Failover 並透明地重新連接。
Q6:我可以為現有的 RDS 資料庫添加加密嗎?
不能就地添加。RDS 靜態加密在 Instance 建立時設定,之後不可更改。要加密現有的未加密資料庫:
- 對未加密的 Instance 進行手動 Snapshot。
- 使用帶有 KMS 金鑰的
CopyDBSnapshot——副本已加密。 - 透過
RestoreDBInstanceFromDBSnapshot從加密 Snapshot 還原到新 DB Instance。 - 將流量切換到新 Instance——通常透過 Blue/Green Deployment、DNS 交換或計畫性停機。
更換已加密資料庫上的 KMS 金鑰也適用相同的工作流程——用新金鑰複製 Snapshot,然後還原。這是 SOA-C02 出現頻率最高的陷阱之一;回答「修改 Instance 並切換加密」的考生將失分。
Q7:參數變更的 apply immediately 與 pending reboot 有什麼差異?
對於 Dynamic 參數,apply immediately 在功能上是即時的——新值在幾秒內生效。
對於 Static 參數,apply immediately 觸發立即的資料庫重新開機。這是停機時間——API 呼叫實際上同時執行參數變更和重新開機。如果你為 Static 參數選擇 pending reboot,變更將被排隊,並在下次重新開機時套用(手動、Maintenance Window 或 Multi-AZ Failover)。
SOA-C02 上的陷阱:在生產環境中對 Static 參數選擇 apply immediately,卻沒有意識到它會觸發重新開機。考試用「SysOps 工程師變更了 innodb_buffer_pool_size,資料庫停機了」這樣的場景來測試——原因是 apply immediately 重新開機了單一 AZ Instance。
Q8:Aurora Failover 與 RDS Multi-AZ Failover 有何不同?
三個運維差異:
- 速度 — Aurora 通常在 30 秒以內(當 Replica 存在時);傳統 Multi-AZ 60–120 秒。
- Replica 參與 — Aurora 晉升現有 Replica;傳統 Multi-AZ 晉升不可見的 Standby。若無 Aurora Replica,Aurora 必須啟動新 Instance,Failover 需要數分鐘。
- 儲存 — Aurora Replica 共用 Writer 的儲存(Failover 時無資料移動);Multi-AZ Standby 有自己一直在接收同步寫入的 EBS 磁碟區。
Aurora 的 Failover 速度優勢依賴於至少一個健康的 Aurora Replica 的存在。SOA-C02 最佳實踐是至少 2 個 Replica 在至少 2 個 AZ,且 Promotion Tier 設定正確。
Q9:RDS 或 Aurora 部署的關鍵 CloudWatch Metrics 要對哪些設 Alarm?
| Metric | 告訴你什麼 | 典型 Alarm |
|---|---|---|
CPUUtilization |
計算飽和 | > 80% 持續 5 分鐘 |
DatabaseConnections |
連線池耗盡即將發生 | > max_connections 的 80% |
FreeableMemory |
Buffer Pool 壓力 | < 100 MB 持續 5 分鐘 |
FreeStorageSpace |
磁碟即將填滿(RDS) | 剩餘 < 10% |
ReadLatency / WriteLatency |
I/O 效能問題 | > 引擎特定 p99 |
ReplicaLag(RDS) |
Read Replica 落後 | 持續 > 60 秒 |
AuroraReplicaLag(Aurora) |
Aurora Replica 落後 Writer | 持續 > 30 毫秒(典型 Aurora 是個位數毫秒) |
DatabaseConnectionsCurrentlySessionPinned(RDS Proxy) |
Pinning 削弱連線池好處 | > 50% 被 Pinned |
DBLoad(Performance Insights) |
Active Session 壓力 | 持續 > vCPU 數量 |
Alarm 應該驅動 SNS 通知,以及在適當的情況下,觸發補救執行手冊的 EventBridge 規則(Aurora Replica Auto Scaling、Replica 晉升、連線池刷新)。
Q10:RDS Blue/Green Deployment 與手動 Snapshot-Restore 遷移相比如何?
RDS Blue/Green 是一個受管功能,處理整個雙環境生命週期:
- AWS 佈建 Green 環境。
- AWS 自動設定從 Blue 到 Green 的 binlog 複製。
- AWS 持續保持 Green 同步。
- 你在 Green 上進行變更(引擎升級、Schema 變更、參數變更、Instance 類別變更)。
- 你觸發原子切換——DNS Endpoint 交換,應用程式重新連接,停機時間通常在一分鐘以內。
手動 Snapshot-Restore 是傳統路徑:
- 對來源進行 Snapshot。
- 將 Snapshot 還原到新 Instance。
- 套用變更。
- 透過外部複製工具手動重新同步,或接受凍結期。
- 手動進行 DNS 更新切換。
Blue/Green 是 SOA 認可的 Major 版本升級、破壞性 Schema 遷移和需要重新開機的參數變更路徑。SOA-C02 在任何「在版本升級期間最小化停機時間」場景中都偏好 Blue/Green。對於跨 Region 或跨帳號的一次性遷移(Blue/Green 不適用的情況),Snapshot-restore 仍然適用。
延伸閱讀與相關運維模式
- Amazon RDS User Guide
- Multi-AZ Deployments for High Availability
- Multi-AZ DB Cluster Deployments
- Working with RDS Read Replicas
- Working with DB Parameter Groups
- Maintaining a DB Instance
- Restoring a DB Instance to a Specified Time
- RDS Blue/Green Deployments Overview
- Using Amazon RDS Proxy
- Monitoring DB Load with Performance Insights
- Amazon Aurora Overview
- Amazon Aurora Endpoints
- Aurora High Availability and Replication
- Backing Up and Restoring an Aurora DB Cluster
- Amazon ElastiCache for Redis User Guide
- AWS SOA-C02 Exam Guide v2.3 (PDF)
資料層具備韌性後,下一層運維重點是:EC2 Auto Scaling、ELB 與 Multi-AZ 高可用——對應到與這些資料庫對話的運算層(Domain 2 的天然姊妹主題);備份、還原與災難復原程序——執行自動與手動備份的復原面;EBS、RDS、EC2、S3 的效能優化——更深層的 Performance Insights 調校模式與保持資料庫快速的 EBS volume 修改;以及 CloudWatch Metrics、Alarms 與 Dashboards——監督本指南所提及每個 metric 的監控基底。