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つだけを実行したいですか?
サーバー命名方式(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
ができます。nslookup
cron
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