최소한의 가동 중지 시간으로 TCP 청취 소켓을 핸드 오버하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2206951

문제

이 질문은 태그가 붙은 EventMachine이지만 모든 언어의 일반 BSD 소켓 솔루션도 대단히 감사합니다.


일부 배경 :

TCP 소켓에서 응용 프로그램을 듣고 있습니다. 정기적 인 System V Style Init 스크립트로 시작하여 종료됩니다.

내 문제는 TCP 소켓을 서비스 할 준비가되기 전에 시작하는 데 시간이 필요하다는 것입니다. 너무 길지는 않지만 5 초 밖에 걸리지 않지만 근무 시간 동안 재시작을 수행 해야하는 경우 5 초가 걸립니다. 또한 기존 연결이 열려 있고 정상적으로 완료되는 것이 중요합니다.

응용 프로그램을 다시 시작하는 이유는 패치, 업그레이드 등입니다. 불행히도 나는 가끔씩 생산에서 이런 종류의 일을해야한다는 입장에서 나 자신을 발견했다.


질문:

나는 한 프로세스에서 다른 프로세스에서 다른 프로세스로 TCP 청취 소켓을 깔끔한 손으로 수행 할 수있는 방법을 찾고 있으며 결과적으로 다운 타임의 1 초 밖에 걸리지 않습니다. 기존 연결 / 소켓이 기존 프로세스에서 열린 상태로 유지되고 완료되기를 원하지만 새로운 프로세스는 새로운 Connectinos에 서비스를 시작합니다.

BSD-Socket을 사용 하여이 작업을 수행하는 입증 된 방법이 있습니까? (Eventmachine 솔루션의 보너스 포인트.)

내가 그대로 사용할 수 있거나 참조로 사용할 수있는 오픈 소스 라이브러리가있을 수 있습니까? (다시, 비-루비 및 비 이벤트 마카인 솔루션도 높이 평가됩니다!)

도움이 되었습니까?

해결책

다운 타임없이 서버 프로그램을 적절히 수정하여이를 수행하는 몇 가지 방법이 있습니다.

하나는 예를 들어 특정 신호 또는 기타 메시지를 받으면 서버 자체에서 다시 시작 기능을 구현하는 것입니다. 그런 다음 프로그램은 새 버전을 실행하여 청취 소켓의 파일 디스크립터 번호를 인수로 전달합니다. 이 소켓에는 FD_CLOEXEC 상속받을 수 있도록 플래그 클리어 (기본값). 다른 소켓은 원래 프로세스에 의해 계속 서비스되며 새로운 프로세스에 전달되지 않아야하므로, 깃발은 예를 들어 사용하는 사람들에게 설정해야합니다. fcntl(). 새로운 프로세스를 포킹하고 실행 한 후, 새로운 프로세스가 해당 소켓에서 듣고 있기 때문에 원래 프로세스는 서비스 중단없이 청취 소켓을 닫을 수 있습니다.

대체 방법, 이전 서버가 새 서버 자체를 포크하고 실행 해야하는 경우 유닉스 도메인 소켓 기존 서버 프로세스와 새로운 서버 프로세스간에 통신합니다. 새로운 서버 프로세스는 파일 시스템이 시작될 때 잘 알려진 위치에서 이러한 소켓을 확인할 수 있습니다. 존재하는 경우 새 서버는이 소켓에 연결되어 이전 서버가 SCM_RIGHTS를 사용하여 청취 소켓을 보조 데이터로 전송하도록 요청합니다. 이것의 예는 CMSG (3).

다른 팁

Jean-Paul Calderone은 a 자세한 프레젠테이션 2004 년 소켓 마이그레이션 및 기타 문제를 포함하여 Twisted를 사용한 문제에 대한 전체적인 솔루션에 대한.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top