2013年1月25日金曜日

MyDNSのインストール

もしかしたら後々、はMySQL MHAで利用するかもしれないので、
MyDNSサーバーを試してみました(`・ω・´)シャキーン

MyDNSはDNS情報をMySQLやPostgreSQLなどで管理が出来るらしいです(・∀・)イイネ!!
DNSラウンドロビンを使って振り分けを行える、その際に重みをつけることも可能。
ただし、振り分け先の死活監視は行わない。
後は、phpで動くDNS情報登録画面があるとか!

似たものとして、GREE製のPrimDNSとか、PowerDNS、AmazonRoute53などがあります。

PowerDNSもやってみたいけどとりあえず、
DeNAでMyDNSは使われているそうなので、こちらからテストを試したいと思います。

こちらの会社さんでは、スマートフォンゲーム開発で利用されているそうです。
「Lord of Knights の裏側見せます!~Unity + PHP + MySQL で作るスマートフォンゲーム開発~」の資料を公開しましたから抜粋
MyDNSを使った名前解決
→面倒なhosts管理から開放される
→MySQLで管理が楽
こんな用途に使っている
・デプロイ先サーバーの決定
→wwwサーバの追加などにも柔軟に対応
・DBスレイブのラウンドロビン
→アプリ側がシンプルに
・DBスレイブの参照率調整
→サーバの負荷に応じて参照率を調整できる
→DBバックアップ時に参照から外して終わったら自動で戻す

MyDNSのインストール前に、こちらの記事を参考にMySQLのインストールを済ませておいてください。
それとepelリポジトリが追加されていない場合には、追加をしておいてください。(こちらの記事を参考)

それでは、インストールを行いたいと思います( ̄ー ̄)ニヤリ

■手順1)インストール
#epelリポジトリが追加されている確認
rpm -q epel-release
epel-release-6-8.noarch

#mydnsのインストール
yum install mydns
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
epel/metalink                                                                                                                                                    | 3.4 kB     00:00
 * base: mirror.fairway.ne.jp
 * centosplus: mirror.fairway.ne.jp
 * elrepo: repos.lax-noc.com
 * epel: ftp.jaist.ac.jp
 * extras: mirror.fairway.ne.jp
 * rpmforge: mirror.fairway.ne.jp
 * updates: mirror.fairway.ne.jp
base                                                                                                                                                             | 3.7 kB     00:00
centosplus                                                                                                                                                       | 3.5 kB     00:00
elrepo                                                                                                                                                           | 1.9 kB     00:00
elrepo/primary_db                                                                                                                                                | 526 kB     00:01
epel                                                                                                                                                             | 4.3 kB     00:00
http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/repodata/repomd.xml: [Errno -1] repomd.xml does not match metalink for epel
Trying other mirror.
epel                                                                                                                                                             | 4.3 kB     00:00
epel/primary_db                                                                                                                                                  | 5.0 MB     00:00
extras                                                                                                                                                           | 3.5 kB     00:00
rpmforge                                                                                                                                                         | 1.9 kB     00:00
updates                                                                                                                                                          | 3.5 kB     00:00
updates/primary_db                                                                                                                                               | 4.6 MB     00:09
vz-base                                                                                                                                                          |  951 B     00:00
vz-updates                                                                                                                                                       |  951 B     00:00
162 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mydns.x86_64 0:1.2.8.31-1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================================================================================
 Package                                   Arch                                       Version                                            Repository                                Size
========================================================================================================================================================================================
Installing:
 mydns                                     x86_64                                     1.2.8.31-1.el6                                     epel                                     109 k

Transaction Summary
========================================================================================================================================================================================
Install       1 Package(s)

Total download size: 109 k
Installed size: 267 k
Is this ok [y/N]:
Downloading Packages:
mydns-1.2.8.31-1.el6.x86_64.rpm                                                                                                                                  | 109 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : mydns-1.2.8.31-1.el6.x86_64                                                                                                                                          1/1
  Verifying  : mydns-1.2.8.31-1.el6.x86_64                                                                                                                                          1/1

Installed:
  mydns.x86_64 0:1.2.8.31-1.el6

Complete!

#mydns-mysqlのインストール
# yum install mydns-mysql
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
 * base: mirror.fairway.ne.jp
 * centosplus: mirror.fairway.ne.jp
 * elrepo: repos.lax-noc.com
 * epel: ftp.jaist.ac.jp
 * extras: mirror.fairway.ne.jp
 * rpmforge: mirror.fairway.ne.jp
 * updates: mirror.fairway.ne.jp
162 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mydns-mysql.x86_64 0:1.2.8.31-1.el6 will be installed
--> Processing Dependency: libmysqlclient.so.16(libmysqlclient_16)(64bit) for package: mydns-mysql-1.2.8.31-1.el6.x86_64
--> Processing Dependency: libmysqlclient.so.16()(64bit) for package: mydns-mysql-1.2.8.31-1.el6.x86_64
--> Running transaction check
---> Package mysql-libs.x86_64 0:5.1.66-2.el6_3 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================================================================================
 Package                                      Arch                                    Version                                            Repository                                Size
========================================================================================================================================================================================
Installing:
 mydns-mysql                                  x86_64                                  1.2.8.31-1.el6                                     epel                                     152 k
Installing for dependencies:
 mysql-libs                                   x86_64                                  5.1.66-2.el6_3                                     updates                                  1.2 M

Transaction Summary
========================================================================================================================================================================================
Install       2 Package(s)

Total download size: 1.4 M
Installed size: 4.6 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): mydns-mysql-1.2.8.31-1.el6.x86_64.rpm                                                                                                                     | 152 kB     00:00
(2/2): mysql-libs-5.1.66-2.el6_3.x86_64.rpm                                                                                                                      | 1.2 MB     00:02
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                   428 kB/s | 1.4 MB     00:03
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : mysql-libs-5.1.66-2.el6_3.x86_64                                                                                                                                     1/2
  Installing : mydns-mysql-1.2.8.31-1.el6.x86_64                                                                                                                                    2/2
  Verifying  : mysql-libs-5.1.66-2.el6_3.x86_64                                                                                                                                     1/2
  Verifying  : mydns-mysql-1.2.8.31-1.el6.x86_64                                                                                                                                    2/2

Installed:
  mydns-mysql.x86_64 0:1.2.8.31-1.el6

Dependency Installed:
  mysql-libs.x86_64 0:5.1.66-2.el6_3

Complete!
インストールされたファイル郡の確認
rpm -qs mydns-mysql
通常          /usr/bin/mydns-conf-mysql
通常          /usr/bin/mydnscheck-mysql
通常          /usr/bin/mydnsexport-mysql
通常          /usr/bin/mydnsimport-mysql
通常          /usr/bin/mydnsptrconvert-mysql
通常          /usr/sbin/mydns-mysql
通常          /usr/share/doc/mydns-mysql-1.2.8.31
通常          /usr/share/doc/mydns-mysql-1.2.8.31/QUICKSTART.mysql
インストールされたファイル郡の確認 インストール先の確認
# which mydns-mysql
/usr/sbin/mydns-mysql
■手順2)初期設定
MySQLが起動されている状態で、次のコマンドを実行する
mydnsで利用するデータベースの作成とテーブルの初期化
#mydnsデータベース作成
mysqladmin -u root create mydns

#DB初期化
mydns --create-tables | mysql -u root
MySQLにログインして、mydnsというデータベースが作られていて、テーブルが作成されていること。(rr,soa)を確認する
#初期化の確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydns              |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use mydns;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_mydns |
+-----------------+
| rr              |
| soa             |
+-----------------+
2 rows in set (0.00 sec)
mydns用のユーザーを作成する。
#
mysql> SELECT user, host, password, Super_priv FROM mysql.user;
+------+----------------------+----------+------------+
| user | host                 | password | Super_priv |
+------+----------------------+----------+------------+
| root | localhost            |          | Y          |
| root | 127.0.0.1            |          | Y          |
| root | ::1                  |          | Y          |
|      | localhost            |          | N          |
+------+----------------------+----------+------------+
6 rows in set (0.00 sec)

#データベースmydnsに対して、全ての権限を持ったユーザー(全てのホストからのアクセス許可)
mysql> GRANT ALL ON mydns.* TO 'mydns'@'%' IDENTIFIED BY 'mydns';
Query OK, 0 rows affected (0.01 sec)

#localhostからの接続を許可する
GRANT ALL ON mydns.* TO 'mydns'@'localhost' IDENTIFIED BY 'mydns';

#反映
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

#確認
mysql> SELECT user, host, password, Super_priv FROM mysql.user;
+-------+----------------------+-------------------------------------------+------------+
| user  | host                 | password                                  | Super_priv |
+-------+----------------------+-------------------------------------------+------------+
| root  | localhost            |                                           | Y          |
| root  | 127.0.0.1            |                                           | Y          |
| root  | ::1                  |                                           | Y          |
|       | localhost            |                                           | N          |
| mydns | %                    | *B7B4811564198A1572E55AA11AAFADBA7A000BFC | N          |
| mydns | localhost            | *B7B4811564198A1572E55AA11AAFADBA7A000BFC | N          |
+-------+----------------------+-------------------------------------------+------------+
■手順3)mydnsの設定ファイルを編集する
mydnsの設定ファイルを編集する。
#
view /etc/mydns.conf

#先程作成したユーザー名やパスワードを設定する
db-host = localhost             # SQL server hostname
db-user = mydns                 # SQL server username
db-password = mydns             # SQL server password
database = mydns                # MyDNS database name

#
rr-where = aux>0   # aux が 0 のレコードにはラウンドロビンしないようにするため
■手順4)起動する バックグラウンドで起動する
UDP53ポートで待ち受け開始される。(必要に応じてiptablesを変更する)
#
/etc/init.d/mydns start
OR
#
mydns -b
OR
mydns -background

#プロセスの確認
# ps aux|grep mydns
mydns     2858  0.0  0.0 123344  1520 ?        Ss   18:04   0:00 mydns -b
mydns     2859  0.0  0.0 123640  1312 ?        S    18:04   0:00 mydns -b
root      2861  0.0  0.0 107456   940 pts/0    S+   18:04   0:00 grep mydns
■手順5)webからの管理画面の設定
インストール時に用意されているadmin.phpを利用します。
#管理画面用のphpの配置
cp /usr/share/mydns/admin.php /var/www/html/
admin.phpにデータベースの接続情報を記述します。
#36行目辺りのデータベース接続情報を変更する
vi /var/www/html/admin.php

$dbhost = "localhost";
$dbuser = "作成したユーザー名";
$dbpass = "作成したユーザーのパスワード";
$dbname = "mydns";
■手順6)手順5で設置したWeb用の管理画面からホストの登録を行う。

先程設定したadmin.phpにアクセスすると、 ホストの登録画面が表示されると思いますので、
そこに次の画像用に入力してください。
 (一般的なDNS情報の登録と同じ手順になるかと思います。)

※Aには、「example.com.」と感じに、最後にドットを付けるのを忘れずにド━(゚Д゚)━ン!!
※aux値はラウンドロビン時の重み値になる。値が小さいほど振り分けられる。
0の場合にはそのサーバーのみの振り分けになる。ただし、/etc/mydns.confで、rr-where = aux > 0の記述が無い場合のみ

入力後、「Add new SOA」を押すと、ホストの登録が完了します。
完了すると、下に「Add new RR」という行の枠が出てきている思います。

そこに、問い合わせがあったホストと紐付けたいIPアドレスの登録を行います。
今回はslaveサーバー2台のIPアドレスを「server1.example.com」というホストに紐付け、
ラウンドロビンを行いたいと思います。

2台分の情報を入力し終わると、次のようになっているかと思います。


■手順7)MyDNSの動作確認

MyDNSサーバーとは別のサーバーからhost,nslookup,digなどを行い、
MyDNSに登録した「server1.example.com」というホストが正しく名前解決が行われるか確認する。

まず、接続を行うサーバーの/etc/resolv.confの編集を行い、
DNSサーバーをMyDNSサーバーへ向けます。

/etc/resolv.confには、そのサーバーが利用するDNSサーバーの情報が書かれています。
ここに今回設定したMyDNSサーバーのIPアドレスを記述することで、
MyDNSサーバーを経由するようになります。

記述の方法は、次のようになっています。
nameserver IPアドレス
最大で3つまで登録が可能で、上から順番に問い合わせが実行されます。
ここのIPアドレスを今回のMyDNSサーバーのIPアドレスに変更します。

注意点として、情報をMyDNSサーバーだけの情報にすると、
MyDNSサーバーに登録されていないホストは全てエラーになってしまいます。

とりあえず、/etc/resolv.confのnameserver行の一番上に、 今回のMyDNSサーバーのIPアドレスを指定しておけば問題ないかな?
#一番上に追加
nameserver MyDNSサーバーのIPアドレス
次に、実際にMyDNSへ問い合わせを行います。 kagoya vpsで、OSの選択時に、最小単位のインストールを行った場合には、 host,nslookup,digがインストールされていなかったので、インストールを行う。
#host,nslookup,digのインストール
yum install bind-utils
MyDNSへ問い合わせてみる+(0゚・∀・) + ワクテカ +
#
host server1.example.com
server1.example.com has address slave1サーバーIPアドレス
server1.example.com has address slave2サーバーIPアドレス

#
nslookup server1.example.com
Server:         MyDNSサーバーIPアドレス
Address:        MyDNSサーバーIPアドレス#53

Name:   server1.example.com
Address: slave1サーバーIPアドレス
Name:   server1.example.com
Address: slave2サーバーIPアドレス

(゚∀゚)キタコレ!!
■手順8)PHPからの動作確認
手順7でMyDNSサーバーが正しく動作していることが確認できたので、
次はPHPから接続した際に正しく動いているか確認したいと思います。

slave1とslave2どちらに繋がったのか確認する為に、
面倒なのでslave2のMySQLだけに次のユーザーを作成しておきます:(;゙゚'ω゚'):

GRANT ALL ON *.* TO 'server2'@'%' IDENTIFIED BY 'パスワード';
次のプログラムは、MySQLに接続しユーザー名が「server2」の情報を取得して表示するプログラムになっています。
<?php
$link = mysql_connect('server1.example.com', '接続ユーザー名', '接続ユーザーのパスワード');
if (!$link) {
    die('接続失敗です。'.mysql_error());
}

$db_selected = mysql_select_db('データベース名', $link);
if (!$db_selected){
    die('データベース選択失敗です。'.mysql_error());
}

$result = mysql_query("SELECT user, host, password, Super_priv FROM mysql.user WHERE user = 'server2';");

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    var_dump( $row["user"] . ":" . $row["host"]);
}

mysql_free_result($result);
?>
このプログラムをphpが動くサーバーで数十回実行すると、
次のような結果になります。

「server2:192.168.0.5」と表示されている場合には、slave2に繋がっている事を表します。
11回目の実行時に、何も表示されていませんが、これはSELECTと一致するデータが無かったという事なので、
slave1に繋がっている事を表しています。( ´∀`)bグッ!

手順6のホスト設定時に、slave1,slave2の設定で、IPアドレスの横にある値に、
slave1に100、slave2に10を入力したと思います。
この値がDNSラウンドロビンの振り分け時の重み(aux)値になり、
今回の設定では1:10となるので、10回に1回slave1に振り分けるという意味になります。

値が小さいほど、振り分けられる確立が高くなります。
0の場合には、そのサーバーのみに振り分けられるようになる。
※ただし、/etc/mydns.confで、rr-where = aux > 0の記述が無い場合のみ
#1回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#2回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#3回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#4回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#5回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#6回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#7回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#8回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#9回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#10回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#11回目
php /var/www/html/test.php
#12回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
※/etc/resolv.confでMyDNSを経由するようになっているサーバーで行うこと
以上(`・ω・´)ゞビシッ!!

そういえば、何かパッチを当てないとDNSラウンドロビンでの重み付けの振り分けが出来ない!!ヽ(`Д´)ノプンプン
みたいなことが結構書かれていましたが普通に出来ていたのは・・・なぜだっ!!
と、疑問に思ってインストール情報を見てみると
次のように書かれていて、URLの先を飛んでみると、
こっちの公式ではなくて、使っているMyDNSはこっちだったみたいです((((;゚Д゚))))ガクガクブルブル
MyDNSは2006年から開発が止まっているけど、MyDNS-ngは今でも開発が続いてるみたいで、
こっちならデフォルトでDNSラウンドロビンの重み付けも使えるってことなのかな?(´ヘ`;)ウーム…

Name        : mydns
Arch        : x86_64
Version     : 1.2.8.31
Release     : 1.el6
Size        : 267 k
Repo        : installed
From repo   : epel
Summary     : A Database based DNS server
URL         : http://mydns-ng.com/
License     : GPLv2+
Description : A nameserver that serves records directly from your database.

参考URL

0 件のコメント:

コメントを投稿