0

Series Redis Sentinel & Node.js Thực chiến #2: Dựng "Trận đồ Bát Quái" với Docker Compose

1. Tại sao lại là 3 Sentinels mà không phải 1 hay 2?

Trước khi gõ code, bạn cần nắm một luật chơi cực kỳ quan trọng của hệ thống phân tán: Quorum (Đại đa số).

Để Sentinel quyết định một con Master đã chết và đưa Replica lên thay, các node Sentinel phải tổ chức "bỏ phiếu".

  • Nếu bạn chỉ chạy 1 Sentinel: Cấu hình quá mỏng manh. Nhỡ chính con Sentinel đó chết thì sao?
  • Nếu bạn chạy 2 Sentinels: Khi Master chết (kéo theo 1 Sentinel nằm cùng server chết theo), bạn chỉ còn 1 Sentinel sống sót. 1 phiếu trên tổng số 2 phiếu ban đầu không đạt quá bán (>50%). Cuộc bỏ phiếu thất bại, hệ thống vẫn sập.
  • Chạy 3 Sentinels: Nếu 1 Sentinel chết, bạn vẫn còn 2 con (2/3 phiếu). Quorum đạt, hệ thống tự động Failover thành công! Đó là lý do số lượng Sentinel luôn phải là số lẻ (3, 5, 7...).

2. Chuẩn bị File Cấu hình Sentinel

Tạo một thư mục dự án tên là redis-cluster. Bên trong, tạo một file tên là sentinel.conf. Đây là "bộ luật" dành cho những kẻ gác đền:

port 26379
dir /tmp
# Khai báo cụm cần theo dõi: Tên cụm là 'mymaster', IP của master, port, và Quorum là 2 (cần 2 phiếu để đồng thuận)
sentinel monitor mymaster redis-master 6379 2

# Nếu Master không phản hồi trong 5000ms (5 giây), đánh dấu là đang bị lỗi
sentinel down-after-milliseconds mymaster 5000

# Chỉ cho phép 1 Replica đồng bộ dữ liệu với Master mới cùng một lúc để tránh nghẽn mạng
sentinel parallel-syncs mymaster 1

# Thời gian tối đa để hoàn thành quá trình chuyển đổi (10000ms = 10 giây)
sentinel failover-timeout mymaster 10000

(Lưu ý thực chiến: Trong quá trình chạy, bản thân Sentinel sẽ tự động sửa và ghi đè thêm thông tin vào file cấu hình này để theo dõi trạng thái các node. Do đó, chúng ta sẽ để Docker copy file này vào container thay vì dùng Volume Map Read-only).

3. Viết file docker-compose.yml

Tại cùng thư mục, bạn tạo file docker-compose.yml với nội dung sau. Chúng ta sẽ dùng image Redis gốc chuẩn xác nhất:

version: '3.8'

services:
  # --- CỤM REDIS DỮ LIỆU ---
  redis-master:
    image: redis:7.0-alpine
    container_name: redis-master
    ports:
      - "6379:6379"

  redis-replica-1:
    image: redis:7.0-alpine
    container_name: redis-replica-1
    # Báo cho node này biết nó là đệ tử của redis-master
    command: redis-server --replicaof redis-master 6379 
    depends_on:
      - redis-master

  redis-replica-2:
    image: redis:7.0-alpine
    container_name: redis-replica-2
    command: redis-server --replicaof redis-master 6379
    depends_on:
      - redis-master

  # --- CỤM SENTINEL (KẺ GÁC ĐỀN) ---
  sentinel-1:
    image: redis:7.0-alpine
    container_name: sentinel-1
    # Copy cấu hình và chạy với cờ --sentinel
    command: >
      sh -c "cp /config/sentinel.conf /etc/redis/sentinel.conf && 
             redis-sentinel /etc/redis/sentinel.conf"
    volumes:
      - ./sentinel.conf:/config/sentinel.conf
    depends_on:
      - redis-master
      - redis-replica-1
      - redis-replica-2

  sentinel-2:
    image: redis:7.0-alpine
    container_name: sentinel-2
    command: >
      sh -c "cp /config/sentinel.conf /etc/redis/sentinel.conf && 
             redis-sentinel /etc/redis/sentinel.conf"
    volumes:
      - ./sentinel.conf:/config/sentinel.conf
    depends_on:
      - redis-master

  sentinel-3:
    image: redis:7.0-alpine
    container_name: sentinel-3
    command: >
      sh -c "cp /config/sentinel.conf /etc/redis/sentinel.conf && 
             redis-sentinel /etc/redis/sentinel.conf"
    volumes:
      - ./sentinel.conf:/config/sentinel.conf
    depends_on:
      - redis-master

4. Khởi chạy và Kiểm tra "Trận đồ"

Mở Terminal tại thư mục dự án và gõ lệnh kích hoạt:

docker-compose up -d

Để chắc chắn cụm Sentinel đã nhận diện nhau và nhận diện được Master, bạn hãy chui vào bụng con sentinel-1 để hỏi thăm:

docker exec -it sentinel-1 redis-cli -p 26379

Khi dấu nhắc lệnh hiện ra, gõ:

127.0.0.1:26379> SENTINEL master mymaster

Bạn sẽ thấy một danh sách dài các thông số, hãy để ý dòng num-slaves phải là 2 và num-other-sentinels phải là 2. Nếu đúng như vậy, hệ thống đã liên kết thành công! Gõ exit để thoát.

5. Bài Test Tử thần: Giả lập Sự cố (Chaos Engineering)

Bây giờ là lúc chứng minh sức mạnh của Sentinel. Chúng ta sẽ "rút ống thở" của con Master hiện tại để xem hệ thống có tự động cứu hộ không.

Gõ lệnh tắt ngang Master:

docker stop redis-master

Ngay lập tức, hãy xem log của một con Sentinel:

docker logs -f sentinel-1

Bạn sẽ thấy một loạt các dòng log nhảy lên với tốc độ chóng mặt. Hãy chú ý những keyword sau:


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí