Redis Cluster là gì: Hướng dẫn sử dụng cơ bản cho người mới

Redis là một trong những hệ thống lưu trữ in-memory phổ biến nhất hiện nay. Tuy nhiên, khi hệ thống phát triển lớn, bạn cần một giải pháp có thể mở rộng, phân phối dữ liệu, và đảm bảo luôn sẵn sàng khi có sự cố – đó chính là lúc Redis cluster phát huy sức mạnh. 

Đọc bài viết này để hiểu rõ hơn về:

  • Redis cluster là gì?
  • Các thành phần của Redis cluster
  • Cách Redis cluster hoạt động
  • Cách sử dụng kèm ví dụ cụ thể

Redis và Redis Cluster là gì?

Redis là gì?

Redis (viết tắt của Remote Dictionary Server) là một cơ sở dữ liệu NoSQL mã nguồn mở, được lưu trữ trong bộ nhớ (in-memory), với khả năng truy xuất dữ liệu cực kỳ nhanh chóng. Redis hoạt động như một kho lưu trữ dữ liệu dạng key-value, hỗ trợ nhiều kiểu dữ liệu phức tạp như chuỗi (strings), danh sách (lists), bộ (sets), sorted sets, hash, bitmaps, HyperLogLogs, streams và các chỉ mục địa lý (geospatial indexes).

Redis thường được sử dụng cho các tác vụ như caching, quản lý session người dùng, hoặc phân tích dữ liệu thời gian thực nhờ vào tốc độ và tính hiệu quả của nó.

Bạn có thể tìm hiểu đầy đủ về Redis là gì.

Redis Cluster là gì?

Redis Cluster là một giải pháp phân tán của Redis, cho phép chia sẻ dữ liệu giữa nhiều máy chủ Redis. Với Redis Cluster, dữ liệu được phân tán và lưu trữ trên nhiều nút (nodes), giúp tăng cường khả năng mở rộng (scalability) và khả năng chịu lỗi (fault tolerance). 

Redis Cluster hỗ trợ tự động phân vùng dữ liệu và cân bằng tải giữa các nút, đồng thời giúp đảm bảo tính sẵn sàng cao cho các ứng dụng yêu cầu khả năng truy cập dữ liệu nhanh chóng và liên tục.

Cấu trúc của Redis Cluster

Redis Cluster có cấu trúc phân tán, cho phép Redis hoạt động ở quy mô lớn hơn và tối ưu hóa hiệu suất khi làm việc với một lượng dữ liệu khổng lồ. Redis Cluster giúp chia nhỏ dữ liệu của bạn và phân phối nó qua nhiều máy chủ khác nhau, giúp Redis có thể mở rộng (scalable) và cung cấp khả năng chịu lỗi cao.

Cấu trúc Redis Cluster bao gồm các thành phần chính sau:

Shards (Mảnh dữ liệu): Redis Cluster chia dữ liệu thành các shards (mảnh dữ liệu). Mỗi shard sẽ lưu trữ một phần của cơ sở dữ liệu Redis. Redis Cluster chia dữ liệu thành 16,384 hash slots và mỗi khóa (key) trong Redis sẽ được ánh xạ vào một trong các hash slots này thông qua thuật toán CRC16. Các shard có thể phân tán qua nhiều máy chủ hoặc container.

Master Nodes và Replica Nodes (Nút chủ và nút sao lưu): Cấu trúc này giúp Redis Cluster luôn duy trì hoạt động mà không bị gián đoạn ngay cả khi có sự cố:

  • Master Nodes (Nút Chủ): Là nơi lưu trữ dữ liệu chính của các hash slots. Mỗi shard có một master node xử lý các yêu cầu ghi (write).
  • Replica Nodes (Nút Sao Lưu): Là bản sao của master node, giúp sao lưu dữ liệu và cung cấp tính năng chịu lỗi. Replica nodes chỉ xử lý các yêu cầu đọc (read-only). Nếu master node gặp sự cố, một replica node sẽ tự động thay thế và trở thành master mới.

Redis Cluster hoạt động như thế nào?

Phát hiện các Node

Redis Cluster sử dụng gossip protocol* để các node trong cluster tự động phát hiện và giao tiếp với nhau. Mỗi node sẽ duy trì danh sách các node khác trong cluster thông qua cluster bus port (port mặc định + 10000) và chia sẻ thông tin về trạng thái cluster, giúp mọi node đồng bộ với nhau mà không cần sự can thiệp thủ công.

* Gossip Protocol là một giao thức phân tán được sử dụng để chia sẻ thông tin giữa các node trong một hệ thống mạng. Mỗi node trong hệ thống sẽ gửi và nhận thông tin từ các node khác một cách định kỳ, giống như cách mọi người trao đổi thông tin trong một cuộc trò chuyện (gossip). Giao thức này giúp các node trong hệ thống tự động phát hiện nhau và đồng bộ trạng thái mà không cần sự can thiệp từ bên ngoài.

Trong Redis Cluster, gossip protocol được sử dụng để các node tự động phát hiện các node mới, duy trì thông tin về trạng thái của cluster và giúp hệ thống hoạt động mượt mà.

Phân chia dữ liệu (Data Sharding)

Redis Cluster chia dữ liệu thành các hash slots (các vị trí lưu trữ). Tổng cộng có 16384 hash slots trong cluster và mỗi khóa sẽ được ánh xạ vào một trong các slots này bằng cách sử dụng hàm băm (hash function). 

Dữ liệu trong các hash slots này sẽ được phân phối đều qua các node trong cluster. Ví dụ, trong một cluster 4 node, mỗi node sẽ quản lý một phạm vi các hash slots:

Redis Cluster - itviec blog

Sao chép và Dự phòng (Master-Replica Replication)

Mỗi hash slot được gán cho một master node (node chính) và dữ liệu từ master node sẽ được sao chép vào các replica nodes (node sao lưu). Các node sao lưu này không chỉ cung cấp tính dự phòng mà còn có thể thay thế master node trong trường hợp xảy ra sự cố.

Client tương tác với Cluster 

Khi client gửi yêu cầu đến Redis Cluster, yêu cầu sẽ được điều hướng đến node phụ trách của khóa đó dựa trên hash slot. Nếu client kết nối với một node không phải là master của khóa, Redis sẽ chuyển hướng yêu cầu tới node chính xác thông qua các phản hồi như MOVED hoặc ASK, giúp việc tương tác trở nên liền mạch.

Tự phục hồi và sẵn sàng cao

Redis Cluster có cơ chế failover tự động. Nếu master node gặp sự cố, một replica node sẽ tự động thăng cấp làm master mới. Quá trình này được thực hiện thông qua cơ chế voting giữa các master nodes còn lại, yêu cầu sự đồng ý của đa số (majority) các master nodes.

Hệ thống cập nhật cluster configuration và thông báo đến client, đảm bảo sự tiếp tục của dịch vụ mà không bị gián đoạn.

Cấu hình Cluster

Cấu hình của Redis Cluster chứa thông tin về các node, hash slots và replica. Mỗi node duy trì một bản sao của cluster configuration được gọi là “cluster state”. Cấu hình này được cập nhật động khi các node gia nhập hoặc rời khỏi cluster, giúp Redis Cluster duy trì sự nhất quán và tính ổn định cao trong quá trình hoạt động.

Các tính năng chính của Redis Cluster

(Lưu ý: Các tính năng dưới đây được áp dụng cho phiên bản Redis 3.0 trở đi)

Redis Cluster được thiết kế với các mục tiêu chính sau:

Hiệu suất cao và khả năng mở rộng tuyến tính lên đến hàng nghìn nút

Redis Cluster không sử dụng proxy, áp dụng sao chép bất đồng bộ và không thực hiện các thao tác hợp nhất trên giá trị, giúp đảm bảo tốc độ truy xuất và khả năng mở rộng tối ưu.

Tuy nhiên, trong thực tế thường được khuyến nghị tối đa vài trăm nút để đảm bảo hiệu suất tối ưu.

Độ an toàn ghi (write) tương đối

Redis Cluster cố gắng đảm bảo rằng các thao tác ghi từ client sẽ được lưu lại nếu client đang kết nối với phần lớn các node master trong cluster và network partition không xảy ra.

Tuy nhiên, vẫn có thể xảy ra trường hợp dữ liệu bị mất nếu hệ thống gặp sự cố bất ngờ, nhất là khi client đang kết nối với một nhóm node nhỏ lẻ (thiểu số) bị tách ra khỏi phần còn lại của cluster. Những tình huống như vậy được gọi là “failure modes” và chúng có thể xảy ra trong thời gian ngắn.

Cluster Manager (Quản lý Cluster)

Quản lý toàn bộ Redis Cluster, bao gồm việc phân phối và tái phân phối dữ liệu giữa các node. Cluster Manager tự động thực hiện việc tái phân phối dữ liệu (re-sharding) và đảm bảo dữ liệu luôn có sẵn khi có sự cố xảy ra.

Tính sẵn sàng cao và khôi phục sau lỗi

Redis Cluster hỗ trợ tính năng failover tự động. Nghĩa là khi một master node gặp sự cố, hệ thống sẽ tự động chuyển một replica node thành master mới mà không cần can thiệp từ người quản trị. 

Khả năng mở rộng

Redis Cluster hỗ trợ khả năng mở rộng theo chiều ngang (horizontal scaling), tức là có thể thêm nhiều node vào cluster để tăng cường khả năng xử lý và mở rộng hệ thống. Quá trình mở rộng này có thể diễn ra mà không gây gián đoạn dịch vụ (với một số hạn chế nhất định).

Hướng dẫn sử dụng Redis Cluster cơ bản

Thiết lập Redis Cluster

Cài đặt Redis Cluster thủ công trên máy thật hoặc máy ảo

Để khởi tạo một Redis Cluster, ta cần ít nhất 3 node chính (master). Mỗi master nên có ít nhất một bản sao (replica) để đảm bảo dữ liệu không mất nếu một node bị lỗi. Vì vậy, bạn nên chuẩn bị tối thiểu 6 instance Redis và đảm bảo tối thiểu 3 master nodes để tránh tình trạng split-brain (cluster bị phân tách dẫn đến mất đồng bộ dữ liệu).

  • Bước 1: Cài Redis:
sudo apt update && sudo apt install redis-server -y
  • Bước 2: Tạo nhiều instance Redis trên các port khác nhau: Ta sẽ tạo 6 Redis instance chạy nền với cấu hình cluster.
redis-server --port 7000 --cluster-enabled yes --cluster-config-file nodes-7000.conf \
--cluster-node-timeout 5000 --appendonly yes --dbfilename dump-7000.rdb \
--logfile 7000.log --daemonize yes

Thực hiện tương tự với các port 7001, 7002, 7003, 7004, 7005.

  • Bước 3: Khởi tạo cluster:
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

Thiết lập Redis Cluster bằng Docker

Ngoài cách khởi tạo Redis Cluster thủ công, bạn cũng có thể sử dụng Docker để triển khai nhanh và dễ quản lý hơn, đặc biệt hữu ích khi muốn mô phỏng cluster trên máy local mà không cần tạo nhiều file cấu hình phức tạp.

  • Bước 1: Tạo Docker network: 
docker network create redis-cluster-net
  • Bước 2: Tạo 6 container Redis trên các port 7000–7005:
for port in 7000 7001 7002 7003 7004 7005; do
  docker run -d --name redis-$port --net redis-cluster-net \
  -p $port:$port -v redis-$port-data:/data redis:7-alpine redis-server --port $port \
  --cluster-enabled yes --cluster-config-file nodes.conf \
  --cluster-node-timeout 5000 --appendonly yes --protected-mode no

done
  • Bước 3: Tạo Redis Cluster:
# Đợi containers khởi động hoàn toàn
sleep 10

# Lấy IP addresses của containers
redis_ips=""
for port in 7000 7001 7002 7003 7004 7005; do
  ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-$port)
  redis_ips="$redis_ips $ip:$port"
done

# Tạo cluster
docker exec -it redis-7000 redis-cli --cluster create $redis_ips --cluster-replicas 1

Sau đó bạn sẽ được hỏi xác nhận yes, sau đó cụm Redis sẽ được khởi tạo.

Tương tác với Redis Cluster 

Kết nối với Redis Cluster

Khi đã có Redis Cluster hoạt động, ta có thể kết nối vào một node bất kỳ bằng:

redis-cli -c -p 7000

Trong đó:

  • Tham số -c giúp Redis CLI hiểu về cluster và tự động chuyển hướng truy vấn đến đúng node nếu key không thuộc node hiện tại.
  • Tham số -p chỉ định port của node muốn kết nối.

Làm việc với dữ liệu

Ví dụ ta setget một key như sau:

SET mykey "hello"
GET mykey

Redis sẽ tự xác định key này thuộc slot nào (sử dụng CRC16 hash) và gửi truy vấn tới node đang quản lý slot đó.

Lưu ý về Multi-key operations: Lệnh này sẽ KHÔNG hoạt động trong cluster mode nếu keys ở các slots khác nhau như:

MGET key1 key2 key3

Thay vào đó, sử dụng hash tags để đảm bảo keys ở cùng slot:

SET {user:123}:name "Alice"
SET {user:123}:email "alice@example.com"
MGET {user:123}:name {user:123}:email

Xác định vị trí key

Để biết key thuộc slot nào, ta dùng:

CLUSTER KEYSLOT mykey

Kết quả sẽ trả về số slot (0-16383) mà key được gán vào.

Giám sát Redis Cluster

Kiểm tra trạng thái cluster

Ta dùng lệnh sau để biết cluster đang hoạt động ổn không, có node nào bị lỗi không.

CLUSTER INFO

Danh sách các node trong cluster

Ta dùng lệnh sau để biết các node trong cụm, vai trò (master/replica), ID và tình trạng của chúng:

CLUSTER NODES

Theo dõi hoạt động trực tiếp

Lệnh sau sẽ giúp xem tất cả các lệnh đang gửi tới Redis theo thời gian thực:

MONITOR

Các lệnh giám sát khác

# Kiểm tra slot mapping
CLUSTER SLOTS

# Kiểm tra replica của master cụ thể
CLUSTER REPLICAS <master-node-id>

# Thống kê về cluster
INFO replication
INFO cluster

Quản lý nâng cao

Failover tự động

Nếu một master bị lỗi, Redis Cluster sẽ tự động bầu chọn một replica thành master mới để tiếp tục phục vụ ứng dụng thông qua quá trình voting. Quá trình này yêu cầu đa số (majority) các master nodes còn lại đồng ý.

Thời gian failover thường dao động từ vài giây đến 30 giây tùy thuộc vào cấu hình cluster-node-timeout.

# Kết nối đến replica node muốn promote
redis-cli -p 7003
CLUSTER FAILOVER

# Hoặc force failover (không cần chờ sync từ master)
CLUSTER FAILOVER FORCE

Thêm node mới

Khi hệ thống lớn dần, ta có thể thêm node mới bằng lệnh:

redis-server --port 7006 --cluster-enabled yes [...]

Sau đó:

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
# 127.0.0.1:7006 là node mới, 127.0.0.1:7000 là node đã có trong cluster

Di chuyển hash slot giữa các node (resharding)

Khi thêm node mới, ta có thể phân bổ lại các slot:

redis-cli --cluster reshard 127.0.0.1:7000

Bạn sẽ được yêu cầu nhập số slot, node nguồn và node đích.

Xoá node khỏi cluster

redis-cli --cluster del-node 127.0.0.1:7000 <node-id>

Trong đó: Node-id là node cần xoá.

Câu hỏi thường gặp về Redis Cluster

Redis cache và redis cluster khác nhau những gì gi?

Redis Cache là cách sử dụng Redis như một bộ nhớ đệm (cache) đơn giản, thường chạy trên 1 instance duy nhất. Nó phù hợp cho các ứng dụng nhỏ hoặc khi chỉ cần tốc độ truy xuất dữ liệu nhanh mà không cần phân tán.

Trong khi đó, Redis Cluster là kiến trúc phân tán cho phép chạy Redis trên nhiều node, chia dữ liệu thành các phần nhỏ (hash slot) và phân phối giữa các node. Redis cluster hỗ trợ tính sẵn sàng cao (high availability) và khả năng mở rộng (scalability) tốt hơn.

Mở rộng tuyến tính (linear scalability) là gì?

Linear scalability (mở rộng tuyến tính) nghĩa là khi bạn tăng số lượng node trong Redis Cluster, hiệu suất (số lượng truy vấn/giây) cũng tăng gần như tương ứng. Ví dụ nếu 3 node xử lý được 30K request/giây, thì 6 node có thể xử lý khoảng 60K request/giây.

Điều này giúp Redis Cluster đáp ứng được nhu cầu tăng trưởng lớn về dữ liệu và lưu lượng người dùng mà không gây nghẽn hệ thống.

Hạn chế của Redis Cluster là gì?

Redis Cluster tuy mạnh mẽ nhưng vẫn có một số hạn chế:

  • Không hỗ trợ các lệnh liên quan đến nhiều key nằm trên các hash slot khác nhau, trừ khi dùng CROSSSLOT workaround hoặc các kỹ thuật tách key.
  • Failover không hoàn toàn an toàn: vẫn có một khoảng thời gian ngắn có thể mất dữ liệu nếu master node chưa kịp sync dữ liệu sang replica trước khi bị lỗi.
  • Không hỗ trợ transaction kiểu MULTI/EXEC liên key ở nhiều slot khác nhau
  • Tăng độ phức tạp khi quản lý nhất là khi thêm node, resharding hoặc xử lý lỗi mạng.

Tổng kết

Redis Cluster không chỉ đơn thuần là một cách triển khai nâng cao của Redis mà còn là một giải pháp thiết yếu cho bất kỳ hệ thống nào cần khả năng mở rộng quy mô, độ tin cậy cao và xử lý dữ liệu phân tán hiệu quả. Việc nắm vững cách thiết lập, tương tác, giám sát và quản lý Redis Cluster sẽ giúp bạn chủ động hơn trong việc xây dựng những hệ thống backend lớn, có thể chịu tải cao và phục vụ hàng nghìn đến hàng triệu người dùng một cách ổn định.

ITviec hy vọng bài viết trên đã cung cấp thông tin hữu ích giúp bạn hiểu rõ hơn về Redis Cluster cũng như cách triển khai và ứng dụng vào thực tế.

TÁC GIẢ
Mỹ Duyên
Mỹ Duyên

Content Writer

Là cử nhân ngành Data Science, Duyên có hơn 1 năm kinh nghiệm nghiên cứu trong ngành Data và tập trung vào AI, phân tích dữ liệu. Thông qua những bài viết từ cơ bản đến nâng cao thuộc lĩnh vực cơ sở dữ liệu, Duyên mang đến cho độc giả những cái nhìn toàn diện và mới mẻ về thế giới công nghệ thông tin và dữ liệu.