過去3週間にわたって、トラフィックの多いプロジェクトを実施しているため、ホスティングの作業が数回中断する必要がありました。短時間のダウンタイムでもサイトからのコール数に影響します。
同時に、標準ページの「サーバーが見つかりません」の代わりに、「サイトは一時的に利用できない、電話をかける、またはリクエストを残す」というテキストの付いたサイトのスタイルでスクリーンセーバーを掛けると、すべてがより良くなる可能性があります。
AmazonのDNSサービスを使用して、Aレコードをすばやく変更することが決定されました。
Amazon Route 53の説明
これは信頼できるDNSサービスであり、レコードの編集、追加、削除に非常に便利なAPIを備えています。
サービスのコストは、月額1ドル+最初の100万件のリクエストに対して0.50ドル、その後の100万件のリクエストごとに0.25ドルです。
場合によっては深刻な不便は支払い方法です-プラスチックカードでのみサービスの料金を支払うことができますが、たとえばqiwiから仮想Visaカードを使用する方法があります。
サービスの登録と支払いの後、IDとキーのペアを取得し、APIでの認証に使用します。
クッキングドメイン
APIを使用してドメインに接続し、必要なすべてのエントリを構成することはあまり便利ではありません。
Interstate53サービスの使用をお勧めします。
このサービスは、Route 53でアカウントを管理するためのインターフェースであり、その機能の全範囲を提供します。
以前と同様にすべてのレコードを入力します。AレコードはメインホスティングのIPアドレスに移動します。
ホスティングを選択してください
私の場合、バックアップサーバーは可能な限り安価で、次の機能セットを備えている必要があります。
- PHP-Route 53 APIを使用するため
- cron-メインホスティングの可用性を定期的にチェックします
- 静的HTML-スプラッシュ画面を表示します
選択肢はGinoにありました。これは、PHPを放棄せずにデータベースのサポートを拒否できる唯一のホスティングです。 価格は月に75ルーブルでした。
主なホスティングはclodoですが、それは問題ではありません。
メインホスティングを設定します
あらゆる条件でのサイトのパフォーマンスに関心があります。つまり、データベースがフリーズまたはApacheになった場合は、Aレコードも変更する必要があります。 テストのために、サーバーのIPアドレスからアクセス可能な小さなPHPスクリプトを作成します。
$link = mysql_connect ( 'localhost' , 'root' , 'password' ) or die ( '0' ) ; $result = mysql_query ( 'SELECT VERSION();' ) ; if ( ! $result ) die ( '0' ) ; mysql_close ( $link ) ; echo 'OK!' ;
$link = mysql_connect ( 'localhost' , 'root' , 'password' ) or die ( '0' ) ; $result = mysql_query ( 'SELECT VERSION();' ) ; if ( ! $result ) die ( '0' ) ; mysql_close ( $link ) ; echo 'OK!' ;
$link = mysql_connect ( 'localhost' , 'root' , 'password' ) or die ( '0' ) ; $result = mysql_query ( 'SELECT VERSION();' ) ; if ( ! $result ) die ( '0' ) ; mysql_close ( $link ) ; echo 'OK!' ;
$link = mysql_connect ( 'localhost' , 'root' , 'password' ) or die ( '0' ) ; $result = mysql_query ( 'SELECT VERSION();' ) ; if ( ! $result ) die ( '0' ) ; mysql_close ( $link ) ; echo 'OK!' ;
$link = mysql_connect ( 'localhost' , 'root' , 'password' ) or die ( '0' ) ; $result = mysql_query ( 'SELECT VERSION();' ) ; if ( ! $result ) die ( '0' ) ; mysql_close ( $link ) ; echo 'OK!' ;
$link = mysql_connect ( 'localhost' , 'root' , 'password' ) or die ( '0' ) ; $result = mysql_query ( 'SELECT VERSION();' ) ; if ( ! $result ) die ( '0' ) ; mysql_close ( $link ) ; echo 'OK!' ;
データベースに問題がある場合、スクリプトは0を返します。サーバーが機能しないか、Apacheがフリーズした場合、スクリプトは何も表示しません。成功した場合、「OK!」というメッセージが送信されます。
これで、プライマリサーバーのセットアップが完了しました。
重複ホスティングを構成する
Route 53 APIを使用するために、既製のPHPクラスRoute53を使用しました 。
- define ( 'MASTER_HOST' 、 'xxx.xxx.xxx.xxx' ) ; //メインサーバーのIPアドレス
- define ( 'SLAVE_HOST' 、 'xxx.xxx.xxx.xxx' ) ; //追加サーバーのIPアドレス
- define ( 'ACCESS_KEY' 、 'my_key' ) ; // APIにアクセスするためのキー
- define ( 'SECRET_KEY' 、 'my_pass' ) ; // APIにアクセスするためのパスワード
- define ( 'ZONE_ID' 、 '/ hostedzone / my_zone_id' ) ; //ゾーンID(interstate53.comにドメインを追加した後に表示されます)
- include 'r53.php' ;
- $ルート = 新しい Route53 ( ACCESS_KEY 、 SECRET_KEY ) ;
- $ ns = $ route- > listResourceRecordSets ( ZONE_ID ) ; //ドメインのnsレコードの値をすぐに取得します
- 機能テスト( ) {
- {
- $ answer = file_get_contents ( 'http: //'。MASTER_HOST 。 '/' ) ;
- if ( $ answer == 'OK!' ) //メインサーバーからの応答を確認する
- trueを 返し ます 。
- 他に
- falseを 返し ます 。
- } catch (例外$ e ) {
- falseを 返し ます 。
- }
- }
- 関数更新( $ arr ) {
- GLOBAL $ルート 。
- if ( count ( $ arr ) > 0 )
- {
- $ route- > changeResourceRecordSets ( ZONE_ID 、 $ arr ) ; // nsレコードを更新します
- }
- }
- function changeIP ( $ name 、 $ ttl 、 $ from_ip 、 $ to_ip ) { //関数は、1つのエントリが古いエントリを削除し、2番目のエントリが新しいエントリを追加する配列を生成します
- return Array (
- 」
- <変更>
- <アクション>削除</アクション>
- <ResourceRecordSet>
- <Name> $ name </ Name>
- <Type> A </ Type>
- <TTL> $ ttl </ TTL>
- <ResourceRecords>
- <ResourceRecord>
- <値> $ from_ip </値>
- </ ResourceRecord>
- </ ResourceRecords>
- </ ResourceRecordSet>
- </変更>
- 」 、
- 」
- <変更>
- <アクション>作成</アクション>
- <ResourceRecordSet>
- <Name> $ name </ Name>
- <Type> A </ Type>
- <TTL> $ ttl </ TTL>
- <ResourceRecords>
- <ResourceRecord>
- <値> $ to_ip </値>
- </ ResourceRecord>
- </ ResourceRecords>
- </ ResourceRecordSet>
- </変更>
- 」
- ) ;
- }
- $ changes = 配列 ( ) ;
- if ( ! test ( ) ) {
- if ( ! test ( ) ) { //信頼性を2回確認する
- foreach ( $ ns [ 'ResourceRecordSets' ] as $ record ) {
- if ( $ record [ 'Type' ] == 'A' && $ record [ 'ResourceRecords' ] [ '0' ] == MASTER_HOST ) {
- $ changes = array_merge ( $ changes 、 changeIP ( $ record [ 'Name' ] 、 $ record [ 'TTL' ] 、 MASTER_HOST 、 SLAVE_HOST ) ) ;
- }
- }
- 更新( $の変更 ) ;
- exit ( 0 ) ;
- }
- }
- foreach ( $ ns [ 'ResourceRecordSets' ] as $ record ) {
- if ( $ record [ 'Type' ] == 'A' && $ record [ 'ResourceRecords' ] [ '0' ] == SLAVE_HOST ) {
- $ changes = array_merge ( $ changes 、 changeIP ( $ record [ 'Name' ] 、 $ record [ 'TTL' ] 、 SLAVE_HOST 、 MASTER_HOST ) ) ;
- }
- }
- 更新( $の変更 ) ;
- exit ( 0 ) ;
コードを少し順番に要約します。信頼性のためにサーバーで「OK!」という回答を2回確認し、回答が正しくない場合はレコードを変更し、回答が正しい場合はその場所にレコードを返します。
cronを構成します
Ginoでは、これは非常に簡単に行われます。結果のスクリプトをテストドメインmydomain.jino.ruのフォルダーにスローし、「Scheduled Tasks」で「New Task」をクリックして、フィールドに入力します。
割り当て:curl -s mydomain.jino.ru/route53/core.php > / dev / null
コメント:
分、時間、日、月、曜日:*
スクリプトは毎分実行されます。 つまり、サイトの最大ダウンタイムは、最悪のシナリオでは2分29秒、最高で30秒(TTL Aレコードに依存)になります。
まとめ
理想的には、もちろん、追加のホスティングでサイトのコピーを保持する必要があります-連絡先と「サーバーが機能していません」という碑文のスプラッシュ画面は、一部の人々を怖がらせることができます。 しかし、この方法には存在する権利もあります。