Replication & High Availability trong Redis

Photo of author

Văn Ngọc Tân

Replication & High Availability trong Redis

Bạn có biết?

Khi Redis server duy nhất gặp sự cố — ổ cứng hỏng, network đứt, hoặc đơn giản là restart — toàn bộ ứng dụng của bạn sẽ “đứng hình”. Với Replication, bạn có nhiều bản sao dữ liệu. Với Sentinel, hệ thống tự động phát hiện sự cố và chuyển sang server khác trong vài giây. Đây chính là cách các hệ thống lớn đảm bảo Redis luôn sẵn sàng 24/7.

Replication là gì?

Replication (sao chép) là cơ chế tạo bản sao dữ liệu từ một Redis instance (master) sang các instance khác (replica). Khi master thay đổi dữ liệu, tất cả replica tự động cập nhật theo.

Lợi ích:

  • High Availability — Master crash → replica lên thay
  • Read Scaling — Chia tải đọc sang nhiều replica
  • Backup — Dữ liệu tồn tại ở nhiều nơi
  • Disaster Recovery — Replica ở data center khác

Cấu hình Replication

Cách 1: Cấu hình trên file redis.conf

# Trên replica server, thêm vào redis.conf:
replicaof 192.168.1.100 6379

# Nếu master có password:
masterauth "your-master-password"

# Replica chỉ đọc (mặc định)
replica-read-only yes

Cách 2: Cấu hình qua CLI

# Trên replica server, kết nối redis-cli:
127.0.0.1:6379> REPLICAOF 192.168.1.100 6379
OK

# Hủy replication (trở thành standalone):
127.0.0.1:6379> REPLICAOF NO ONE
OK

Kiểm tra replication status

# Trên master — xem danh sách replica
127.0.0.1:6379> INFO replication
# Replication
# role:master
# connected_slaves:2
# slave0:ip=192.168.1.101,port=6379,state=online,offset=1234,lag=0
# slave1:ip=192.168.1.102,port=6379,state=online,offset=1234,lag=0

# Trên replica — xem trạng thái
127.0.0.1:6379> INFO replication
# Replication
# role:slave
# master_host:192.168.1.100
# master_port:6379
# master_link_status:up
# master_last_io_seconds_ago:1
# master_sync_in_progress:0

Cách Replication hoạt động

Quá trình đồng bộ ban đầu

  1. Replica kết nối tới master
  2. Master tạo RDB snapshot toàn bộ dataset
  3. Master gửi RDB file cho replica
  4. Replica load RDB, xóa dữ liệu cũ
  5. Mọi thay đổi mới được gửi qua replication stream

Quá trình đồng bộ liên tục

Sau khi sync ban đầu, master gửi từng lệnh ghi cho replica qua replication backlog:

# Master thực hiện:
SET user:1 "Alice"
HSET user:1 age 25

# → Lệnh được gửi cho tất cả replica
# → Replica thực hiện lại lệnh tương tự

Nếu replica disconnect thời gian ngắn, nó có thể partial resync (đồng bộ một phần) thay vì full sync lại từ đầu.

Replication Backlog

# Cấu hình backlog size (mặc định 1mb)
repl-backlog-size 64mb

# Backlog timeout (mặc định 3600 giây)
repl-backlog-ttl 3600

Backlog càng lớn → khả năng partial resync càng cao → ít phải full sync.

Read Scaling với Replica

Mặc định replica chỉ đọc. Bạn có thể chia tải đọc:

# Python — đọc từ replica, ghi vào master
import redis

master = redis.Redis(host='192.168.1.100', port=6379)
replica1 = redis.Redis(host='192.168.1.101', port=6379)
replica2 = redis.Redis(host='192.168.1.102', port=6379)

# Ghi → master
master.set("user:1", "Alice")

# Đọc → replica (load balancing)
import random
replicas = [replica1, replica2]
replica = random.choice(replicas)
value = replica.get("user:1")

Lưu ý: Có độ trễ nhỏ giữa master và replica (thường < 1ms). Nếu cần dữ liệu mới nhất, đọc từ master.

Redis Sentinel — High Availability

Replication chỉ tạo bản sao. Khi master crash, bạn cần thủ công chuyển replica thành master. Sentinel tự động hóa quá trình này.

Sentinel là gì?

Sentinel là hệ thống giám sát Redis, có nhiệm vụ:

  • Monitoring — Kiểm tra master và replica có sống không
  • Notification — Thông báo khi có sự cố
  • Automatic Failover — Tự động chuyển replica thành master
  • Configuration Provider — Cho client biết master hiện tại là ai

Cấu hình Sentinel

File sentinel.conf:

# Giám sát master "mymaster" tại 192.168.1.100:6379
# Cần 2/3 Sentinel đồng ý để xác nhận master down
sentinel monitor mymaster 192.168.1.100 6379 2

# Master được xác nhận down sau 5 giây không phản hồi
sentinel down-after-milliseconds mymaster 5000

# Failover timeout — 60 giây
sentinel failover-timeout mymaster 60000

# Số replica có thể đồng thời sync mới
sentinel parallel-syncs mymaster 1

# Nếu master có password
sentinel auth-pass mymaster "your-password"

Khởi động Sentinel

# Cách 1: Chạy riêng
redis-sentinel /etc/redis/sentinel.conf

# Cách 2: Chạy như module của redis-server
redis-server /etc/redis/sentinel.conf --sentinel

Kiểm tra Sentinel

# Kết nối Sentinel (port 26379 mặc định)
redis-cli -p 26379

# Xem trạng thái master
127.0.0.1:26379> SENTINEL master mymaster
# 1) "name"
# 2) "mymaster"
# 3) "ip"
# 4) "192.168.1.100"
# 5) "port"
# 6) "6379"
# 7) "flags"
# 8) "master"

# Xem danh sách replica
127.0.0.1:26379> SENTINEL replicas mymaster

# Xem danh sách Sentinel
127.0.0.1:26379> SENTINEL sentinels mymaster

# Lấy địa chỉ master hiện tại
127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
# 1) "192.168.1.100"
# 2) "6379"

Quá trình Failover

Khi master gặp sự cố:

  1. Sentinel phát hiện master không phản hồi (> down-after-milliseconds)
  2. Sentinel đánh dấu master là SDOWN (Subjectively Down)
  3. Các Sentinel khác xác nhận → ODOWN (Objectively Down)
  4. Sentinel bầu chọn replica phù hợp nhất (ưu tiên: data mới nhất, priority cao nhất)
  5. Sentinel gửi REPLICAOF NO ONE cho replica được chọn → nó thành master mới
  6. Các replica khác chuyển sang replicate master mới
  7. Sentinel thông báo cho client qua Pub/Sub

Toàn bộ quá trình mất khoảng 10-30 giây.

Client kết nối qua Sentinel

# Python với redis-py
from redis.sentinel import Sentinel

# Khởi tạo Sentinel
sentinel = Sentinel([
    ('sentinel1.example.com', 26379),
    ('sentinel2.example.com', 26379),
    ('sentinel3.example.com', 26379),
], socket_timeout=0.5)

# Lấy master hiện tại
master = sentinel.master_for('mymaster', socket_timeout=0.5)
master.set("key", "value")

# Lấy replica để đọc
replica = sentinel.slave_for('mymaster', socket_timeout=0.5)
value = replica.get("key")

Client tự động biết master mới sau failover — không cần thay đổi code!

So sánh Replication vs Sentinel vs Cluster

Tiêu chí Replication Sentinel Cluster
High Availability Thủ công Tự động Tự động
Read Scaling
Write Scaling Không Không
Auto Failover Không
Data Sharding Không Không
Complexity Thấp Trung bình Cao
Phù hợp Small apps Medium apps Large scale

Best Practices

  1. Luôn dùng Sentinel — Ít nhất 3 Sentinel instances
  2. Đặt Sentinel ở server khác — Không chung máy với Redis
  3. Giám sát replication lag — Dùng INFO replication kiểm tra lag
  4. Tăng repl-backlog-size — Giảm full sync khi replica reconnect
  5. Test failover định kỳ — Dùng SENTINEL failover mymaster
  6. Client hỗ trợ Sentinel — Dùng thư viện có built-in Sentinel support

Lưu ý quan trọng

  • Replica chỉ đọc — Mọi ghi phải qua master
  • Có replication lag — Dữ liệu trên replica có thể chậm hơn master vài ms
  • Sentinel cần ≥3 instances — Để tránh split-brain
  • Failover mất 10-30s — Ứng dụng cần xử lý được downtime ngắn
  • Không phải Cluster — Sentinel không hỗ trợ sharding, chỉ HA
Redis high availability with Sentinel and Cluster
Sentinel và Cluster giúp Redis hoạt động liên tục ngay cả khi node lỗi

Bước tiếp theo

Bạn đã nắm vững Replication & High Availability! Tiếp theo, chúng ta sẽ bước vào phần Thực hành — xây dựng các hệ thống thực tế với Redis.

👉 Bài tiếp theo: Xây dựng Rate Limiter với Redis

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận