gdnsdでかんたんGSLB(その3)

# 皆さんそんなにソーリーサーバを設定したいのですか！？

前回までの記事はこちらです。

[→ gdnsdでかんたんGSLB(その1)](http://qiita.com/jh1vxw/items/7ce5d14e9f964f001257)
[→ gdnsdでかんたんGSLB(その2)](http://qiita.com/jh1vxw/items/2aa418fde6915e3ab5c3)

gdnsdを使ってGSLBを構成する方法について紹介してきました。今回はその続編です。

ロードバランサでよく設定される項目に「ソーリーサーバ」というものがあります。これはロードバランシング先のメインサーバが全てダウンした時に、フォールバック先のサーバを指定するものです。**サービス停止により「ごめんなさい」の意を伝えるページ**を表示するための機能であることから、このような名称で呼ばれることが多いようです。

GSLBでもサービス用のサイトが全てダウンした際に、アクセスをソーリーサーバに誘導したいケースがあるでしょう。以下ではgdnsdでソーリーサーバの設定方法について紹介します。

![ソーリーサーバの動作イメージ](https://qiita-image-store.s3.amazonaws.com/0/108990/91fae908-cf98-d113-e113-be3561b74ef9.png)

# gdnsdでソーリーサーバを指定する設定例

まずはgdnsdの設定例を以下に記載します。

/etc/gdnsd/config

```
plugins = {
  metafo = {
    resources = {
      www = {
        datacenters = [ main , sorryserver ]
        dcmap = {
          main = {
            plugin = multifo
            up_thresh = 0.00000001
            service_types = ping_mon
            www1 = 153.120.ccc.ccc
            www2 = 163.44.ddd.ddd
          }
          sorryserver = 133.242.eee.eee
        }
      }
    }
  }
}

service_types = {
  ping_mon = {
        plugin = extmon
        cmd = ["/usr/bin/ping", "-c", "3", "-W", "1", "%%ITEM%%"]
        interval = 10
        timeout = 5
        up_thresh = 5
        ok_thresh = 3
        down_thresh = 2
  }
}
```

/etc/gdnsd/zones/gslb.src.sakura.ad.jp

```
$TTL 86400

@     SOA ns1 hostmaster (
       2016092100   ; serial
             7200   ; refresh
             30M    ; retry
             3D     ; expire
             10     ; ncache
)

@     NS      ns1
@     NS      ns2
ns1   A       133.242.aaa.aaa
ns2   A       163.44.bbb.bbb

www     10      DYNA    metafo!www
```

直接的にソーリーサーバを設定することはできないので、**metafoプラグイン**を使用します。これは前回までに紹介したmultifoプラグイン(DNSラウンドロビン)やweightedプラグイン(重み付け応答)と組み合わせて使用します。

metafoプラグインでは、**datacenter**という概念を定義できるようになっています。先頭に定義したdatacenterより順次フォールバックすることが可能です。

上記設定例では、**main**と**sorryserver**の2つのdatacenterを定義していますので、mainが全てダウンするとsorryserverがアクティブとなります。結果的に、2台のWebサーバ(153.120.ccc.ccc, 163.44.ddd.ddd)が両方ともダウンした際に、ソーリーサーバ(133.242.eee.eee)をレスポンスする挙動になります。

なお、上記設定例においてsorryserver側にいずれのプラグインも適用していませんので、ヘルスチェックは行われません。**sorryserverで指定したIPアドレスが生きてようと死んでようと、mainがダウンした時にはこのIPアドレスを応答します**のでご注意ください。

ちなみに、metafoプラグインのマニュアルは以下にあります。
https://github.com/gdnsd/gdnsd/wiki/GdnsdPluginMetafo

# 動作確認

digコマンドでDNS応答を確認します。

両方のサーバがアップしている状態

```
$ dig +short www.gslb.src.sakura.ad.jp
153.120.ccc.ccc
163.44.ddd.ddd
```

両方のサーバがダウンしている状態

```
$ dig +short www.gslb.src.sakura.ad.jp
133.242.eee.eee
```

後者のケースで正しく指定したソーリーサーバのIPアドレスのみをレスポンスできていることが確認できます。

なお、metafoプラグインを使用せず(前回までのようにmultifoやweightedプラグインのみを使用した設定)全てのサーバがダウンした場合、全てのサーバがアップしているとみなしてDNSレスポンスを行います。

# weightedプラグインと組み合わせる場合

勘のいい方ならお分かりかと思いますが、weightedプラグインを使用しつつソーリーサーバを指定するには、以下のようになります。

```
        dcmap = {
          main = {
            plugin = weighted
            up_thresh = 0.00000001
            service_types = ping_mon
            www1 = [ 153.120.ccc.ccc, 1 ]
            www2 = [ 163.44.ddd.ddd,  3 ]
          }
          sorryserver = 133.242.eee.eee
        }
```

# ところで・・

だいぶ前になりますが、さくらのクラウドのGSLBでもソーリーサーバ設定機能が実装されました。是非ご活用ください :-)
http://cloud-news.sakura.ad.jp/2016/06/30/gslb-sorryserver/