문제

올바른 순서로 시작하는 데 필요한 몇 개의 서버와 기타 데몬이 있습니다.

뼈대 스크립트에서 init.d 스크립트를 생성했으며 번호가 지정된 명명 시스템을 사용하여 적절한 순서로 시작하도록 설치할 수 있지만 몇 가지 문제가 남아 있습니다.

한 서버('serverA')는 데이터베이스 연결을 초기화한 다음 소켓을 수신해야 합니다.그런 다음 다른 서버('serverB')가 해당 소켓에 연결해야 하며, 이전 프로세스가 아직 수신 대기 중이 아니면 연결이 실패합니다.serverA가 수신을 시작할 때까지 serverA의 init.d 스크립트가 종료되지 않도록 하는 방법이 있습니까?serverB init는 serverA init가 종료될 때까지 시작되지 않습니다.

현재로서는 serverB가 성공할 때까지 연결을 재시도하도록 하여 설정이 작동하지만 이 접근 방식은 취약해 보입니다.시퀀싱을 강제하는 방법에 대해 좀 더 결정론적으로 이해하고 싶습니다.

도움이 되었습니까?

해결책

예, 이것은 제가 답변하고 있는 질문입니다. 하지만 이 기술이 유용하다고 생각하여 유사한 문제로 어려움을 겪고 있는 다른 사람들을 위해 공유하고 있습니다.

나는 소켓이나 포트를 기다리는 데 socat이 매우 유용하다는 것을 알았습니다.다음과 같은 init.d 스크립트:

case “$1″ in
  start)
  echo '--benign phrase' | socat - UNIX-CONNECT:/path/to/socket,retry=10,intervall=1
;;

소켓이 쓰기 가능해질 때까지 기다렸다가 반환합니다.관련된 데몬화가 없으므로 완료될 때까지 더 높은 번호의 init.d 스크립트 실행을 차단합니다.

이러한 웨이터 스크립트를 사용하면 부팅 순서가 느려지므로 최적이 아니지만 스크립트에 'sleep n' 문을 뿌리는 매우 취약한 접근 방식에서 크게 개선됩니다.

다른 팁

나는 그것이 깨지기 쉽다고 생각하지 않습니다. 적어도 시나리오는 깨지기 쉬운 곳을 생각할 수 있습니다. 재 시도 시간은 5 초이며 전혀 나쁘지 않습니다. 키스 접근 방식과 이해하지 못하는 코너 케이스는 없습니다.

분산 환경을 동기화하는 것은 희미한 마음이 아니며 예를 들어 과잉이 아닙니다.

귀하의 접근 방식에 대한 확신을주기 위해 웹 농장에 배포 된 수십 개의 손으로 작성된 복잡한 서버 프로세스가 있다고 말할 수 있습니다. 데이터베이스 서버가 사라 졌을 때 또는 네트워크 트렁크가 사라 졌을 때도 슬픔을주지 않았습니다. 다운 등. 데이터베이스가 다시 올 때까지 단순히 저하 된 모드로 계속 실행됩니다.

서버가 도메인 소켓에서 리스닝되면 소켓에 대한 폴링 루프를 구축 할 수 있습니다. Bash에서 더 쉬운 방법이있을 수 있지만 다음과 같은 것처럼 보일 수 있습니다.

for i in 1 2 3 4 5; do
  if [ -e '/var/run/myserver.sock' ]; then
    break
  fi
done

또 다른 솔루션은 서버가 청취 소켓을 열 때까지 데모니 화되지 않도록하는 것입니다. 이렇게하면 INIT 스크립트가 프로세스가 데려 날 때까지 일시 중지되어 소켓을 사용할 수 있습니다.

물론 이것은 다른 수단보다는 응용 프로그램 자체를 수행하는 응용 프로그램에 달려 있습니다. ( "/usr/bin/myserver &"등.)

업데이트 :

또한, 지금하고있는 것은 모든 System-V 스타일의 초기입니다. 우분투는 실제로 일련의 스크립트가 아닌 이벤트 기반 시스템 인 신생 기반을 사용합니다. System-V Init 스크립트 대신 신생 작업을 사용하고 서버에서 사용자 정의 신생 이벤트를 발사하여 두 번째 서버의 시작을 트리거 할 수 있습니다.

그만큼 시작 가이드 바닥에 이것의 예가 있습니다. API 방법이 있는지는 모르겠지만 "시스템 ("/bin/initctl이 myevent를 방출 ")의 문제 일 수 있습니다. 첫 번째 서버에서 올바른 시점에서. 더 많은 신생 경험을 가진 다른 사람은 더 잘 정교하게/더 자세히 설명 할 수 있습니다.

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