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