Node.js 클러스터(Cluster)는 싱글 스레드인 Node.js에서 멀티코어 CPU를 활용하기 위해 여러 워커 프로세스를 생성하는 모듈이다. 마스터 프로세스가 워커들을 관리하고 소켓 연결을 분배한다.
클러스터 모듈 기본
javascript
// cluster-server.js
const cluster = require('cluster');
const http = require('http');
const os = require('os');
const numCPUs = os.cpus().length;
if (cluster.isPrimary) {
console.log(`마스터 프로세스 ${process.pid} 시작`);
// CPU 수만큼 워커 생성
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
// 워커 종료 시 재시작
cluster.on('exit', (worker, code, signal) => {
console.log(`워커 ${worker.process.pid} 종료 (코드: ${code})`);
cluster.fork(); // 재시작
});
// 워커 간 메시지 브로드캐스트
cluster.on('message', (worker, message) => {
Object.values(cluster.workers).forEach(w => {
if (w !== worker) w.send(message);
});
});
} else {
// 워커 프로세스: HTTP 서버 실행
http.createServer((req, res) => {
res.writeHead(200);
res.end(`워커 ${process.pid}가 응답`);
}).listen(3000);
console.log(`워커 ${process.pid} 시작`);
}
PM2로 클러스터 관리
javascript
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-app',
script: 'server.js',
instances: 'max', // CPU 수만큼
exec_mode: 'cluster', // 클러스터 모드
watch: false,
env: {
NODE_ENV: 'production',
PORT: 3000,
},
// 재시작 정책
max_memory_restart: '1G',
restart_delay: 1000,
}],
};
bash
pm2 start ecosystem.config.js
pm2 scale my-app 4 # 인스턴스 수 조정
pm2 reload my-app # 무중단 재시작 (순차적)
pm2 monit # 실시간 모니터링
Cluster vs Worker Threads
| 항목 | Cluster | Worker Threads |
|---|
| 격리 수준 | 별도 프로세스 | 스레드 |
| 메모리 공유 | 없음 (IPC) | SharedArrayBuffer |
| 용도 | I/O 병렬화, 무중단 배포 | CPU 집약적 계산 |
| 충돌 격리 | 완전 격리 | 프로세스 공유 |
관련 개념