本文是跨 vendor migration playbook、cross-link 到 AWS ElastiCache(source)跟 Redis / Valkey(target)。跑 6 維 diff dimension audit 後判定為 Type C operational redesign hybrid:engine 層相容(Low)但 operational model 差異大(IAM auth → password/ACL、CloudWatch → 自管監控、auto failover → Sentinel/自建 HA)。

為什麼從 managed 遷出

ElastiCache 遷出的 driver 通常不是 engine 層問題 — 它跑的就是 Redis 或 Valkey。常見遷出原因:

  • 成本:managed premium 在大規模(數百 GB、多叢集)下比自管 + 運維人力更貴,尤其跨帳戶大量叢集時
  • 跨雲或混合雲:業務需要在 GCP、Azure 或 on-prem 同時運行 cache 層,ElastiCache 只在 AWS
  • 功能限制:ElastiCache 不支援所有 Redis module(RediSearch、RedisJSON 等),或 Valkey 8.x 新功能 ElastiCache 尚未上線
  • 控制權:自管可以自訂 redis.conf、自選 kernel 參數、自決 upgrade 時機

資料搬遷用 RDB export + import 就完成,真正的工程量在 operational model 重建 — ElastiCache 幫你管的 HA、monitoring、backup、security,遷出後全要自建。

6 維 diff dimension audit

維度評估等級
Schema / API同 Redis/Valkey engine、RESP 相容Low
Operational modelIAM auth → ACL/password、CloudWatch → 自管監控、auto failover → Sentinel 或手動High
Abstraction / paradigm相同(key-value cache)Low
Number of componentsElastiCache 1 → Redis/Valkey + Sentinel/HA + 監控 + backup 多元件Medium
Application changeendpoint 換、認證方式換、少量 client config 修改Low-Medium
Data topologyRDB 相容、cluster mode 對應 Redis ClusterLow

Operational model 是 High — 這是 Type C 的判定依據。遷移重心在重建 ElastiCache 幫你做的那些事。

階段一:盤點 ElastiCache 依賴

在動手之前,先列出 ElastiCache 幫你管的所有東西,每一項都要在自管環境重建或決定不要。

認證與網路

  • IAM auth:ElastiCache 支援 IAM auth token(短效 token),自管 Redis 改用 requirepass 或 Redis 6+ ACL
  • VPC / Security Group:自管 Redis 仍需 VPC 隔離,但 security group 規則要自己維護
  • TLS:ElastiCache 原生 in-transit encryption,自管要自己配 redis TLS 憑證

高可用

  • Auto failover:ElastiCache 自動偵測 primary failure 並 promote replica。自管用 Sentinel HA failover 或 Redis Cluster 內建 failover
  • Cross-AZ replication:ElastiCache 自動跨 AZ。自管要自己在不同 AZ 部署 replica

監控與備份

  • CloudWatch metrics:ElastiCache 自動發 CurrConnectionsCacheHitRateReplicationLag 等。自管用 INFO 指令 + Prometheus redis_exporter
  • Snapshot:ElastiCache 自動 daily snapshot + 手動 snapshot。自管用 BGSAVE + cron + 外部 storage

跨 region replication

  • Global Datastore:ElastiCache 支援跨 region active-passive replication。自管 Redis 沒有原生跨 region replication — 若目前使用 Global Datastore,遷出前需要決定是用 application-level replication、第三方工具(Redis Enterprise Active-Active)還是放棄跨 region cache 同步

升級與維護

  • Engine 升級:ElastiCache 在維護窗口自動或手動升級。自管要自己做 rolling upgrade
  • Patch:安全 patch 由 AWS 負責。自管要自己追蹤 CVE

階段二:建立自管環境

部署架構

最小 production 架構:1 primary + 1 replica + 3 Sentinel(或 Redis Cluster 3 primary + 3 replica)。

1# Docker Compose 驗證用(production 用 VM 或 K8s)
2# Primary
3docker run -d --name redis-primary -p 6379:6379 redis:7 \
4  redis-server --requirepass "$REDIS_PASSWORD" --appendonly yes
5
6# Replica
7docker run -d --name redis-replica -p 6380:6379 redis:7 \
8  redis-server --replicaof redis-primary 6379 \
9  --masterauth "$REDIS_PASSWORD" --requirepass "$REDIS_PASSWORD"

Sentinel 或 Redis Cluster 配置見 Sentinel HA Failover

監控重建

ElastiCache CloudWatch metrics 對應的自管替代:

ElastiCache metric自管替代來源
CurrConnectionsconnected_clientsINFO clients
CacheHitRatekeyspace_hits / (keyspace_hits + keyspace_misses)INFO stats
ReplicationLagmaster_repl_offset - slave_repl_offsetINFO replication
EngineCPUUtilizationused_cpu_sys + used_cpu_userINFO cpu
DatabaseMemoryUsagePercentageused_memory / maxmemoryINFO memory
Evictionsevicted_keysINFO stats

Prometheus redis_exporter 自動採集,接 Grafana dashboard。

Backup 重建

1# cron job: 每日 BGSAVE + 等完成 + 上傳 S3
2# LASTSAVE 回傳 Unix timestamp,BGSAVE 完成後 LASTSAVE 會更新
30 3 * * * BEFORE=$(redis-cli -a "$REDIS_PASSWORD" LASTSAVE) && \
4  redis-cli -a "$REDIS_PASSWORD" BGSAVE && \
5  while [ "$(redis-cli -a "$REDIS_PASSWORD" LASTSAVE)" = "$BEFORE" ]; do sleep 5; done && \
6  aws s3 cp /data/dump.rdb s3://backup-bucket/redis/$(date +\%Y\%m\%d).rdb

Production 建議搭配 persistence fork latency 的監控,確認 BGSAVE 的 fork 不會造成延遲 spike。

階段三:資料搬遷與切換

搬遷策略

ElastiCache 的資料搬遷有兩條路:

RDB export + import(適合 downtime 可接受的場景)

  1. ElastiCache 建立手動 snapshot
  2. 把 snapshot export 到 S3(ElastiCache console → Export snapshot)
  3. 下載 RDB 檔,放到自管 Redis 的資料目錄
  4. 重啟自管 Redis 載入 RDB

雙寫期間遷移(適合零停機需求)

  1. Application 同時寫 ElastiCache 和自管 Redis(雙寫)
  2. 讀取仍走 ElastiCache
  3. 監控自管 Redis 的資料量與命中率追上後,切讀取到自管
  4. 移除 ElastiCache 寫入
  5. 下線 ElastiCache

雙寫的複雜度高於 RDB export。Cache 資料可重建的特性讓第一種策略在多數場景夠用 — 短暫 cache miss 的代價是回源到 DB,通常可接受。

Endpoint 切換

Application 用 endpoint 連 ElastiCache。切換時:

  1. 把 application config 的 Redis host 改為自管 Redis endpoint
  2. 確認 TLS 與認證方式對齊(IAM token → password/ACL)
  3. Rolling restart application
  4. 監控 cache hit rate 與 latency 回到 baseline

如果用 DNS CNAME 間接指向 ElastiCache endpoint,可以直接改 CNAME 指向自管 Redis,application 不用改 config。

階段四:驗證與回退

驗證清單

驗證項目通過條件工具
連線正常application 能 PING、無 auth errorredis-cli + application log
資料完整key count 跟 ElastiCache 一致(容許 TTL 過期差異)DBSIZE 比對
效能 baselinelatency p99 與 hit rate 跟遷移前一致Prometheus + Grafana
HA 測試kill primary,Sentinel promote replica,application 自動重連手動 failover drill
Backup 測試BGSAVE 產生 RDB、上傳成功、可還原還原到測試 instance 驗證

回退路徑

Cache 遷移的回退比 DB 遷移簡單 — cache 資料可重建。回退步驟:

  1. Application config 改回 ElastiCache endpoint(或 CNAME 指回)
  2. Rolling restart
  3. Cache miss 回源到 DB,自然 warm up

ElastiCache 在遷移期間不要下線,保留 7-14 天作為回退保險。確認自管 Redis 穩定運行後再刪除 ElastiCache cluster。

成本對照

項目ElastiCache自管 Redis
Computemanaged node pricing(含 premium)EC2 / K8s 原價
HAauto failover 內建Sentinel 或 Cluster 自建
監控CloudWatch 內建redis_exporter + Prometheus 自建
Backup自動 snapshotcron + S3 自建
人力低(AWS 管)高(on-call + upgrade + patch)
靈活度受限(engine version、module)完全自控

小規模(< 50 GB、< 5 cluster)通常 ElastiCache 的 managed premium 比自管人力便宜。Compute 跟 HA 的差額在小規模可忽略,但監控跟 backup 的自建成本是固定開銷 — 即使只管一個 cluster,redis_exporter + Prometheus + cron backup 的設定跟維護都要做。大規模(數百 GB、多叢集)或跨雲場景下,managed premium 累積到 cluster 數 × node 數的倍數,自管的邊際成本反而更低,遷出 ROI 才成立。

交接路由