目次
はじめに
こんにちは。インフラ推進課のto_maruyamaです。 今回はWeighted DNS round robinのお話です。 DNSラウンドロビンに重みを設定できる負荷分散技術ですね。
DNSの重みはともかく身体の重みがやばいです。 またサッカーを始めたいと思っているのですが、なかなかチームがみつかりません。 千葉県北西部または東京都東部で活動しているチームでメンバーを募集していましたら、 ぜひご連絡ください。
さて、本題に入ります。
Weighted DNS round robin、便利ですよね。 おかけでDCなどの拠点単位でトラフィックを適宜制御することができます。 代表的なものだとAWSのRoute53が有名ですね。
でも、Route53もDNSですし、攻撃などにより 予期せぬサービス提供不能状態になってしまった時のことを考えると、 代わりの手段は用意しておきたいところです。
代わりの手段として、以下のようなものが考えられるかと思います。
- 同じ機能を持ったRoute53以外の外部サービス
- 同じ機能を持ったアプライアンス
- 同じ機能を持ったソフトウェア
参考までに、それぞれ一例を挙げておきます。
- NIFTY Cloud DNS(1の例)
- Cisco CSS 11500 シリーズ(2の例)
- Simple DNS Plus(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を選択し、 インストール用の実行ファイルを取得します。
実行ファイルを起動して次へ。
規約に同意して次へ。
このへんはお好みで。
ここも適宜(特に問題なければCompleteでいいと思います)。
インストール開始。
インストール中。
インストール完了。そのまま起動します。
起動すると、ライセンスキーの入力を求められます。 トライアルで使用する場合はそちらを選択します(この場合は上のラジオボタン)。
トライアル用ライセンスキーを取得します。 ライセンス取得用WebページのURLをコピーしてブラウザでアクセスします。 (念のためキー関連の情報はモザイクかけさせてもらいました)
ブラウザにライセンスキーが表示されるのでコピーします。
ウィザードに戻り、テキストボックスに取得したライセンスキーをペーストします。
ライセンスが適用されました。使用期限も表示されています。
Simple DNS Plusが起動しました。
設定
さて、ここからは使い方です。
まずはゾーンを設定します。 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ボタンを押下。
File->importを選択。
単一ゾーンをゾーンファイルからインポートします。
ゾーン名を入力し、作成したゾーンファイルを選択してFinish。
ゾーンができました。
設定したレコードが正引きできるか確認します。
[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を選択。
画面左のオプションツリーからPlug-Insを選択、次に画面右にプラグインの一覧から Weighted Round Robinを選択し、Create New Interfaceを選択します。
Generalタブはこのまま。設定に任意の名前を付ける場合はどうぞ。
Plug-In Settingsタブでレコードの設定をします。 Host name欄に重みを設定したいレコードのFQDNを入力しましょう。 そして、実際のレコードを設定するためaddボタンを押します。 TTLはお好みで。
Weightに設定したい重み、IP Addressに対象のアドレスを入力します。 まずは重み2を設定する192.168.0.80から。
次に重み1を設定する192.168.4.43も設定します。
設定したら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]
1000クエリを20プロセス。
[shell gutter="false"]
./digloop_mp.sh 1000 192.168.0.53 www.sdns.net 20
[/shell]
1000クエリを30プロセス。
[shell gutter="false"]
./digloop_mp.sh 1000 192.168.0.53 www.sdns.net 30
[/shell]
どうやらこの環境ではMax340rps(Request per second)程度が限界のようですね。 このままではnendで使うのは厳しそうですw
もう少し速いCPUならもっとスループット出るのかな。 あと、確認した限りはなかったですが、接続数制限とかあるかもしれません。
まぁ使い込みはまたの機会にということで。(絶対やらなそう)
おわりに
今回はSimple DNS PlusでWeighted DNS round robinを試してみました。 使い勝手はよかったですが、やはりスループットはネックですね。 「そんなことない!こうすればもっと性能出るぞ!」というご意見心待ちにしています。
さて、次回ですが、やはり前回予告したMySQLネタやりたいです。 (今回は無理でした。ほんとにすみません。。) …イルカと戯れたい。
おしまい!
参考URL:Simple DNS Plus