2026年5月24日

2026年5月24日

DNSフェイルオーバーでWebサイトを冗長化する構成と設定手順

DNSフェイルオーバーは、DNSサービスがサーバーの死活を定期的に監視し、メインのサーバーが応答しなくなったときに予備サーバーのIPアドレスを返すよう切り替える仕組みです。ロードバランサーを置かずに冗長化できる反面、切り替わるまでにDNSキャッシュ分の時間がかかります。この記事では、仕組みと限界、ヘルスチェックの作り方、予備サーバー側の準備、切り替えの試験方法までを、WordPressサイトを例に説明します。

DNSフェイルオーバーの仕組みと、ラウンドロビンとの違い

通常のDNSは、登録されたレコードをそのまま返すだけで、サーバーが止まっていても気づきません。DNSフェイルオーバーでは、権威DNSサービス側に「ヘルスチェック」が加わります。

  1. DNSサービスが一定間隔でメインサーバーにHTTP(S)などで接続し、正常な応答が返るかを確認する
  2. 決められた回数続けて失敗すると、メインを「異常」と判定する
  3. 以降の問い合わせには、予備サーバーのIPアドレスを返す
  4. メインが復旧すると、設定に応じて元の応答に戻す

複数のAレコードを並べて振り分ける「DNSラウンドロビン」は負荷分散が目的で、死活監視はしません。止まったサーバーのIPも返し続けるため、冗長化の手段としては不十分です。フェイルオーバーは「正常なサーバーだけを返す」ことが目的で、メイン1台+予備1台のアクティブ/スタンバイ構成がもっとも一般的です。

切り替えにかかる時間を見積もる

DNSフェイルオーバーで最初に理解しておきたいのは、切り替えが一瞬では終わらないことです。利用者から見たダウンタイムは、おおむね次の合計になります。

  • 検知時間:チェック間隔 × 失敗と判定するまでの回数(例: 30秒間隔で3回なら約90秒)
  • キャッシュの残り時間:リゾルバーが古い応答を保持している時間(最大でTTL)
  • クライアント側の保持:ブラウザやアプリが名前解決の結果を使い回す時間、既存の接続を使い続ける時間

TTLを短くするほど切り替えは早くなりますが、問い合わせ回数が増えます。フェイルオーバー対象のレコードは60〜300秒程度にするのが一般的です。ただし、一部のリゾルバーやアプリケーション(独自のDNSキャッシュを持つランタイムなど)はTTLを守らず長く保持することがあり、TTLを60秒にしても全員が60秒で切り替わるわけではありません。「数分程度のダウンタイムは許容する」という前提で選ぶ方式です。秒単位の切り替えが必要なら、ロードバランサーやクラウドの冗長構成を検討してください。

DNSフェイルオーバーに対応した主なサービス

ヘルスチェックとフェイルオーバーは、権威DNSサービスの機能として提供されています。代表的なものは次のとおりです(2026年10月現在)。機能の範囲や名称、課金体系は各社が変更することがあるため、公式ドキュメントで確認してください。

  • Amazon Route 53:ヘルスチェックを作成し、レコードのルーティングポリシーで「フェイルオーバー」を選んでプライマリとセカンダリを指定します。
  • Cloudflare:DNS自体には死活監視がなく、有料の Load Balancing 機能でオリジンのプール、監視(モニター)、フェイルオーバーの順序を設定します。
  • Azure Traffic Manager / Google Cloud DNS のルーティングポリシー / NS1 など:優先度やヘルスチェックに基づく応答の切り替えが可能です。

レジストラ付属の無料DNSやBINDを素のまま運用している場合は、この機能がありません。自前で監視スクリプトを書いてAPIでレコードを書き換える方法もありますが、監視スクリプト自体が止まると機能しないため、まずはマネージドサービスを使うほうが安全です。

手順1:ヘルスチェック用のURLを用意する

トップページをそのまま監視すると、ページキャッシュが効いていてデータベースが落ちていても「正常」と判定されることがあります。WordPressでは、データベースまで疎通できるかを見る軽いURLを用意すると判定の精度が上がります。

<?php
// health-check.php(WordPressのルート、wp-load.php と同じ階層に置く例)
// SHORTINIT で最小限だけ読み込み、DB に問い合わせて結果を返す
define( 'SHORTINIT', true );
require __DIR__ . '/wp-load.php';

global $wpdb;
$ok = ( '1' === (string) $wpdb->get_var( 'SELECT 1' ) );

header( 'Cache-Control: no-store' );
header( 'Content-Type: text/plain; charset=utf-8' );
http_response_code( $ok ? 200 : 503 );
echo $ok ? 'OK' : 'NG';

SHORTINIT を定義すると、プラグインやテーマを読み込まずにデータベース接続までで処理が止まるため、監視の負荷を抑えられます。データベースに接続できない場合は WordPress がエラーを返すので、監視側は異常と判定します。

置いたあとに確認したい点は次のとおりです。

  • ページキャッシュ(キャッシュ系プラグインやCDN、サーバーのキャッシュ)の対象から外す。キャッシュされた200が返り続けると監視の意味がなくなります
  • エラーの詳細やバージョン情報を出力しない
  • 監視が HTTPS で行われる場合、証明書の検証やリダイレクトで失敗しないかを確かめる

監視側では、このURLが200を返し、本文に「OK」を含むことを条件にすると誤判定を減らせます(文字列一致の条件を設定できるかはサービスによります)。

手順2:予備サーバーを用意する

フェイルオーバーで一番難しいのは、DNSの設定よりも予備サーバーの中身です。WordPressでは、次のどちらかの方針を先に決めます。

方針A:お詫び・メンテナンスページを出す予備側は静的なページだけを返すサーバーやオブジェクトストレージ+CDNにします。データの同期が不要で、構成も単純です。「止まったときに真っ白にならない」ことが目的ならこれで十分です。

方針B:同じサイトを予備でも表示するデータベースの複製(レプリケーション)、wp-content/uploads の同期、テーマ・プラグインのファイルの一致が必要です。注意したいのは書き込みです。予備側でもコメントや注文、管理画面での更新を受け付けると、切り戻したときにメイン側とデータが食い違います。予備側は読み取り専用にする、書き込み処理を止める、切り戻し時のデータ統合手順を決めておく、のいずれかを事前に用意してください。

どちらの方針でも、予備サーバーには同じドメインのSSL証明書が要ります。通常時は予備サーバーにアクセスが来ないため、Let's Encrypt の HTTP-01 認証では更新に失敗しがちです。DNS-01 認証で発行する、メイン側で取得した証明書を安全な方法で配布する、などの方法で予備側の証明書を有効に保ちます。

手順3:DNSレコードとヘルスチェックを設定する

Route 53 を例にすると、流れは次のようになります(画面の表記はコンソールの改修で変わることがあります)。

  1. メインサーバーのヘルスチェックを作成する(プロトコル、ホスト名、パス /health-check.php、チェック間隔、失敗と判定する回数を指定)
  2. 同じ名前(例: www.example.com)のAレコードを2つ作り、ルーティングポリシーをフェイルオーバーにする
  3. 1つ目をプライマリとしてメインのIPと手順1のヘルスチェックを関連付け、2つ目をセカンダリとして予備のIPを指定する
  4. TTLは60〜300秒程度にする

Cloudflare の Load Balancing を使う場合は、メインと予備をそれぞれ「プール」として登録し、監視の設定を付け、プールの優先順位でフェイルオーバーさせる、という考え方になります。

既存のレコードをフェイルオーバー用に作り替えるときは、作業の前日までに既存レコードのTTLを短くし、作業前に現在のDNS設定をエクスポートしてバックアップしておくと、問題が起きたときに戻しやすくなります。

手順4:切り替えと切り戻しを試験する

設定しただけで本番の障害を待つのは危険です。利用者の少ない時間帯に、意図的にメインを異常にして動作を確かめます。

# 1. 平常時の応答を確認(メインのIPが返る)
dig +short www.example.com A

# 2. メイン側でヘルスチェックURLだけを503にする、Webサーバーを止める等で障害を再現

# 3. 権威DNSに直接問い合わせ、予備のIPに変わったか確認
dig +short www.example.com A @ns-xxx.awsdns-xx.com

# 4. 公開リゾルバー経由でも確認(キャッシュが切れるまで旧IPのことがある)
dig www.example.com A @8.8.8.8

権威DNSの応答が変わるまでの時間が検知時間、公開リゾルバーで変わるまでの差がキャッシュの影響です。実測した時間を記録しておくと、障害時に「あと何分で切り替わるか」の判断材料になります。

切り戻し(メイン復旧後に元へ戻す動作)も確認します。メインが不安定なまま自動で戻ると、切り替えと切り戻しを繰り返す「フラッピング」が起きます。方針Bで予備側に書き込みがあった場合は、自動で戻さず、データを確認してから手動で戻す運用のほうが安全です。

ネームサーバー自体の冗長化も確認する

Webサーバーを冗長化しても、ドメインの権威DNSが止まれば名前解決ができません。ネームサーバーは複数台が登録されているか、異なるネットワークに分散しているかを確認します。

dig +short example.com NS

マネージドDNSは通常、複数の拠点に分散した複数のネームサーバーを割り当てます。自前のDNSサーバーを使っている場合は、最低2台を別のネットワークに置くか、セカンダリDNSサービスの利用を検討してください。

まとめ

  • DNSフェイルオーバーは、ヘルスチェックで異常を検知したら予備サーバーのIPを返す仕組みで、ラウンドロビンとは目的が異なります。
  • 切り替え時間は「検知時間+DNSキャッシュ+クライアントの保持」の合計で、数分単位になる前提で使います。
  • WordPressではDBまで確認するヘルスチェックURLを作り、キャッシュの対象から外します。
  • 予備サーバーは「お詫びページ」か「同じサイト」かを先に決め、同じサイトなら書き込みと切り戻しの扱い、SSL証明書の更新方法まで用意します。
  • 設定後は意図的に障害を起こして、切り替えと切り戻しの時間を実測しておきます。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲