ビジネスの背景:
Web には定期的に実行する必要があるビジネスがよくありますが、クラスター環境では、複数のサーバーでスケジュールされたタスクが同時に開始されると、データベースがハングします。スケジュールされた 1 つのタスクがデータベースにアクセスする必要があります。
この問題を解決する方法:
1. マルチサーバー クラスターでは、ディレクトリがマウントされます。スケジュールされたタスクを保存するサーバーは 1 つだけです。マウントするときに、スケジュールされたタスクの構成ファイルを除外し、1 つのサーバーのみがスケジュールされたタスクを有効にできるようにします。
2. スケジュールされたタスクを実行するために別のサーバーをデプロイします
3. Linux スクリプトを使用してクラスターサーバーのページまたはアクションにアクセスします リクエストを受信し、スケジュールされたタスクを実行するサーバーが必要です。
ここでお話したいのは 3 番目の方法です。欠点は、アクセスされるサーバーのページまたはアクションがセキュリティ制限を受ける必要があることです。
まず、Linux のスケジュールされたタスクを設定します:
vi /etc/crondtab
<p class="sycode"> <p class="sycode"> 0 1 * * * root /dbdata/backup/cms/async.sh </p> </p>
次に、async.sh で、リクエストが失敗した場合に電子メールアラームを送信します:
<p class="sycode"> <p class="sycode"> #!/bin/bash </p> <p class="sycode"> Dir="/home/webtrn/CrontabDir" </p> <p class="sycode"> echo `date +"%Y-%m-%d-%H-%M"` >> $Dir/checklearntime.log </p> <p class="sycode"> wget -t1 http://www.baidu.com/checkserver/XXX.jsp -o $Dir/wgetchecklearntime.log </p> <p class="sycode"> grep -q "404" $Dir/wgetchecklearntime.log || grep -q "302" $Dir/wgetchecklearntime.log </p> <p class="sycode"> if [ $? != 0 ]; then </p> <p class="sycode"> echo "checklearntime have done" >> $Dir/checklearntime.log </p> <p class="sycode"> else </p> <p class="sycode"> echo "checklearntime is error" >> $Dir/checklearntime.log </p> <p class="sycode"> echo "checklearntime is error" | mail -s "webtrn" zhugaojian@whaty.com </p> <p class="sycode"> echo "checklearntime is error" | mail -s "webtrn" jinqingwen@whaty.com </p> <p class="sycode"> fi </p> <p class="sycode"> rm -f XXX.jsp </p> <p class="sycode"> rm -f $Dir/wgetchecklearntime.log </p> </p>