2012-07-25 4 views
7

제 상황은 현재 WebSocket 수신기가있는 서버 측에서 Node.js를 사용하는 온라인 응용 프로그램을 작성하고 있다는 것입니다. 우리는 두 개의 다른 부분을 가지고 있습니다 : 하나는 페이지를 제공하고 node.js를 사용하고 + ejs를 표현하고, 다른 하나는 웹 소켓 용 socket.io 라이브러리 만 포함하는 완전히 다른 응용 프로그램입니다. 그래서 여기 웹 소켓 부분의 확장 성 문제가 있습니다.웹 소켓을위한 쿠키 기반로드 균형 조정?

우리가 발견 한 한 가지 해결책은 서버간에 redis와 소켓 정보를 공유하는 것이지만, 아키텍처 때문에 다른 많은 정보를 공유해야하기 때문에 서버에 막대한 오버 헤드가 발생합니다.

이 소개 이후, 제 질문은 - 웹 기반의 쿠키 기반로드 밸런싱을 사용할 수 있습니까? 따라서 cookie server = server1을 가진 사용자의 모든 연결은 항상 server1로 전달되며 cookie server = server2를 가진 모든 연결은 server2와 연결되며 해당 쿠키가없는 연결은 가장 바쁜 서버보다 적을 것입니다.

업데이트 : 하나의 '답변'이 말하듯이 - 예, 이것이 존재한다는 것을 알고 있습니다. 그 이름이 끈끈한 세션이라는 것을 기억하지 못했습니다. 그러나 질문은 - 그것이 웹 소켓에서 작동 할 것인가? 가능한 합병증이 있습니까?

+0

이것은 매우 흥미가있는 질문입니다. 브라우저에서 들어오는 연결의로드 밸런싱 문제 (서버 중 하나를 누르고 서버와 연결될 것입니다. 백엔드에서 실제로 서버에 어떻게 밀어 넣을지에 관심이 많습니다. 마찬가지로, 나는 실제 작업을 수행하는 백엔드 서버를 가지고 있으며 소켓을 통해 웹 소켓 서버에 메시지를 푸시합니다. 클러스터가 있으면 밀어 넣을 서버를 어떻게 알 수 있습니까? 현재의 생각은 열려있는 모든 연결 목록을 중앙 DB의 어딘가에 보관하는 것입니다. 이것이 최선의 방법인지는 확실하지 않습니다. – KOHb

+0

@KOHb 소켓 서버 뒤에 추가 백엔드가 없습니다. 제 경우에는 훨씬 더 간단합니다. 그러나 당신이 말하고자하는 바는이 목적을 위해 Redis 서버를 사용하려고 노력할 것입니다. – AlexKey

답변

5

Node.js 프로덕션 스택에도 비슷한 문제가있었습니다. 우리는 정상적인 사용을 위해 작동하는 WebSocket을 사용하는 두 대의 서버를 가지고 있지만 때로는로드 밸런서가 문제를 일으킬 수있는 두 서버 사이의 연결을 바운스하는 경우가 있습니다. (백엔드에서 세션 코드를 수정해야했지만 제대로 처리하지 못했습니다.)

이러한 서버 앞에있는 바라쿠다로드 밸런서에서 고정 세션을 사용하려고 시도했지만 WebSocket을 차단할 수있는 것으로 나타났습니다 교통 방법에 따른 교통. 필자는 온라인에서 사용할 수있는 정보가 거의없는 이유를 정확히 조사하지는 않았지만, 이는 분산 장치가 HTTP 요청에 대한 헤더를 제거하고 쿠키를 포착하여 요청을 올바른 백엔드 서버에 전달하는 것으로 나타납니다. WebSockets은 HTTP로 시작하지만 업그레이드 이후로드 밸런서는 연결의 차이를 인식하지 못하고 동일한 HTTP 처리를 시도합니다. 이로 인해 WebSocket 연결이 실패하고 사용자 연결이 끊어집니다.

다음은 현재 잘 수행되고있는 작업입니다. 우리는 여전히 백엔드 서버 앞에서 Barracuda로드 밸런서를 사용하지만로드 밸런서에서 스티키 세션을 활성화하지는 않습니다. 백엔드 서버에서 우리 애플리케이션 서버 앞에는 HAProxy가 있습니다. HAProxy는 WebSockets를 제대로 지원하며, 끈적 세션 (Sticky Sessions)을 '원형'방식으로 제공 할 수 있습니다.


요청 흐름 목록

  1. 들어오는 클라이언트 요청은
  2. HAProxy가에 대한 요청 및 검사를 받아 활성 백엔드 서버 중 하나에 차 바라쿠다로드 밸런서에게
  3. 로드 밸런서 전달 안타 새로운 '끈적 쿠키'
  4. 쿠키를 기반으로 HAProxy가 올바른 백엔드 응용 프로그램 서버로 전달합니다

요청 흐름도

WebSocket Request /--> Barracuda 1 -->\ /--> Host 1 -->\ /--> App 1 
------------------->      -->    --> 
        \--> Barracuda 2 -->/ \--> Host 2 -->/ \--> App 1 

화살표 다시 흐름 어느 지점에 흐를 수 요청을 의미 한 요청에 온다.


HAProxy 구성 상세 상기 구성에서

backend app_1 
    cookie ha_app_1 insert 
    server host1 10.0.0.101:80011 weight 1 maxconn 1024 cookie host_1 check 
    server host2 10.0.0.102:80011 weight 1 maxconn 1024 cookie host_2 check 

:

  • cookie ha_app_1 insert 실제 쿠키 이름
  • cookie host_1 check 또는 cookie host_2 check 사용되고 쿠키 값을 설정
  • ,
+0

이 답변을 주셔서 감사합니다. 하지만 불행하게도 소켓 연결을 위해 끈끈한 세션을 많이 사용해야합니다. 파이프를 프록시 처리하거나 리디렉션합니까? – AlexKey

+0

WebSocket 프로토콜의 결과로 우리는 다음 해결책을 고수하기로 결정했습니다. - 프록시 세션이 아닌 고정 세션에서 핸드 셰이크 단계의로드 밸런싱 소켓 연결 (핸드 셰이크가 HTTP이므로 괜찮습니다)을 리디렉션합니다. - 상태 변경 - 강제로 다시 연결하여 클라이언트가 다시 핸드 셰이크를 통해 적절한 서버에로드 밸런싱 됨 - 서버가 하위 도메인 네트워크 내에 노출됨 (s1-socket.example.com, s2-socket.example.com 등의 smth) 아직 구현이 이루어지지 않았습니다. 일단 우리가 그것을 갖게되면 나는 당신을 업데이트 할 것입니다. – AlexKey

+0

첫 번째 의견 : 여전히 끈적 세션을 사용해야합니다. 위의 대답은 끈끈한 세션 구현 방식으로,로드 밸런서의 끈끈한 세션 사용을 우회했습니다. 두 번째 메모 : 이는 당신에게 적합한 시나리오 인 것 같습니다. 하드웨어 부하 분산 장치가 사용되지는 않지만 여전히 우리 시스템과 매우 유사합니다.우리는 필요한 기능을 제공하는 유일한 부하 분산 장치로 HAProxy를 사용합니다. –