2013-03-19 6 views
19

서버가 포함 된 Node.js가 포함 된 프로젝트에서 작업 중입니다. (단순함을 위해이 서버를 특정 클라이언트의 메시지를 다른 클라이언트로 전달해야하는 채팅 서버로 상상해보십시오) . 나는이 서버가 항상 도달 할 수있는 QoS상의 이유로 클러스터링을 사용하여 다른 서버 (다른 물리적 시스템)간에 균형로드를 나누고 서버가 다운되면 다른 서버가 요청을 처리 할 준비가되었는지 확인해야한다고 생각했습니다. .Node.js 다중 서버 클러스터링

제 질문은 Node.js에서 이런 종류의 분산 된 접근이 가능합니까?

"클러스터"모듈에 대해 이미 읽었지만, 내가 이해 한 바에 따르면, 동일한 컴퓨터의 다중 프로세서에서만 확장되는 것처럼 보입니다.

+0

더 자세히 태그를 지정하십시오. 이것은 [태그 : 클러스터 분석] (일명 : 클러스터링, 데이터 마이닝 기술)이 아니 었습니다. –

+0

MongoDB에서 샤딩을보세요 - https://docs.mongodb.com/manual/sharding/ 위치별로 또는 다른 속성, 시간대, 소셜 그룹 또는 채팅방별로 샤드 할 수 있습니다. –

답변

29

예 가능합니다.

NodeJS의 속성이 아니라 응용 프로그램을 위해 설계 한 아키텍처로 사용자가 수행 할 수 있는지 여부를 결정합니다.

당신의 주된 문제는 항상 네 개의 채팅 서버 ABCD가 있고 네 대의 서버에서 연결을 분산시키는 LoadBalancer L이 있고 A가 작동을 멈추고 모든 A가 나머지 인스턴스와 연결되어 있다면 BC와 D에서 chatroom의 상태가 동일하게 유지되는 것을 어떻게 확인할 수 있습니까?

한 가지 방법은 응용 프로그램 코드를 완전히 무 상태로 유지하고 모든 데이터를 mongoDb 또는 Redis와 같은 메모리의 분산 데이터베이스로 푸시하는 것입니다. 데이터베이스 인스턴스 중 하나가 작동하지 않을 경우를 대비하여 데이터베이스를 배포하려고합니다.

이제 마지막 문제는 LoadBalancer입니다. 문제가 해결되면 전체 시스템이 다운됩니다.

짧은 이야기를 짧게 작성하려면; 네, 할 수는 있지만, 잠재적 인 실패 지점을 어디에서 결정해야합니까? 단일 실패 지점이 없으면 복잡하고 값 비싼 설정이 필요합니다.

+0

여러 서버간에 상태를 공유하는 다른 방법은 무엇입니까? Redis가 병목 현상이된다면 어떻게 될까요? –

+0

MongoDB에서 샤딩을보세요 - https://docs.mongodb.com/manual/sharding/ 위치별로 또는 다른 속성, 시간대, 소셜 그룹 또는 채팅방별로 파산 할 수 있습니다. –

5

내 권장 사항은 독립 클러스터를 사용하여 상태를 공유하는 것입니다. 즉, 서버가 서로 이야기하지 않고 대신 공통된 Redis 인스턴스/클러스터를 공유하고 일반적인 MongoDB 클러스터를 공유하는 API 클러스터가 있어야합니다. 이를 통해 세션, 변수를 공유 할 수 있으며 Redis의 pub/sub 기능을 활용하여 API 클러스터에서 험담을하지 않아도됩니다.

특히 채팅의 경우, Socket.IO의 Redis를 클라이언트로 사용하면 로비에 브로드 캐스트 할 때마다 로비 멤버가 여러 개 존재 함에도 불구하고 그 메시지를 해당 로비에 브로드 캐스트하기 위해 장면 뒤에서 redis를 사용합니다 서버. 또한 모든 서버가 소켓 재 연결을 관리 할 수 ​​있으므로 또 다른 수준의 내결함성이 생기며 socket.io는 Redis를 통해 상태를 유지하면서 연결이 끊어진 경우 API 클러스터에 자동으로 다시 연결됩니다.