拡張ミラーサーバーでcronを実行する(cronロジックが必要)[閉じる]

拡張ミラーサーバーでcronを実行する(cronロジックが必要)[閉じる]

Rackspaceで実行されているクライアントがあり、完全に同期された3つのサーバーがあります。 wgetを使用してcrontabに複数のcronを追加し、wgetを使用してcronのURL(各サーバーに同期)を取得しました。クライアントのドメインにアクセスすると、ロードバランサーはサービスを提供します。

ある特定のサーバー(web01)でクローンを一度だけ実行したいです。

問題は、各サーバーがcrontabを実行すると、各サーバーがx3を実行することです。そのため、PHPはホスト名がweb01以外の名前であることを確認しましたが、WGETを使用していてロードバランサーを介して実行されているため、LBはweb01に2つの要求を送信し、もう1つはweb01に2つの要求を送信することを示しました。 web02またはweb03に移動します。

私はこれをcrontabで完全に実行する必要があると思います。現在サーバーがweb01であることを確認し、IFステートメント内でクローン操作を実行し、そうでなければ何もしませんが、IFステートメントでこれを表現する最善の方法はわかりません。 。

答え1

構成がほぼ同じ3台のサーバーがありますが、cronそのうちの1つだけを実行したいですか?

サーバー命名方式(web01web02および)に従います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

関連情報