Prev / Next

2009-07-01 / MyDNS を試してみた

DNS ラウンドロビンを使う必要があるので,
MyDNS を使ってみました.

- MyDNS: Home
  http://mydns.bboy.net/

MyDNS の特徴は
- レコードは DB に保存
- 重み付けしたラウンドロビンが可能
など.


インストール

tar ball の中に spec ファイルがあるので,
それを元にして rpm を作成してインストール.

- DeNAの人気サイトに学ぶ LAMPによるWeb-DBシステム構築/運用の極意(後編):企業IT部門の変革を支援するエンタープライズ実践情報サイト EnterpriseZine
  http://enterprisezine.jp/article/detail/26

で書かかれている aux の値に比例して分散させる patch をあてるようにした.

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++;
                              }


この patch をあてた srpm.
mydns-mysql-1.1.0-2.src.rpm



設定

MyDNS の設定

/etc/mydns.conf を編集.

db-host = localhost
db-user = mydns
db-password = xxxxxxx
database = mydns

rr-where = aux>0   # aux が 0 のレコードにはラウンドロビンしないようにするため


データベースの設定

テーブルを用意して

mydns --create-tables|mysql -umydns -pxxxxxxx mydns


を実行.
SOA テーブルと rr テーブルができる.

テスト用のレコード登録

insert into soa (origin, ns) values ('example.com.', 'ns.example.com');
insert into rr (zone, name, type, data, aux) values(1, 'foo', 'A', '192.168.0.11', 50);
insert into rr (zone, name, type, data, aux) values(1, 'foo', 'A', '192.168.0.12', 50);




ラウンドロビンの確認

● 基本的な設定

mysql> select * from rr;
+----+------+------+------+--------------+-----+-----+
| id | zone | name | type | data         | aux | ttl |
+----+------+------+------+--------------+-----+-----+
|  1 |    1 | foo  | A    | 192.168.0.11 |  50 | 300 |
|  2 |    1 | foo  | A    | 192.168.0.12 |  50 | 300 |
+----+------+------+------+--------------+-----+-----+


# for i in `seq 1 100`; do dig foo.example.com |grep 192.168.|head -n 1; done|awk '{print $5}'|sort |uniq -c
     51 192.168.0.11
     49 192.168.0.12


● 重み(aux)を変更
1:2 の振り分けに。

mysql> select * from rr;
+----+------+------+------+--------------+-----+-----+
| id | zone | name | type | data         | aux | ttl |
+----+------+------+------+--------------+-----+-----+
|  1 |    1 | foo  | A    | 192.168.0.11 |  50 | 300 |
|  2 |    1 | foo  | A    | 192.168.0.12 | 100 | 300 |
+----+------+------+------+--------------+-----+-----+


# for i in `seq 1 100`; do dig foo.example.com |grep 192.168.|head -n 1; done|awk '{print $5}'|sort |uniq -c
     33 192.168.0.11
     67 192.168.0.12


● 振分けの停止(aux = 0)

mysql> select * from rr;
+----+------+------+------+--------------+-----+-----+
| id | zone | name | type | data         | aux | ttl |
+----+------+------+------+--------------+-----+-----+
|  1 |    1 | foo  | A    | 192.168.0.11 |  50 | 300 |
|  2 |    1 | foo  | A    | 192.168.0.12 |   0 | 300 |
+----+------+------+------+--------------+-----+-----+


# for i in `seq 1 100`; do dig foo.example.com |grep 192.168.|head -n 1; done|awk '{print $5}'|sort |uniq -c
    100 192.168.72.211


参考
- DeNAの人気サイトに学ぶ LAMPによるWeb-DBシステム構築/運用の極意(後編):企業IT部門の変革を支援するエンタープライズ実践情報サイト EnterpriseZine
  http://enterprisezine.jp/article/detail/26
- MyDNSを試す - Practice of Programming
  http://d.hatena.ne.jp/ktat/20070512/1178968354

comments powered by Disqus