MyDNSによるDNSラウンドロビンの問題解決
MyDNSを導入して利用した場合、先述のDNSラウンドロビンの問題点が以下のように解決できる。
分散比率の制御
MyDNSには、重み付きラウンドロビンが標準でサポートされている。ウェイトはrrテーブルのauxカラムに設定する。値が小さいほうが優先される仕組みである。
この機能を使用してスレーブサーバーごとの処理能力に応じた分散制御が行なえる(画面3)。
DeNAではaux値に比例して分散するようにパッチを当てている(LIST3)。
diff -urN mydns-1.1.0/src/mydns/sort.c mydns-1.1.0-dena/src/mydns/sort.c
--- mydns-1.1.0/src/mydns/sort.c 2006-01-19 05:46:47.000000000 +0900
+++ mydns-1.1.0-dena/src/mydns/sort.c 2006-12-31 05:19:11.000000000 +0900
@@ -180,7 +180,7 @@
weights += ((MYDNS_RR *)node->rr)->aux;
if (weights >= rweight)
{
- node->sort1 = 65535 - order++;
+ node->sort1 = order++;
}
このパッチにより画面3の設定例では、1:2の割合でリクエストが分散される。さらにダイナミックにウェイトを変更できるので、状況に応じた分散制御はMySQLに対するupdate文を実行するだけで可能である。
障害時の対応
加えてRRレコードの検索条件を追加指定できる機能があり、/etc/mydns.confのrr-whereパラメータに次の検索条件を追加する。
rr-where=aux>0
これによりauxが0の場合は名前解決から除外されるようになる。auxカラムもMySQLに対するupdate文の実行だけでダイナミックに変更できるため、監視プログラムなどからスレーブサーバーの障害を検知した場合、自動的にスレーブ群からの切り離しができる。監視プログラムは自前で用意する必要があるが、
update rr set aux=0 where data='故障スレーブサーバーIPアドレス'
を実行するだけで良いので簡単に用意できるだろう。この機能は、大変便利で障害対策だけでなくメンテナンス時などにもよく利用している。