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

# GSLBアプライアンス製品って買うとめっちゃ高くないですか？

そんなに高かったら、月額数百円から運用出来てしまう[Amazon Route 53](https://aws.amazon.com/jp/route53/)や[さくらのクラウドGSLB(税抜500円/月)](http://cloud-news.sakura.ad.jp/gslb/)、[GMO ConoHA GeoDNS(税抜500円/月)](https://www.conoha.jp/pricing/)を使っちゃいますよね！！

でも、自前で安価にGSLBを運用したいという方もいらっしゃると思います。

そんなあなたに、**[gdnsd](http://gdnsd.org/)**というオープンソースのGSLBがありますよ！

# そもそもGSLBとは？

GSLBはGlobal Server Load Balancingの略で、**広域負荷分散**と日本語訳されることがあります。地理的に離れた複数のサイトに負荷を分散したり、障害時にサイト単位のフェイルオーバを行ったりする場合に利用されます。

地理的に離れている(＝エンドポイントIPアドレスをサイト間で引き継げない)ような状況で使用されるため、DNSの仕組みを用いたアクセス誘導が行われます。具体的にはGSLB自身がDNS権威サーバとして動作し、DNSクエリに対するレスポンスIPアドレスを変化させることでこれを実現しています。

※ 逆に、エンドポイントIPアドレスが変化しない負荷分散・フェイルオーバを実現するのが通常のロードバランサです(GSLBに対比してローカルロードバランサと呼んだりします)。

GSLBの中枢機能は以下のたった2つです！

- 誘導先サーバのヘルスチェック(もしくはメトリック取得)
- DNSサーバとして、DNSクエリに対するダイナミックなレスポンス<br>ヘルスチェックの結果や、クエリ元の地理的な場所(Geolocation)をメトリックとして考慮します

**ぶっちゃけ、これくらいだったら自前で実装できそうな気もしますよね？**

実際にGMOさんは、[ZabbixとOpenStack Designate(PowerDNS)を使って自前実装](http://www.janog.gr.jp/meeting/janog36/program/lt-gslb)されているそうです。

# gdnsdとは？

自前でGSLB作っちゃってもいいですが、gdnsdを使うと上記2つの機能を単一のデーモンで実現できます。構成上非常にすっきりして運用上も楽です。

gdnsdのWebサイトは以下にあります。
[http://gdnsd.org/](http://gdnsd.org/)

各種方式のヘルスチェック、単純なフェイルオーバや重み付けDNS応答といった基本的なGSLBの機能はもちろんのこと、Geolocation情報を元にしたDNS応答にも対応しており、非常に高機能なソフトウェアです。

# 今回のテスト環境

今回は以下のように、[さくらのクラウド](http://cloud.sakura.ad.jp/)と[GMO ConoHa](https://www.conoha.jp/)上に、gdnsdとWebサーバを用意しました。

![gslb-test.png](https://qiita-image-store.s3.amazonaws.com/0/108990/8b6eeb3d-7fc2-2559-5201-94dbe32811a5.png)

設定パラメータをまとめると以下のとおりです。

| パラメータ | 値 | 備考 |
|:-----------:|:------------:|:------------:|
| 権威を持つゾーン名 | gslb.src.sakura.ad.jp | 上位ゾーン名は src.sakura.ad.jp |
| GSLB対象FQDN | www.gslb.src.sakura.ad.jp | |
| GSLBサーバ(gdnsd) #1 | ns1.gslb.src.sakura.ad.jp <br> 133.242.aaa.aaa | さくらのクラウド石狩 |
| GSLBサーバ(gdnsd) #2 | ns2.gslb.src.sakura.ad.jp <br> 163.44.bbb.bbb | GMO ConoHaシンガポール |
| Webサーバ #1 | 153.120.ccc.ccc | さくらのクラウド石狩 |
| Webサーバ #2 | 163.44.ddd.ddd | GMO ConoHaシンガポール |

# Step1. gdnsdのインストール

gdnsdはソースをコンパイルしてインストールします。CentOS6系ではうまくコンパイルできず、**CentOS7.2を使用しました**。

まず、コンパイルに必要なパッケージをインストールします。

```
$ yum install libev-devel libtool
$ yum localinstall http://netix.dl.sourceforge.net/project/kenzy/special/C7/x86_64/ragel-6.8-3.el7.centos.x86_64.rpm
```

gdnsdのソースコードを取得し、展開します。

```
$ wget https://github.com/gdnsd/gdnsd/archive/v2.1.3.tar.gz
$ tar xvfz v2.1.3.tar.gz
```

コンパイルしてインストールします。

```
$ cd gdnsd-2.1.3
$ libtoolize
$ aclocal
$ autoheader
$ automake -a -c
$ autoconf
$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
$ make
$ make install
$ useradd -s /sbin/nologin -r -d /usr/var/run/gdnsd gdnsd
```

# Step2. 設定ファイルを作成

以下の2つのファイルを作成します。

/etc/gdnsd/config

```
plugins = {
  multifo = {
      www = {
        up_thresh = 0.00000001
        service_types = http_mon
        www1 = 153.120.ccc.ccc
        www2 = 163.44.ddd.ddd
      }
  }
}

service_types = {
  http_mon = {
        plugin = http_status
        port = 80
        url_path = "/"
        ok_codes = [ 200 ]
        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 (
       2016030300   ; 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    multifo!www
```

/etc/gdnsd/configには応答方式(multifo)とヘルスチェック方式を定義しています。

ゾーンファイル(gslb.src.sakura.ad.jp)は、BINDなどと同じなのでAAAAやCNAMEなど他のレコードも普通に書けます。DYNAを指定したレコードは特殊で、configファイルの定義に従いダイナミックなレスポンスを行います。DNSの変更がなるべく早く反映されるよう、**TTLは短めの10秒に設定しています**。

# Step3. gdnsdを起動し動作確認

gdnsdを起動します。

`$ /usr/sbin/gdnsd start`

これで、ヘルスチェックとDNSサーバとしてのレスポンスが開始されます。ヘルスチェックの状態は、gdnsdの動作しているサーバの**3506番ポートにブラウザで接続することで確認可能**です。

- http://133.242.aaa.aaa:3506/
- http://163.44.bbb.bbb:3506/

以下のような画面が表示されると思います。

![a.png](https://qiita-image-store.s3.amazonaws.com/0/108990/75e80919-a387-5c19-dc2d-a376edc39932.png)

DNSレスポンスの動作確認をしてみます。上位ゾーンから正しく委譲されていれば世界中からDNS引けるはずです。

両方の実サーバが正常稼働している場合：

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

片方(153.120.ccc.ccc)がダウンした場合：

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

うまく外れてますね。ステータス画面でもダウンを検出していることが確認できます。

![b.png](https://qiita-image-store.s3.amazonaws.com/0/108990/db9fd5fb-145a-0740-7817-48027de62c44.png)

GSLB化したFQDNでのWebアクセスも、切り替わっていることを確認できるかと思います。
http://www.gslb.src.sakura.ad.jp/

# 次回に続く

今回は基本的な設定のみを紹介しました。次回は各種ヘルスチェック方式や重み付け応答の設定を紹介したいと思います。

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