Mobageのインフラ構成を
体験してみる~MyDNS編~
      Tech-Talk   Daisuke Ikeda
MyDNSとは
・レコードをDB(MySQL or PostgreSQL)管理するDNSサーバ
・内部ドメインの管理用DNSサーバとして立てることが可能
・最新はver.1.2.8.31(MyDNSとMyDNS-NGの違いに注意)
・ゾーン転送についてはNOTIFY,AXFRにも対応
・IPv6にも対応
・ENUM対応(NAPTRレコード)
・DNSSECには未対応?
・移行用コマンド(mydnsimport)有り




     ※ MyDNS http://mydns.bboy.net/   ※ MyDNS-NG http://mydns.bboy.net/
Mobageでの使われ方
Mobageでは負荷分散のためのロードバランシングに
MyDNSのDNSラウンドロビンを活用

大量機器の冗長構成を支えるためにこの方式を採用




   ※ Mobageを支える技術~ソーシャルゲームの舞台裏~  著:DeNA
BINDとMyDNS
・OSSのDNSサーバとしてはBINDが有名
・何が違う?
 - BINDはこのようなファイル形式でレコード情報格納
 options {                                   $TTL 86400
      directory "/var/named";                @       IN     SOA localhost. root.localhost. (
      pid-file "/var/run/named/named.pid";                2003121301 ; serial
      listen-on-v6{                                       3600    ; refresh 1hr
           any; (1)                                       900    ; retry 15min
      }                                                   604800 ; expire 1w
 };                                                       86400    ; min 24hr
                                             )
 zone "localhost" {                                 IN     NS   localhost.
      type master;                                  IN     A   127.0.0.1
      file "local.zone";                            IN     AAAA ::1
 };



 - MyDNSはDBのテーブルでレコード情報格納
   ・SOAテーブル、RRテーブルに2テーブルで全て管理
・大規模環境や、動的に変化するような環境ではファイル管理
の仕組みは厳しい
MyDNSインストール&設定
OS: CentOS5.5
DB: MySQL5.0系 (mydns用DB、ユーザ作成済み)
  インストール                                         設定(/etc/mydns.conf)

# yum install mydns mydns-mysql

  DB初期化                                           db-host = localhost    # SQL server hostname
                                                  db-user = username      # SQL server username
# mydns --create-tables | mysql -u mydns -p       db-password = password     # SQL server password
mydns                                             database = mydns        # MyDNS database name


  管理画面用php配置                                      listen = *         # Listen on these addresses ('*' for all)
                                                  no-listen =         # Do not listen on these addresses

# cp /usr/share/mydns/admin.php /var/www/html/    rr-where =
                                                  などなど

  mydnsデーモン起動
                         UDP53ポートで待ち受け開始
                         (必要に応じてiptables変更)
# mydns -b
MyDNS DNSレコード設定
・管理画面からGUIで登録
MyDNS DNSレコード設定
・SQL文で登録
mysql> select * from rr;
+----+------+-----------+--------------------------+-----+-----+-------+
| id | zone | name        | data                   | aux | ttl | type |
+----+------+-----------+--------------------------+-----+-----+-------+
| 1 | 1 | server1 | 10.1.1.1                      | 0 | 300 | A |
| 2 | 1 | server1 | 10.1.1.2                      | 0 | 300 | A |
| 3 | 1 | server1v6 | fe80::20c:29ff:f116:c11b | 50 | 300 | AAAA |
| 5 | 1 | server2 | server1.example.com. | 50 | 300 | CNAME |
| 6 | 1 | server1 | x86_64 CentOS                       | 0 | 300 | HINFO |
+----+------+-----------+--------------------------+-----+-----+-------+
5 rows in set (0.00 sec)

mysql> select * from soa;
+----+--------------+----------------------+------------------+------------+---------+-------+--------+---------+-------+
| id | origin      | ns                 | mbox             | serial | refresh | retry | expire | minimum | ttl |
+----+--------------+----------------------+------------------+------------+---------+-------+--------+---------+-------+
| 1 | example.com. | test-dns.example.com | mail.example.com | 2012072401 | 28800 | 7200 | 604800 | 86400 | 86400 |
+----+--------------+----------------------+------------------+------------+---------+-------+--------+---------+-------+
1 row in set (0.00 sec)

INSERT INTO rr (zone,name,data,aux,ttl,type) VALUES (1,'server3','10.1.1.3',50,300,'A');
MyDNSを使ってDNSラウンドロビン
同一ホスト名のAレコードを登録すればOK




aux値の大小で振り分け量を調節可能(数値の小さい方がより多く振り分けられる)
aux値が0のレコードがあれば全リクエストが0の方に振り分けられる

mydns.confに以下の指定をしていると、aux>0のレコードにしか割り振られない


  rr-where = aux > 0


有効にするrrレコードの条件指定が可能
DNSラウンドロビンとロードバランサ
・DNSラウンドロビンを使えば振り分けは可能
・但し、振り分け先が存在しない場合、失敗
・Mobageでは、振り分け先が疎通できるか確認し、RRを書き換
える仕組みを独自構築
・ロードバランサを使った場合
その他DB型DNS
・PrimDNS(GREEさんが作られた国産DNS)
 - 検索性能UPのためエンジン周りの実装に工夫があるらしい
  → ゾーン毎にエンジンを変えて処理させること可能
 - BINDの設定を移行できる機能あり
 - 機能面で不十分な点があるらしい?
   NOTIFY,AXFR未対応?
・PowerDNS
 - DNSSECに対応させることも可能らしい
 - 利用事例が多そう(情報が多い)(MyDNS.jpが採用)
 - PowerDNS on Railsという管理ツールもあり
 - BIND設定を移行するツールあり(zone2sql)
AmazonRoute53
- AWS上のDNSサービス
- ユーザはAPI経由でレコード登録するのみでOK
- 従量課金制
  ・ 1ゾーン毎の課金$0.5/月(25ゾーンまで。それ以上の場合は$0.1/月)
  ・ 100万リクエスト毎の課金$0.5/月(10億リクエストまで。それ以上の場合は$0.25/月)
- 重み付きルーティングにも対応
  ・ 0~255の重み付が可能(数字が大きい方により多くのルーティング)
  ・ 0に設定することでそのノードへのルーティングをストップすることが可能
  ・ 全て0に設定すれば全レコード均等に配分
- AWS Management Consoleから簡単に設定可能
AmazonRoute53
まとめ
・レコードの管理は楽
・各サーバの稼働状況を確実に監視する必要あり
 - 監視ツールと連携させれば自動化も可能かも
・MyDNSの情報少ない・・・
 - MyDNS.JPばかり検索される

Mobageの技術を体験(MyDNS編)