ElastiCache

5 phút đọcSeries: NoteBook: AWS Certified Solutions Architect Associate SAA-C031 lượt xem

Tổng quan

  • ElastiCache là service Redis hoặc Memcached được quản lý.
  • Cache là các cơ sở dữ liệu in-memory (dữ liệu lưu trên RAM) có hiệu năng cực cao và độ trễ thấp.
  • Hỗ trợ giảm tải truy vấn đọc cho cơ sở dữ liệu, đặc biệt với các ứng dụng có lượng đọc lớn (read-intensive workloads).
  • Giúp ứng dụng stateless hóa, dễ mở rộng và phục hồi.
  • AWS tự động xử lý toàn bộ các công việc như:
    • Bảo trì hệ điều hành
    • Patching
    • Tối ưu hóa hiệu suất
    • Cấu hình, giám sát, tự động phục hồi khi lỗi, backup

⚠️ Sử dụng ElastiCache thường yêu cầu thay đổi đáng kể trong mã nguồn của ứng dụng.

Ví dụ thực tế

DB Cache

  • Ứng dụng truy vấn dữ liệu từ ElastiCache trước (Redis hoặc Memcached).
    • Nếu cache hit (dữ liệu có trong cache) → trả về kết quả luôn.
    • Nếu cache miss:
      • Ứng dụng truy vấn xuống Amazon RDS.
      • Sau khi lấy dữ liệu, ghi lại vào cache để dùng cho lần sau.
  • Toàn bộ logic cache-first và cache-populate là do application quản lý.
  • Giúp giảm tải cho RDS.
  • Cache cần có chiến lược xóa/ghi đè (invalidation) để đảm bảo chỉ dữ liệu mới nhất được sử dụng trong cache.

User Session Store

  • Người dùng đăng nhập vào bất kỳ ứng dụng nào.
  • Ứng dụng ghi dữ liệu phiên (session) vào ElastiCache.
  • Người dùng chuyển sang một instance khác của ứng dụng.
  • Instance đó truy xuất dữ liệu phiên từ ElastiCache → người dùng được xác nhận là đã đăng nhập.
  • Đây là pattern chuẩn để lưu session dùng Redis, tránh session gắn cứng vào local memory (stateless).
  • Dễ scale ngang (horizontal scaling), không phụ thuộc app server cụ thể.
  • Có thể sử dụng với Redis Cluster hoặc Redis Replication trong ElastiCache để tăng độ sẵn sàng.

Redis vs Memcached

Bạn có thể tạo Redis hoặc Memcached cluster khi sử dụng Elasticcache service

Redis

  • Multi-AZ với Auto-Failover
    → Hỗ trợ triển khai đa vùng sẵn sàng, tự động chuyển đổi dự phòng nếu node chính gặp sự cố.
  • Read Replicas để mở rộng đọc và đạt được high availability
    → Cho phép tạo replica để phục vụ các truy vấn đọc, giảm tải node chính và tăng tính sẵn sàng.
  • Tính bền vững dữ liệu (Data Durability) bằng AOF persistence
    → Hỗ trợ ghi log theo thời gian thực để phục hồi dữ liệu sau sự cố.
  • Hỗ trợ sao lưu và phục hồi dữ liệu
    → Cho phép backup và restore dữ liệu Redis.
  • Hỗ trợ kiểu dữ liệu Set và Sorted Set
    → Ngoài key-value, Redis hỗ trợ cấu trúc dữ liệu nâng cao.
Khi nào dùng Redis?
  • Redis phù hợp với những use case cần nhiều hơn chỉ cache tạm thời:
    •  Cần dữ liệu bền vững hoặc failover
      • Dữ liệu không được phép mất khi restart
      • Có backup/restore
      • Yêu cầu High Availability (Multi-AZ, replication)
  • Ví dụ:
    • Session Store (trong hệ phân tán – multi-instance login)
    • Shopping Cart (e-commerce)
    • Leaderboard (game, ranking system)
    • Queue/buffer (pub-sub, background task)
    • Throttle / Rate limiter (đếm request per IP)
    • Caching dữ liệu đọc nhiều và cần consistency

Memcached

  • Multi-node để phân mảnh dữ liệu (sharding)
    → Hỗ trợ tự động chia nhỏ dữ liệu giữa các node để mở rộng theo chiều ngang.
  • Không hỗ trợ tính sẵn sàng cao (replication)
    → Không có khả năng tự động sao chép dữ liệu hoặc failover như Redis.
  • Không bền vững dữ liệu (Non-persistent)
    → Dữ liệu chỉ nằm trong RAM, khi mất điện/máy chủ khởi động lại thì mất toàn bộ.
  • Backup và restore (Serverless)
    → Không hỗ trợ native backup/restore giống Redis, nhưng có thể triển khai giải pháp serverless bên ngoài.
  • Kiến trúc đa luồng (multi-threaded)
    → Tận dụng CPU tốt hơn trong môi trường nhiều core.
Khi nào dùng Memcached?
  • Memcached đơn giản, hiệu suất cao, chỉ dùng RAM, không cần durability:
  • Cache dữ liệu đơn giản, không cần tính bền vững
    • Dữ liệu có thể regenerate dễ dàng (ví dụ đọc lại từ DB)
    • Không cần backup
    • Không quan tâm đến mất dữ liệu khi restart
  • Ví dụ:
    • HTML fragment cache (render xong cache ra)
    • Query result cache (kết quả truy vấn SELECT)
    • Caching API response
    • CDN-level cache
    • Key-value cache ngắn hạn

Cache Security

  • ElastiCache hỗ trợ xác thực IAM cho Redis
    • Các policy IAM trên ElastiCache chỉ được sử dụng cho bảo mật cấp API của AWS
  • Redis AUTH
    • Bạn có thể thiết lập “password/token” khi tạo Redis cluster
    • Đây là một lớp bảo mật bổ sung cho cache (bên cạnh security group của VPC)
    • Hỗ trợ SSL in-flight encryption (mã hóa dữ liệu khi truyền)
  • Memcached
    • Hỗ trợ xác thực dựa trên SASL (dành cho use case nâng cao)
  • EC2 Client kết nối đến Redis thông qua mạng nội bộ (VPC)
  • Kết nối được mã hóa bằng SSL, đồng thời xác thực bằng Redis AUTH
  • Redis được đặt trong một security group riêng biệt, kiểm soát mức truy cập inbound/outbound

Pattern phổ biến khi dùng ElastiCache

Lazy Loading

Cache chỉ chứa dữ liệu đã từng được đọc. Dữ liệu có thể bị "stale" (lỗi thời) nếu DB thay đổi mà cache không bị xóa.

  • Nhược điểm: dữ liệu có thể không đồng bộ nếu update ở DB nhưng không xóa cache.
  • Ưu điểm: tiết kiệm tài nguyên cache, đơn giản, phổ biến.
  • Triển khai: thường dùng với pattern Cache-Aside (ứng dụng kiểm tra cache trước, nếu miss thì lấy từ DB rồi ghi vào cache).

Write Through

Dữ liệu được ghi vào cache đồng thời khi ghi vào DB → đảm bảo cache luôn cập nhật (no stale data).

  • Ưu điểm: không có dữ liệu lỗi thời, nhất quán cao giữa cache và DB.
  • Nhược điểm: nếu cache gặp sự cố khi ghi, DB cũng có thể bị ảnh hưởng (tùy cách xử lý exception).
  • Phù hợp với hệ thống cần đảm bảo cache luôn "fresh".

Session Store

Dùng cache để lưu session tạm thời (kèm TTL – Time to Live để tự động hết hạn).

  • Phù hợp cho lưu trữ session đăng nhập, OTP, trạng thái người dùng,...
  • Redis rất phổ biến cho use case này do hỗ trợ TTL trên từng key.
Bạn thấy bài này thế nào?