← Về danh sách bài họcBài 10/20
🔗 Bài 10: Clustering & High Availability
🎯 Sau bài học này, bạn sẽ:
- Dựng RabbitMQ Cluster với Docker
- Hiểu Quorum Queues vs Classic Mirrored Queues
- Cấu hình Load Balancing với HAProxy
- Best practices cho production HA
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
• 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
• 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
- Cluster: Nhiều nodes chia sẻ metadata, cần same Erlang cookie
- Quorum Queue: Raft consensus, tự replicate, khuyến nghị cho HA
- HAProxy: Load balance connections giữa nodes
- Production: Tối thiểu 3 nodes, monitoring, memory/disk limits