Triển khai Redis Cluster: Giải pháp mở rộng Cache cho hệ thống chịu tải cao

Database tutorial - IT technology blog
Database tutorial - IT technology blog

Khi nào Sentinel trở thành “nút thắt cổ chai”?

Redis Sentinel là giải pháp tuyệt vời để đảm bảo tính sẵn sàng cao (High Availability). Tuy nhiên, Sentinel có một giới hạn vật lý: Dữ liệu không được phân tán. Mọi node Slave đều chỉ là bản sao 1:1 của Master. Nếu tập dữ liệu của bạn chạm ngưỡng 64GB hoặc 128GB RAM của server, bạn không thể nhét thêm dữ liệu được nữa.

Đó là lúc Redis Cluster xuất hiện để giải bài toán quy mô. Thay vì dồn tất cả vào một giỏ, Cluster cho phép bạn chia nhỏ dữ liệu ra nhiều máy chủ (Horizontal Scaling). Hệ thống lúc này không chỉ chịu lỗi tốt mà còn có thể xử lý hàng triệu request mỗi giây nhờ tận dụng băng thông từ nhiều node Master cùng lúc.

Cơ chế vận hành của Redis Cluster

Để vận hành Cluster trơn tru, bạn cần hiểu cách Redis chia bài thông qua Hash Slots.

Hash Slots: Cách Redis chia nhỏ dữ liệu

Redis Cluster không dùng thuật toán băm nhất quán (Consistent Hashing) phức tạp mà chia cố định thành 16.384 Hash Slots. Khi bạn thực hiện lệnh SET key "value", Redis tính toán vị trí theo công thức: CRC16(key) mod 16384.

Giả sử bạn có cụm 3 node Master:

  • Node A: Quản lý slot 0 đến 5460.
  • Node B: Quản lý slot 5461 đến 10922.
  • Node C: Quản lý slot 10923 đến 16383.

Cách tiếp cận này cực kỳ linh hoạt. Khi cần mở rộng lên 4 node, bạn chỉ cần điều phối lại (reshard) một phần slot từ 3 node cũ sang node mới mà không gây gián đoạn dịch vụ.

Cơ chế tự phục hồi (Failover)

Trong mô hình Cluster, mỗi Master nên có ít nhất một Replica. Nếu Node A gặp sự cố phần cứng, Cluster sẽ kích hoạt bầu chọn và đưa Replica của Node A lên thay thế ngay lập tức. Toàn bộ quá trình này diễn ra trong vài giây, giúp ứng dụng của bạn không bị gián đoạn (zero downtime).

Thực hành: Dựng cụm Cluster 6 node (3 Master – 3 Replica)

Chúng ta sẽ giả lập 6 node trên cùng một máy bằng các port từ 7000 đến 7005. Trong môi trường Production, hãy đảm bảo mỗi node nằm trên một server vật lý hoặc container riêng biệt để tránh lỗi lan truyền.

Bước 1: Chuẩn bị môi trường

Tạo cấu trúc thư mục để quản lý dữ liệu riêng biệt cho từng instance:

mkdir redis-cluster && cd redis-cluster
mkdir 7000 7001 7002 7003 7004 7005

Bước 2: Viết file cấu hình

Tại mỗi thư mục, tạo file redis.conf. Đây là những thiết lập tối thiểu để Cluster có thể chạy được:

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir ./

Lưu ý: cluster-node-timeout là 5000ms. Nếu một node mất kết nối quá 5 giây, hệ thống sẽ coi như node đó đã sập và bắt đầu quy trình Failover.

Bước 3: Kích hoạt các tiến trình Redis

Khởi chạy cả 6 node bằng lệnh sau (hoặc chạy từng tab terminal):

redis-server 7000/redis.conf &
redis-server 7001/redis.conf &
# ... lặp lại cho đến port 7005

Bước 4: Thiết lập liên kết Cluster

Hiện tại các node vẫn hoạt động độc lập. Hãy dùng lệnh redis-cli để gắn kết chúng thành một thể thống nhất:

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1

Khi được hỏi, hãy gõ yes. Redis sẽ tự động phân bổ 3 node làm Master và 3 node làm Replica tương ứng.

Kiểm tra khả năng điều hướng dữ liệu

Điểm khác biệt lớn nhất khi dùng Cluster là bạn phải thêm flag -c khi kết nối bằng redis-cli:

redis-cli -c -p 7000
127.0.0.1:7000> set user:id:100 "John Doe"
-> Redirected to slot [8125] located at 127.0.0.1:7001
OK

Dù bạn truy cập vào port 7000, nhưng nếu key đó thuộc slot của port 7001, Redis sẽ tự động “chuyển hướng” bạn sang đúng node chứa dữ liệu. Nếu cần chuẩn bị dữ liệu mẫu lớn từ file CSV để test hiệu năng điều hướng này, bạn có thể dùng công cụ chuyển CSV sang JSON để tạo mock data nhanh chóng mà không lo lộ dữ liệu lên server.

Thử thách thực tế: Giả lập sự cố

Hãy thử kill node Master ở port 7000. Sau đó chạy lệnh cluster nodes ở bất kỳ node nào còn sống. Bạn sẽ thấy điều kỳ diệu: Node Replica (thường là 7003) đã tự động chiếm quyền Master. Mọi thao tác đọc/ghi vẫn diễn ra bình thường như chưa hề có cuộc chia ly.

Kinh nghiệm “xương máu” khi chạy Production

Để tránh những lỗi ngớ ngẩn khi vận hành hệ thống lớn, bạn cần ghi nhớ:

  • Hash Tags: Nếu muốn thực hiện các lệnh nhiều key (như MGET), hãy bọc phần chung của key trong ngoặc nhọn, ví dụ {orders}:1{orders}:2. Điều này ép chúng nằm cùng một slot.
  • Số lượng Node: Tối thiểu phải có 3 Master để Cluster có thể duy trì đa số phiếu bầu (Quorum) khi có node sập.
  • Thư viện Client: Đảm bảo code của bạn dùng thư viện hỗ trợ Cluster (như ioredis cho Node.js hoặc Lettuce cho Java). Dùng thư viện Redis đơn lẻ sẽ khiến app báo lỗi liên tục khi gặp Redirect.

Lời kết

Redis Cluster là bước nhảy vọt về tư duy quản lý dữ liệu trong RAM. Nó không chỉ giúp hệ thống của bạn “trâu” hơn mà còn mang lại khả năng mở rộng không giới hạn. Hãy bắt đầu với cụm 6 node nhỏ này trước khi áp dụng vào các dự án nghìn tỷ request. Chúc các bạn cấu hình thành công!

Share: