FANCOMI Ad-Tech Blog

株式会社ファンコミュニケーションズ nend・新規事業のエンジニア・技術ブログ

Simple DNS PlusでWeighted DNS round robinを試してみた

目次

はじめに

こんにちは。インフラ推進課のto_maruyamaです。 今回はWeighted DNS round robinのお話です。 DNSラウンドロビンに重みを設定できる負荷分散技術ですね。

DNSの重みはともかく身体の重みがやばいです。 またサッカーを始めたいと思っているのですが、なかなかチームがみつかりません。 千葉県北西部または東京都東部で活動しているチームでメンバーを募集していましたら、 ぜひご連絡ください。

さて、本題に入ります。

Weighted DNS round robin、便利ですよね。 おかけでDCなどの拠点単位でトラフィックを適宜制御することができます。 代表的なものだとAWSのRoute53が有名ですね。

でも、Route53もDNSですし、攻撃などにより 予期せぬサービス提供不能状態になってしまった時のことを考えると、 代わりの手段は用意しておきたいところです。

代わりの手段として、以下のようなものが考えられるかと思います。

  1. 同じ機能を持ったRoute53以外の外部サービス
  2. 同じ機能を持ったアプライアンス
  3. 同じ機能を持ったソフトウェア

参考までに、それぞれ一例を挙げておきます。

今回は手っ取り早く試せるSimple DNS Plusの動作を確認してみました。

Simple DNS Plus概要

Simple DNS PlusはWindowsで動作する商用のDNSサーバソフトウェアです。 14日間のトライアル期間があり、その間はフリーで使えます。 商用といっても一番高いUnlimited zones licenseでもUS$ 379.00なので、 割りと安価です(価格はこちら)。

日本語化はされていませんが、UIはシンプルで、BINDを構築/設定したことのある人であれば、 どこで何を設定すればいいのかぱっと見でわかります。

英語ですがマニュアルもちゃんとあります(リンク)。

サポートもあるようです(リンク)。

環境

では、インストールの前に本検証の環境を記載します。 ちょっと使ってみるだけなのでノートPCにインストールしました。

インストール環境
項目 内容
OS Windows7 64bit
CPU Intel(R) Core(TM) i5-3437U CPU @ 1.90GHz
メモリ 4GB
ディスク 100GB
サーバ構成
IP Address FQDN 役割
192.168.0.53 ns.sdns.net DNSサーバ
192.168.0.80 www.sdns.net 重み2を設定するWebサーバ
192.168.4.43 www.sdns.net 重み1を設定するWebサーバ

インストール

まずはダウンロード。 ホームページのメニューからDownloadを選択し、 インストール用の実行ファイルを取得します。

sdns_install_01

実行ファイルを起動して次へ。

sdns_install_02

規約に同意して次へ。

sdns_install_03

このへんはお好みで。

sdns_install_04

ここも適宜(特に問題なければCompleteでいいと思います)。

sdns_install_05

インストール開始。

sdns_install_06

インストール中。

sdns_install_07

インストール完了。そのまま起動します。

sdns_install_08

起動すると、ライセンスキーの入力を求められます。 トライアルで使用する場合はそちらを選択します(この場合は上のラジオボタン)。

sdns_install_09

トライアル用ライセンスキーを取得します。 ライセンス取得用WebページのURLをコピーしてブラウザでアクセスします。 (念のためキー関連の情報はモザイクかけさせてもらいました)

sdns_install_10

ブラウザにライセンスキーが表示されるのでコピーします。

sdns_install_11

ウィザードに戻り、テキストボックスに取得したライセンスキーをペーストします。

sdns_install_12

ライセンスが適用されました。使用期限も表示されています。

sdns_install_13

Simple DNS Plusが起動しました。

sdns_run

設定

さて、ここからは使い方です。

まずはゾーンを設定します。 Simple DNS Plusには設定ファイルのインポート機能があるので、 RFC1035に準拠した形式のゾーンファイルを読み込ませます。

インポートするファイル sdns.net.zone

[shell] $TTL 600 @ SOA ns.sdns.net. admin.sdns.net. ( 2014042401 ; Serial 10800 ; Refresh 3600 ; Retry 604800 ; Expire 86400 ) ; Minimum NS ns.sdns.net. MX 10 mail.sdns.net. ns A 192.168.0.53 mail A 192.168.0.1 www 60 IN A 192.168.0.80 [/shell]

Recordsボタンを押下。

sdns_edit_start

File->importを選択。

sdns_import_zone_01

単一ゾーンをゾーンファイルからインポートします。

sdns_import_zone_02

ゾーン名を入力し、作成したゾーンファイルを選択してFinish。

sdns_import_zone_03

ゾーンができました。

sdns_import_zone_04

設定したレコードが正引きできるか確認します。

[shell gutter="false"]

dig +short @192.168.0.53 www.sdns.net

192.168.0.80 [/shell]

問題ないようです。

後からわかったのですが、この後設定するWeighted DNS round robinと、 上記ゾーンで設定したAレコードは別になっているようです。 ゾーンにwww.sdns.netのAレコードがなくても、 Weighted DNS round robinで設定すればIPアドレスが返ってきました。

Weighted DNS round robin

さぁ、それではいよいよWeighted DNS round robinを試してみます。

期待する結果は、www.sdns.netを正引きして、 192.168.0.80が返ってくる回数が192.168.4.43の2倍であることです。

Tools->Optionsを選択。

sdns_config_weight_01

画面左のオプションツリーからPlug-Insを選択、次に画面右にプラグインの一覧から Weighted Round Robinを選択し、Create New Interfaceを選択します。

sdns_config_weight_02

Generalタブはこのまま。設定に任意の名前を付ける場合はどうぞ。

sdns_config_weight_03

Plug-In Settingsタブでレコードの設定をします。 Host name欄に重みを設定したいレコードのFQDNを入力しましょう。 そして、実際のレコードを設定するためaddボタンを押します。 TTLはお好みで。

sdns_config_weight_05

Weightに設定したい重み、IP Addressに対象のアドレスを入力します。 まずは重み2を設定する192.168.0.80から。

sdns_config_weight_06

次に重み1を設定する192.168.4.43も設定します。

sdns_config_weight_07

設定したらdigで何回か引いてみます。

[shell gutter="false"]

dig +short @192.168.0.53 www.sdns.net

192.168.0.80

dig +short @192.168.0.53 www.sdns.net

192.168.0.80

dig +short @192.168.0.53 www.sdns.net

192.168.4.43 [/shell]

想定どおり重みを2にした192.168.0.80が3回中2回返されました。

次は簡単なスクリプトでたくさん問い合わせをしてみます。

使用するスクリプト digloop.sh

[shell]

!/bin/bash

declare -i qnum=$1; declare nameserver=$2; declare hostname=$3; declare -i cnt=0;

while [ $cnt -lt $qnum ] do dig +short @$nameserver $hostname; let cnt++; done

exit 0; [/shell]

100回問い合わせた結果。問題ないですね。

[shell gutter="false"]

./digloop.sh 100 192.168.0.53 www.sdns.net > query_www.sdns.net.100-times.log

grep 192.168.0.80 query_www.sdns.net.100-times.log | wc -l

67

grep 192.168.4.43 query_www.sdns.net.100-times.log | wc -l

33 [/shell]

1000回問い合わせた結果。

[shell gutter="false"]

./digloop.sh 1000 192.168.0.53 www.sdns.net > query_www.sdns.net.1000-times.log

grep 192.168.0.80 query_www.sdns.net.1000-times.log | wc -l

666

grep 192.168.4.43 query_www.sdns.net.1000-times.log | wc -l

334 [/shell]

こちらも想定した動作です。 (微妙な誤差はあるけどw)

性能

ここまでで動作の確認はできました。

最後に、簡単にスループットを計測したいと思います。 ありがたいことに、Simple DNS PlusにはPerformance Graphが実装されています。

では、先ほどのスクリプトを並列で動かして負荷をかけてみます。

使用するスクリプト digloop_mp.sh

[shell]

!/bin/bash

declare -i qnum=$1; declare nameserver=$2; declare hostname=$3; declare -i cnt=1; declare -i pnum=$4; declare -r DIGLOOP='/tmp/digloop.sh'; declare -a pids=();

while [ $cnt -le $pnum ] do $DIGLOOP $qnum $nameserver $hostname > query_$hostname.$qnum-times-$cnt.log & pids+=($!); echo "digloop running pid = $!"; let cnt++; done

printf "%s\n\t%s %s\n" "Please, execute this command." "top -p" "echo ${pids[@]} | sed -e "s/ /,/g"";

exit 0; [/shell]

1000クエリを10プロセス。

[shell gutter="false"]

./digloop_mp.sh 1000 192.168.0.53 www.sdns.net 10

[/shell]

sdns_bench_1000-10

1000クエリを20プロセス。

[shell gutter="false"]

./digloop_mp.sh 1000 192.168.0.53 www.sdns.net 20

[/shell]

sdns_bench_1000-20

1000クエリを30プロセス。

[shell gutter="false"]

./digloop_mp.sh 1000 192.168.0.53 www.sdns.net 30

[/shell]

sdns_bench_1000-30

どうやらこの環境ではMax340rps(Request per second)程度が限界のようですね。 このままではnendで使うのは厳しそうですw

もう少し速いCPUならもっとスループット出るのかな。 あと、確認した限りはなかったですが、接続数制限とかあるかもしれません。

まぁ使い込みはまたの機会にということで。(絶対やらなそう)

おわりに

今回はSimple DNS PlusでWeighted DNS round robinを試してみました。 使い勝手はよかったですが、やはりスループットはネックですね。 「そんなことない!こうすればもっと性能出るぞ!」というご意見心待ちにしています。

さて、次回ですが、やはり前回予告したMySQLネタやりたいです。 (今回は無理でした。ほんとにすみません。。) …イルカと戯れたい。

おしまい!

参考URL:Simple DNS Plus

ページトップへ戻る