PowerDNSを使ったGeographic Load Balancing

Akamaiみたいに、DNSでクライアントのロケーションごとに異なるIP(またはCNAME)を返せないものかと、いろいろ調査。こーゆーDNSのロードバランシングをGeographic Load Balancingと言うらしい。

いくつかのDNSサーバを調べてみたところ、PowerDNSGeo backendモジュールにそれっぽそうなことが書いてある。

とりあえずインスコ。


$ yum install pdns-backend-geo
$ yum install pdns-recursor

READMEこれを読んで、/etc/pdns/pdns.confに以下の設定を追加。


geo-zone=geo.domain.com
geo-soa-values=ns0.domain.com,hostmaster@domain.com
geo-ns-records=ns0.domain.com,ns1.domain.com
geo-ip-map-zonefile=/etc/pdns/zz.countries.nerd.dk.rbldnsd
geo-maps=/etc/pdns/geo-maps

/etc/pdbns/zz.countries.nerd.dk.rbldnsdはblitzed.orgから配布されていて、rsyncで取得するらしい


$ rsync -qt rsync://rsync.blitzed.org/countries/zz.countries.nerd.dk.rbldnsd /etc/pdns/zz.countries.nerd.dk.rbldnsd

/etc/pdbns/geo-mapsはこんな感じ。


$ head /etc/pdns/geo-maps
$RECORD www
$ORIGIN geo.domain.com

# default
0 www

# Andorra
20 eu
# United Arab Emirates
784 as

www.geo.domain.comを問い合わせると、クライアントのロケーションに応じてjp.geo.domain.com等を返す。
iso2region.plを使うと、全て国(だと思う)の設定をだーっと出力してくれる。。。がJapanのサブドメインがasになってたりするのでjpに修正。

あとはPowerDNSを起動。


$ /etc/init.d/pdns start
$ tail /var/log/messages
Jul 4 11:55:26 ip-XXX-XXX-XXX-XXX pdns[1780]: Listening on controlsocket in '/var/run/pdns.controlsocket'
Jul 4 11:55:26 ip-XXX-XXX-XXX-XXX pdns[1783]: Guardian is launching an instance
Jul 4 11:55:26 ip-XXX-XXX-XXX-XXX pdns[1783]: This is a guarded instance of pdns
Jul 4 11:55:26 ip-XXX-XXX-XXX-XXX pdns[1783]: It is advised to bind to explicit addresses with the --local-address option
Jul 4 11:55:26 ip-XXX-XXX-XXX-XXX pdns[1783]: UDP server bound to 0.0.0.0:53
Jul 4 11:55:26 ip-XXX-XXX-XXX-XXX pdns[1783]: TCP server bound to 0.0.0.0:53
Jul 4 11:55:26 ip-XXX-XXX-XXX-XXX pdns[1783]: PowerDNS 2.9.21 (C) 2001-2006 PowerDNS.COM BV (Apr 1 2008, 11:48:50, gcc 4.1.2 20070626 (Red Hat 4.1.2-14)) starting up
Jul 4 11:55:26 ip-XXX-XXX-XXX-XXX pdns[1783]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
Jul 4 11:55:26 ip-XXX-XXX-XXX-XXX pdns[1783]: Creating backend connection for TCP
Jul 4 11:55:27 ip-XXX-XXX-XXX-XXX pdns[1783]: About to create 3 backend threads for UDP

手元のマシンから問い合わせてみる。


$ dig @ec2-XXX-XXX-XXX-XXX.ap-southeast-1.compute.amazonaws.com www.geo.domain.com

; <<>> DiG 9.6.1-P1 <<>> @ec2-XXX-XXX-XXX-XXX.ap-southeast-1.compute.amazonaws.com www.geo.domain.com

; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 1590
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;www.geo.domain.com. IN A

;; ANSWER SECTION:
www.geo.domain.com. 3600 IN CNAME jp.geo.domain.com.

;; AUTHORITY SECTION:
geo.domain.com. 0 IN SOA ns0.domain.com. hostmaster\@domain.com. 1 86400 1728
00 604800 3600

;; Query time: 125 msec
;; SERVER: 175.41.171.232#53(175.41.171.232)
;; WHEN: Mon Jul 05 00:56:42 2010
;; MSG SIZE rcvd: 111

海外からもやってみたけど、国ごとのサブドメインのCNAMEが返ってきた。
EC2のAPSE以外のリージョンからの問い合わせはデフォルトになってしまったけど。。。