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.