확장된 미러 서버에서 cron 실행(cron 로직 필요) [닫기]

확장된 미러 서버에서 cron 실행(cron 로직 필요) [닫기]

Rackspace에서 실행 중인 클라이언트가 있고 완전히 동기화된 세 개의 서버가 있습니다. wget을 사용하여 crontab에 여러 cron을 추가하고 wget을 사용하여 cron의 URL(각 서버에 동기화됨)을 가져왔습니다. 클라이언트의 도메인에 액세스하면 로드 밸런서가 서비스를 제공합니다.

하나의 특정 서버(web01)에서 크론을 한 번만 실행하고 싶습니다.

문제는 각 서버가 crontab을 실행할 때 각 서버가 x3을 실행한다는 것입니다. 그래서 PHP에서 호스트 이름이 web01이 아닌 다른 이름인지 확인했지만 WGET을 사용하고 있고 로드 밸런서를 통해 실행 중이기 때문에 LB는 web01에 두 개의 요청을 보내고 다른 하나는 web01에 두 개의 요청을 보내는 것으로 나타났습니다. web02 또는 web03으로 이동합니다.

나는 이 작업을 crontab에서 완전히 수행해야 한다고 생각합니다. 현재 서버가 web01인지 확인하고 IF 문 내에서 크론 작업을 실행하고 그렇지 않으면 아무것도 하지 않지만 IF 문으로 이를 표현하는 가장 좋은 방법은 확실하지 않습니다. .

답변1

구성이 거의 동일한 세 대의 서버가 있는데 cron그 중 하나만 작업을 실행하고 싶습니까?

서버 명명 체계( web01, web02및 ) 를 따르겠습니다 web03. 쉘 스크립트를 사용하고 있지만 원리는 PHP와 똑같습니다. (나는 PHP를 마음대로 사용할 수 있지만 공개적으로 작성할 만큼 능숙하지는 않다고 생각합니다.)

각 스크립트의 상단 근처에서 cron다음과 같은 작업을 수행할 수 있습니다. 그러면 서버 이름이 가 아닌 경우 스크립트가 종료됩니다 web01.

[ web01 != "$(hostname)" ] && exit

이는 서버 중단 시 복원력이 그다지 좋지 않습니다. 죽으면 web01다른 서버를 대신할 수도 있습니다 cron. DNS에 액세스할 수 있다고 가정하면 Responsible에 대한 샘플 항목을 실행할 수 있습니다 cron. 이는 다른 시스템에서도 비슷합니다 .bind

cron.contoso.com 300 IN CNAME web01.contoso.com

그런 다음 OR를 사용하여 서버 이름을 별칭과 비교할 수 있으며 5분(300초) 이내에 책임을 다른 서버로 바꿀 dig수 있습니다 .nslookupcron

myaddr="$(nslookup "$(hostname)" | awk '$1=="Address:"{a=$2} END{print a}')"
cronaddr="$(nslookup "$(hostname)" | awk '$1=="Address:"{a=$2} END{print a}')"
[ "$myaddr" != "$cronaddr" ] && exit

또는:

myaddr="$(dig +short "$(hostname).contoso.com")"
cronaddr="$(dig +short cron.contoso.com)"
[ "$myaddr" != "$cronaddr" ] && exit

관련 정보