iT邦幫忙

2026 iThome 鐵人賽

DAY 28
0
IT Operation

AWS 架構為什麼這樣選?30 天拆解服務選型與設計取捨系列 第 28 篇

Day 28|既有系統搬上 AWS,保留原架構還是同步改造?

  • 分享至 

  • xImage
  •  

前面幾篇討論了部署、監控與安全管理,現在換個角度:如果系統已經在公司的機房運作,並準備搬上 AWS,應該保留原本的架構,還是趁這次機會一起調整?

例如網站原本跑在虛擬機上,資料庫也是自行管理的 PostgreSQL,那可以先移到 EC2,也可以把資料庫改成 RDS,甚至將應用程式容器化。

每多改一項,就多一項需要驗證的差異,搬遷前要先確認:哪些改變能解決目前的問題,而且團隊有能力在期限內完成驗證?


三種搬法,差別在改動範圍

AWS 的搬遷策略常以 7 Rs 分類,這篇聚焦在保留既有系統時,常見的三種選擇:

補充:AWS 搬遷策略的 7 Rs

  • Rehost(直接搬遷):保留應用程式架構,將既有主機搬到雲端,例如移至 EC2。
  • Replatform(平台調整):保留核心架構,調整部分平台元件,例如將自管資料庫改成 RDS。
  • Refactor/Re-architect(重構/重新設計):修改應用程式或架構,以改善擴展能力、效能或維護方式。
  • Relocate(整體移轉):沿用既有的平台或虛擬化環境,將工作負載整體移至相容的環境。
  • Repurchase(重新採購):改用其他產品取代原系統,例如從自建軟體改用 SaaS。
  • Retain(保留):暫時維持原環境,等需求、限制或搬遷條件改變後再評估。
  • Retire(停用):將已不再需要的應用程式或資源下線。
策略 主要改動範圍 核心判斷 驗證重點
Rehost(直接搬遷) 基礎設施,例如虛擬機移到 EC2 現有應用能否在 AWS 維持運作? 作業系統、網路、授權與相依服務
Replatform(平台調整) 部分平台元件,例如 PostgreSQL 改用 RDS 換用受管服務,是否有明確的維運效益? 功能相容性、權限差異與資料搬遷
Refactor/Re-architect(重構/重新設計架構) 應用程式與架構,例如拆分服務 現有架構是否已無法滿足需求? 程式改動、整合測試與新架構的維運能力

三種策略可以用在同一套系統的不同部分,例如應用程式先移到 EC2,資料庫改用 RDS。

單體應用如果仍符合效能與開發需求,就沒有必要因為上雲而拆成微服務,Rehost 也不一定低風險:依賴固定 IP、本機檔案或特殊硬體的系統,仍可能需要調整。


哪些問題值得在搬遷時一起解決?

可以先從三個方向判斷:

判斷方向 要確認的事情
改造效益 能否改善目前的故障、維運負擔或交付問題?
驗證成本 需要修改多少程式?是否有測試與熟悉工具的人員?
延後成本 先搬再改,是否會再做一次資料搬遷、停機或環境建置?

例如資料庫備份一直依賴人工操作,搬遷時導入 RDS 就有明確效益,但如果必要的擴充套件不受支援,或需要大幅修改資料庫操作,這次改造可能超出時程。

容器化也是,如果團隊已有容器部署流程,應用程式能順利打包並通過測試,就可以一起評估,但若還要同時學習平台、修改檔案儲存方式與重建部署流程,改動範圍就大得多。


搬遷前,先確認哪些元件適合一起搬

搬遷前,除了確認有哪些主機,也要查清楚應用程式平常會用到哪些服務,例如訂單網站除了連接資料庫,可能還會呼叫庫存 API、讀取共享資料夾,或透過排程執行每日工作,這些連線與工作都要在搬遷後繼續正常運作。

假設網站已搬到 AWS,資料庫卻還留在公司機房,每次查詢就需要跨環境連線,如果網站頻繁讀寫資料庫,回應時間有可能變得更長,因此應用程式與資料庫可以先完成各自的搬遷準備,再安排一起切換,減少長時間分開運作的影響。

另外也要確認共享資料夾的路徑是否需要修改、排程要在哪裡執行,以及合作廠商是否只允許原本的 IP 連入,若搬遷後對外連線的 IP 改變,就需要提前請對方更新白名單。

搬遷期間的機房與 AWS 也需要穩定的連線,可以使用 Site-to-Site VPN 或既有的 Direct Connect,如果頻寬不足或連線經常中斷,資料同步就可能跟不上,影響預定的切換時間。


本案例:應用程式先搬,資料庫做有限度調整

以下是一個假設情境:

  • 公司必須在三個月內結束機房租約。
  • 訂單網站是執行在虛擬機上的 Java 應用程式,目前功能與效能符合需求。
  • PostgreSQL 由團隊自行管理,備份檢查與維護需要較多人工作業。
  • 團隊熟悉虛擬機維運,但尚未建立容器部署流程。
  • 正式切換最多可暫停下單 30 分鐘,不能遺失已確認的訂單。

本案例採用以下方向:

元件 選擇 判斷理由
Java 應用程式 先移到 EC2 現有架構仍符合需求,保留執行方式可縮小驗證範圍
PostgreSQL 優先評估 RDS for PostgreSQL 改善現有備份與維運流程,也避免日後再搬一次資料庫
容器化與服務拆分 延後 目前沒有足以要求同步改造的問題,團隊也需要準備時間

這次考慮將 PostgreSQL 改用 RDS,是希望減少人工備份與主機維護工作,但搬遷前要先確認原本使用的版本、擴充套件,以及管理資料庫的方式,在 RDS 上是否仍能正常運作。

不過 如果改用 RDS 需要大幅修改程式或維運工具,來不及在三個月內完成測試,就先將 PostgreSQL 搬到 EC2,繼續自行管理 ,同時要改善原本不足的備份流程,並實際測試資料能否還原。

因此本案例優先評估調整資料庫,Java 應用程式目前運作正常,則先保留原有架構,避免增加這次搬遷的改動範圍。


30 分鐘停機,資料要怎麼搬?

如果停止下單後,才開始匯出、傳輸與還原整個資料庫,30 分鐘可能不夠,因此可以在舊系統繼續服務時,先把既有資料搬到 AWS,再持續同步搬遷期間新增或修改的資料。

AWS Database Migration Service(AWS DMS,資料庫遷移服務) 可以透過「完整載入+CDC」完成這件事:

https://ithelp.ithome.com.tw/upload/images/20261012/20183052clnvswYtiu.png
圖:AWS DMS 先搬移既有資料,再持續同步來源資料庫的變更,讓大部分資料搬遷工作在正式切換前完成。

如圖所示,資料搬遷分成兩個部分:

  • 完整載入(Full Load):先將選定資料表中的既有資料複製到目標資料庫。
  • CDC(Change Data Capture,變更資料擷取):持續擷取來源資料庫的新增、修改與刪除,再將這些變更套用到目標資料庫。

例如,既有訂單搬到 AWS 後,舊網站仍會收到新訂單,也可能有人取消訂單,CDC 會持續同步這些變更,讓目標資料庫跟上來源的資料。

等到正式切換時,再暫停舊系統寫入,等待最後的變更同步完成,就能減少停機期間需要搬移的資料量。

不過 DMS 把訂單資料搬過去後,還需要確認三件事:

  • 後續修改能不能同步?
    例如訂單 1001 的狀態從「待付款」改成「已付款」,DMS 必須能讀到這次變更,並找到目標資料庫中的同一筆訂單,因此來源 PostgreSQL 要先開啟對應的複寫功能、授予 DMS 必要權限,資料表也要能明確識別每筆資料,例如使用不重複的訂單 ID 作為主鍵等等。

  • 應用程式能不能使用新資料庫?
    訂單資料已經出現在新資料庫,不代表原本的登入帳號與權限也都準備好了,例如訂單 API 使用的帳號,是否能登入、查詢及新增訂單,都需要另外確認,另外原本用來加快查詢的索引,也要確認是否已建立。

  • 下一張訂單會拿到什麼編號?
    假設搬過去的訂單已經有編號 1~1000,新資料庫卻仍從 1 開始發號,就可能因為編號重複而無法建立訂單。PostgreSQL 的 Sequence(序列) 可以想成自動發號器,而 DMS 持續同步資料時,不會自動同步這個發號器的位置,因此完成最後同步並停止複寫後,要確認並調整它的下一個編號,避免與既有訂單重複,再開放新訂單寫入。

來源與目標都是 PostgreSQL 時,也可以評估 PostgreSQL 原生的邏輯複寫,依版本支援與團隊熟悉程度選擇工具。

CDC 能縮短最後同步所需的時間,但能否在 30 分鐘內完成切換,仍需要實際演練 ,資料核對、應用程式切換,以及失敗時恢復舊服務所需的時間,都要一起算進去。


切換前要有驗收條件,切換後要有回復方案

Cutover(正式切換) 的核心流程,是暫停舊環境寫入、完成最後同步、確認新環境狀態,再開放正式流量。

建立訂單、修改訂單,以及付款、物流等功能,應先在獨立的測試環境演練,正式切換時先暫停舊系統的所有資料寫入,包括下單、排程與付款通知等造成的更新,確認最後的變更已同步完成並停止複寫後,再依下表判斷是否可以開放新系統:

檢查項目 放行條件
資料同步:資料有沒有搬齊? 最後的變更已同步完成,沒有未處理的同步錯誤,並停止本次複寫
資料核對:新訂單編號會不會重複? 訂單筆數與關鍵交易內容符合預期, 已確認並調整 Sequence,下一個編號不會與既有訂單重複
功能驗證:新系統能不能讀取資料? 程式正常啟動、能連上資料庫,也能正確查詢訂單
剩餘時間 尚有足夠時間完成切換,若中止也能在停機窗口內恢復舊服務

中止時間要從 30 分鐘往回推,預留恢復舊服務所需的時間,不能等到第 30 分鐘才開始決定。

開放新系統後,再使用事先安排的測試帳號確認建立與更新訂單是否正常,持續觀察錯誤與回應時間。

如果這時發現問題,回復方式也以「是否已產生新的正式資料」為分界:

  • 尚未開放新環境正式寫入:舊資料庫仍保有完整的正式資料,可以依演練流程恢復舊系統。
  • 新環境已接收正式訂單:例如 AWS 上新增了訂單 1001,舊資料庫卻只有到 1000,直接切回就會漏掉這張訂單,因此必須先依事前測試過的方法,把新增或修改的資料補回舊資料庫;若無法可靠地補回,就需要評估留在新系統修復。

如果透過 DNS 修改網站入口,部分使用者可能暫時仍連到舊位置,因此切換後也要確保舊系統不再接受訂單或更新資料,避免新舊資料庫各自收到不同的交易。


搬遷時,如何決定改動範圍?

本案例的 Java 應用程式目前運作正常,因此先保留原有架構,搬到 EC2,而資料庫則因為人工備份與主機維護帶來負擔,優先評估改用 RDS,確認相容性測試與切換演練都通過後,再正式搬遷。

如果條件不同,選擇也會改變,例如應用程式已經難以應付流量成長,團隊又有成熟的容器部署與測試流程,就可以評估在這次搬遷時一起容器化,反過來,如果來不及確認資料庫能否在 RDS 正常運作,就先搬到 EC2,繼續自行管理。

值得一起做的改造,應有明確效益、可控制的改動範圍,以及期限內能完成的驗證 ,其餘工作再安排後續階段,讓搬遷與改善都有清楚的完成條件。


下一篇

這篇討論了哪些元件值得在搬遷時一起調整,以及資料同步與切換風險如何影響選擇。

下一篇會透過 AWS DMS 實作,示範 PostgreSQL 的完整載入與 CDC(變更資料擷取),觀察既有資料如何搬到目標資料庫,以及來源端後續的新增、修改與刪除如何持續同步。

參考資料


上一篇
Day 27|權限設好了,機密與安全事件怎麼管理?
下一篇
Day 29|AWS DMS 實作:搬移 PostgreSQL 資料,並持續同步後續變更
系列文
AWS 架構為什麼這樣選?30 天拆解服務選型與設計取捨 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言