PM2를 사용하여 Node.js 프로세스를 관리했다면 PM2가 클러스터 모드를 지원한다는 사실을 눈치채셨을 것입니다. 이 모드를 사용하면 Node.js가 여러 프로세스를 생성할 수 있습니다. 클러스터 모드의 인스턴스 수를 최대로 설정하면 PM2는 서버에서 사용 가능한 CPU 코어에 해당하는 노드 프로세스 수를 자동으로 생성합니다.
PM2는 Node.js의 Cluster 모듈을 활용하여 이를 달성합니다. 이 모듈은 전통적으로 여러 CPU 코어를 활용하는 능력을 제한하는 Node.js의 단일 스레드 특성을 해결합니다. 그러면 클러스터 모듈은 내부적으로 어떻게 작동합니까? 프로세스는 어떻게 서로 통신합니까? 여러 프로세스가 동일한 포트에서 어떻게 수신 대기할 수 있습니까? 그리고 Node.js는 이러한 프로세스에 요청을 어떻게 배포합니까? 이 질문들이 궁금하다면 계속 읽어보세요.
Node.js 작업자 프로세스는 child_process.fork() 메서드를 사용하여 생성됩니다. 이는 하나의 상위 프로세스와 여러 개의 하위 프로세스가 있음을 의미합니다. 코드는 일반적으로 다음과 같습니다.
const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { for (let i = 0, n = os.cpus().length; i < n; i++) { cluster.fork(); } } else { // Start the application }
운영 체제를 공부한 적이 있다면 아마도 fork() 시스템 호출에 익숙할 것입니다. 호출 프로세스는 상위 프로세스이고 새로 생성된 프로세스는 하위 프로세스입니다. 이러한 하위 프로세스는 상위 프로세스와 동일한 데이터 세그먼트 및 스택을 공유하지만 물리적 메모리 공간이 반드시 공유되는 것은 아닙니다. Node.js 클러스터에서 master 프로세스는 포트에서 수신 대기하고 들어오는 요청을 worker 프로세스에 배포합니다. 여기에는 프로세스 간 통신(IPC), 로드 밸런싱 전략, 다중 프로세스 포트 수신 대기
라는 세 가지 핵심 주제를 다루는 작업이 포함됩니다.master 프로세스는 process.fork()를 사용하여 하위 프로세스를 생성합니다. 이러한 프로세스 간의 통신은 IPC 채널을 통해 처리됩니다. 운영 체제는 다음과 같은 프로세스 간 통신을 위한 여러 메커니즘을 제공합니다.
메시지 전달
메시지 송수신을 통해 주고받는 데이터를 처리합니다.
세마포어
세마포어는 시스템에서 할당한 상태 값입니다. 제어가 부족한 프로세스는 특정 체크포인트에서 강제로 정지되어 신호가 진행될 때까지 기다립니다. 이진 값(0 또는 1)으로 제한되는 경우 이 메커니즘을 "뮤텍스"(상호 배제 잠금)라고 합니다.
배관
파이프는 두 프로세스를 연결하여 한 프로세스의 출력이 다른 프로세스의 입력 역할을 할 수 있도록 합니다. 이는 파이프 시스템 호출을 사용하여 생성할 수 있습니다. | 쉘 스크립팅의 명령은 이 메커니즘의 일반적인 예입니다.
Node.js는 상위 프로세스와 하위 프로세스 간의 통신을 위해 이벤트 기반 메커니즘을 사용합니다. 다음은 TCP 서버 핸들을 하위 프로세스로 보내는 상위 프로세스의 예입니다.
const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { for (let i = 0, n = os.cpus().length; i < n; i++) { cluster.fork(); } } else { // Start the application }
앞서 언급했듯이 모든 요청은 마스터 프로세스에 의해 배포됩니다. 서버 로드가 작업자 프로세스 간에 균등하게 분산되도록 하려면 로드 밸런싱 전략이 필요합니다. Node.js는 기본적으로 라운드 로빈 알고리즘을 사용합니다.
라운드 로빈 방식은 Nginx에서도 사용하는 일반적인 로드 밸런싱 알고리즘입니다. 들어오는 요청을 각 프로세스에 순차적으로 배포하여 첫 번째 프로세스부터 시작하여 마지막 프로세스에 도달한 후 루프백하는 방식으로 작동합니다. 그러나 이 방법은 모든 프로세스에 걸쳐 동일한 처리 용량을 가정합니다. 요청 처리 시간이 크게 달라지는 시나리오에서는 로드 불균형이 발생할 수 있습니다.
이 문제를 해결하기 위해 Nginx는 서버에 서로 다른 가중치가 할당되는 WRR(Weighted Round-Robin)을 자주 사용합니다. 가중치가 0으로 줄어들 때까지 가중치가 가장 높은 서버가 선택되며, 이 시점에서 새로운 가중치 순서에 따라 주기가 다시 시작됩니다.
NODE_CLUSTER_SCHED_POLICY 환경 변수를 설정하거나 Cluster.setupMaster(옵션)를 통해 구성하여 Node.js에서 로드 밸런싱 전략을 조정할 수 있습니다. 다중 시스템 클러스터용 Nginx와 단일 시스템 다중 프로세스 밸런싱을 위한 Node.js 클러스터를 결합하는 것이 일반적인 접근 방식입니다.
Node.js의 초기 버전에서는 동일한 포트에서 수신 대기하는 여러 프로세스가 들어오는 연결을 놓고 경쟁하여 부하 분산이 고르지 않게 되었습니다. 이 문제는 나중에 라운드 로빈 전략으로 해결되었습니다. 현재 접근 방식은 다음과 같이 작동합니다.
기본적으로 마스터 프로세스는 포트에서 수신 대기하고 정의된 전략(예: 라운드 로빈)을 사용하여 작업자 프로세스에 대한 연결을 배포합니다. 이 디자인은 작업자 간의 경쟁을 제거하지만 마스터 프로세스의 안정성이 높아야 합니다.
PM2의 클러스터 모드를 진입점으로 사용하여 이 기사에서는 다중 프로세스 애플리케이션 구현을 위한 Node.js 클러스터 모듈의 핵심 원칙을 탐구했습니다. 우리는 프로세스 간 통신, 로드 밸런싱, 다중 프로세스 포트 수신이라는 세 가지 주요 측면에 중점을 두었습니다.
클러스터 모듈을 연구하면 많은 기본 원리와 알고리즘이 보편적이라는 것을 알 수 있습니다. 예를 들어, 라운드 로빈 알고리즘은 운영 체제 프로세스 스케줄링과 서버 로드 밸런싱 모두에 사용됩니다. 마스터-작업자 아키텍처는 Nginx의 다중 프로세스 설계와 유사합니다. 마찬가지로 세마포어 및 파이프와 같은 메커니즘은 다양한 프로그래밍 패러다임 어디에나 존재합니다.
새로운 기술이 지속적으로 등장하지만 그 기반은 일관되게 유지됩니다. 이러한 핵심 개념을 이해하면 자신 있게 새로운 과제를 추론하고 적응할 수 있습니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
무제한 프로젝트를 무료로 배포
탁월한 비용 효율성
간소화된 개발자 경험
손쉬운 확장성과 고성능
문서에서 더 자세히 알아보세요!
X에서 우리를 팔로우하세요: @LeapcellHQ
저희 블로그에서 읽어보세요
위 내용은 Node.js 클러스터 이해: 핵심 개념의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!