Skip to content

Cluster Management

Tổng quan

Cluster là nhóm các cache nodes làm việc cùng nhau. ClusterManager xử lý vòng đời node, theo dõi sức khỏe, và failover tự động.

┌─────────────────────────────────────────┐
│           ClusterManager                │
│  ┌─────┐  ┌─────┐  ┌─────┐           │
│  │Node0│  │Node1│  │Node2│           │
│  │ ✅  │  │ ✅  │  │ ❌  │ ← failed  │
│  └─────┘  └─────┘  └─────┘           │
│       ↓         ↓         ↓            │
│    primary   backup   (removed)        │
└─────────────────────────────────────────┘

Singleton Pattern

ClusterManager là singleton — chỉ có 1 instance per application:

typescript
import { ClusterManager } from "distributed-cache";

const cluster = ClusterManager.getInstance();

// Thêm nodes
cluster.addNode(new CacheNode("node-0", { maxSize: 10000 }));
cluster.addNode(new CacheNode("node-1", { maxSize: 10000 }));
cluster.addNode(new CacheNode("node-2", { maxSize: 10000 }));

Theo dõi sức khỏe

Bật heartbeat để phát hiện node bị lỗi:

typescript
// Kiểm tra mỗi 5 giây, đánh dấu unhealthy sau 3 lần miss heartbeat
cluster.startHeartbeat(5000, 3);

// Callback khi node gặp sự cố
cluster.setOnNodeFailed((nodeId) => {
  console.log(`Node ${nodeId} gặp sự cố!`);
  // Tùy chọn: promote backup lên primary
});

Thao tác với Node

typescript
// Lấy node cho một key (qua consistent hashing)
const node = cluster.getNode("user:123");

// Lấy node cụ thể theo ID
const specific = cluster.getNodeById("node-0");

// Lấy tất cả healthy nodes
const healthy = cluster.getHealthyNodes();

// Lấy/đặt primary node
cluster.setPrimary(node0);
const primary = cluster.getPrimary();

// Đánh dấu trạng thái sức khỏe
cluster.markUnhealthy("node-0");
cluster.markHealthy("node-0");

// Xóa node bị lỗi
cluster.removeNode("node-0");

Cluster Flush

Xóa tất cả nodes cùng lúc:

typescript
const freed = cluster.flushAll();
console.log(`Đã giải phóng ${(freed / 1024 / 1024).toFixed(2)} MB`);

Thống kê

typescript
const stats = cluster.getStats();
console.log(stats);
// {
//   totalNodes: 3,
//   healthyNodes: 2,
//   unhealthyNodes: 1,
//   primary: "node-0",
//   totalKeys: 15000
// }

Leader Election

Khi primary node gặp sự cố, cluster elect leader mới:

1. Primary node ngừng phản hồi heartbeat
2. ClusterManager đánh dấu unhealthy
3. Healthy node tiếp theo trở thành primary
4. Clients redirect sang primary mới

Thực hành tốt nhất

Thực hànhTại sao
Luôn thiết lập heartbeatPhát hiện sự cố nhanh
Dùng callback setOnNodeFailedPhản ứng real-time với sự cố
Theo dõi cluster statsTheo dõi sức khỏe theo thời gian
Đặt timeout phù hợpQuá ngắn = false positives, quá dài = phát hiện chậm

Released under the MIT License.