← Về danh sách bài họcBài 10/20

🔗 Bài 10: Clustering & High Availability

⏱️ Thời gian đọc: 22 phút | 📚 Độ khó: Nâng cao

🎯 Sau bài học này, bạn sẽ:

1. RabbitMQ Cluster

┌──────────────────────────────────────────┐
│           RabbitMQ Cluster                │
│                                          │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  Node 1  │──│  Node 2  │──│  Node 3  ││
│  │ (disc)   │  │ (disc)   │  │ (ram)    ││
│  └──────────┘  └──────────┘  └──────────┘│
│                                          │
│  Shared: Exchanges, Bindings, Users      │
│  NOT shared: Queue data (trừ khi mirror) │
└──────────────────────────────────────────┘

2. Docker Compose Cluster

# docker-compose-cluster.yml
version: '3.8'
services:
  rabbitmq-1:
    image: rabbitmq:3-management
    hostname: rabbitmq-1
    environment:
      RABBITMQ_ERLANG_COOKIE: 'secret_cookie_12345'
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: secret123
    ports:
      - "5672:5672"
      - "15672:15672"

  rabbitmq-2:
    image: rabbitmq:3-management
    hostname: rabbitmq-2
    environment:
      RABBITMQ_ERLANG_COOKIE: 'secret_cookie_12345'
    depends_on:
      - rabbitmq-1

  rabbitmq-3:
    image: rabbitmq:3-management
    hostname: rabbitmq-3
    environment:
      RABBITMQ_ERLANG_COOKIE: 'secret_cookie_12345'
    depends_on:
      - rabbitmq-1
# Join nodes vào cluster
docker exec rabbitmq-2 rabbitmqctl stop_app
docker exec rabbitmq-2 rabbitmqctl reset
docker exec rabbitmq-2 rabbitmqctl join_cluster rabbit@rabbitmq-1
docker exec rabbitmq-2 rabbitmqctl start_app

docker exec rabbitmq-3 rabbitmqctl stop_app
docker exec rabbitmq-3 rabbitmqctl reset
docker exec rabbitmq-3 rabbitmqctl join_cluster rabbit@rabbitmq-1
docker exec rabbitmq-3 rabbitmqctl start_app

# Kiểm tra cluster
docker exec rabbitmq-1 rabbitmqctl cluster_status
⚠️ ERLANG_COOKIE phải giống nhau trên tất cả nodes! Cookie này dùng để authenticate giữa các nodes.

3. Quorum Queues (Khuyến nghị)

Quorum Queues sử dụng Raft consensus protocol — data tự động replicate trên majority of nodes. Đây là cách HA được khuyến nghị từ RabbitMQ 3.8+.

// Tạo Quorum Queue
await ch.assertQueue('orders', {
    durable: true,
    arguments: {
        'x-queue-type': 'quorum',
        'x-quorum-initial-group-size': 3  // Replicate trên 3 nodes
    }
});

// Sử dụng giống classic queue
ch.sendToQueue('orders', Buffer.from('...'), { persistent: true });
ch.consume('orders', handler);
💡 Quorum Queue vs Classic Mirrored:
Quorum: Raft consensus, tốt hơn cho data safety, khuyến nghị mới
Classic Mirrored: Đã deprecated từ RabbitMQ 3.13
• Quorum queues LUÔN durable, không hỗ trợ TTL per-message

4. Load Balancing với HAProxy

# haproxy.cfg
frontend rabbitmq_front
    bind *:5672
    default_backend rabbitmq_back

backend rabbitmq_back
    balance roundrobin
    server rabbit1 rabbitmq-1:5672 check
    server rabbit2 rabbitmq-2:5672 check
    server rabbit3 rabbitmq-3:5672 check

frontend rabbitmq_mgmt_front
    bind *:15672
    default_backend rabbitmq_mgmt_back

backend rabbitmq_mgmt_back
    balance roundrobin
    server rabbit1 rabbitmq-1:15672 check
    server rabbit2 rabbitmq-2:15672 check
    server rabbit3 rabbitmq-3:15672 check

5. Production Best Practices

📌 Checklist HA Production:
• Cluster tối thiểu 3 nodes (odd number)
• Dùng Quorum Queues cho critical data
HAProxy / Nginx cho load balancing
Memory alarm: set vm_memory_high_watermark = 0.6
Disk alarm: set disk_free_limit = 2GB
Connection pooling ở application level
Monitoring với Prometheus + Grafana

📝 Tóm Tắt