もなかアイスの試食品

「とりあえずやってみたい」そんな気持ちが先走りすぎて挫折が多い私のメモ書きみたいなものです.

CentOS7で開発環境用のDNSサーバを構築した話

はじめに

とあるサービスを作っている最中に負荷について調べていたところ、将来的にDBの負荷分散が必要になる可能性があった。

サービスはAWS上に構築するため、DBの負荷分散にはリードレプリカを利用し、DBのアクセスを振り分ける感じになる。

DBの負荷分散を想定してアプリを制作していなかったので、アプリの改造か必要かどうかの確認や改造後の動作確認が必要になり、DBアクセスをロードバランスする(またはそれっぽい)仕組みを開発環境に構築することにした。

マスターDBとリードレプリカなどのDBへのアクセスの振り分けについては、以下の方法があると思う。

  1. TCPのロードバランサ
  2. DNSを使ったなんちゃってロードバランサ(DNSラウンドロビン
  3. Pgpool-Ⅱを使う(DBがPostgreSQLのとき)

Pgpool-Ⅱを使う場合、Pgpool-Ⅱの置き場所をドコにしたら良いのか?EC2を1台増やさないといけないのでは?っと思ったので、あまり調べもせずに除外

最初にNICを2つ持ったCentOS7仮想マシンを用意して、ロードバランサを構築しようとしたけれども、上手く行かなかったので断念

ということもあって、本番環境ではRoute53にマスターDBとリードレプリカのレコードセットを用意することにして、開発環境にはRoute53を同じ動作をしてもらうDNSサーバを構築することにした。

ちなみにDNSラウンドロビン方式だと、Webアプリケーション(SpringBoot)も接続先を切り替える改造が必要で、それについては別の記事を参照

monakaice88.hatenablog.com

目次

想定している本番環境

想定している本番環境は以下の感じ。

f:id:monakaice88:20180728164600p:plain

この中のRoute53の役割と同じような動作をするDNSサーバを構築するのが目的

バージョン・IPアドレス

  • Virtual Box 5.2.28
  • Vagrant 2.2.4
  • CentOS 7
  • bind 9.9.4

  • IPアドレス・名前

    • マスターDB
      • 192.168.35.10
      • DNS名:updatable-db.sample.internal
    • スレーブDB
      • 192.168.35.11
      • DNS名:read-only-db.sample.internal
    • DNSサーバ
      • 192.168.35.20

bindのインストール

まずCentOS7にbindをインストールする。

sudo yum update -y
sudo yum install -y bind bind-utils

bindの設定ファイルの修正

設定ファイル「/etc/named.conf」を修正する。

差分のみ記載

options {
    // ListenするIPを修正
    listen-on port 53 { 127.0.0.1; 192.168.35.0/24; };

    // 問い合わせを許可するIP・ホストを修正
    allow-query     { localhost; 192.168.35.0/24; };

    // dnssecの機能を無効。(なんで無効にしたか覚えていない・・・)
    // 参考にしたサイトの設定をそのまま持ってきたかも
    // 有効のままでも問題ないかも
    dnssec-enable no;
    dnssec-validation no;

    // 追加。構築したDNSで名前解決できない場合は、本来使用しているDNSに転送
    forwarders {
        192.168.xxx.xxx;
        xxx.xxx.xxx.xxx;
    };
    forward only;
};

// 正引き
zone "sample.internal" IN {
    type master;
    file "sample.internal.zone";
};

// 逆引き
zone "35.168.192.in-addr.arpa" {
    type master;
    file "35.168.192.in-addr.arpa.rev";
};

正引き・逆引き設定ファイルの作成

正引き設定設定を「/var/named/sample.internal.zone」に記載する。

$TTL    3600

@       IN      SOA     sample.internal. root.sample.internal.    (
        2018061001
        3600
        900
        604800
        86400
)

                        IN      NS      ns.sample.internal.
ns                      IN      A       192.168.35.20
read-only-db            IN      A       192.168.35.11
updatable-db            IN      A       192.168.35.10

逆引き設定を「/var/named/35.168.192.in-addr.arpa.rev」に記載する。

$TTL 3600

@                IN      SOA sample.internal. root.sample.internal. (
                         2018061001 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)

                 IN      NS     ns.sample.internal.
20               IN      PTR    ns.sample.internal.
11               IN      PTR    read-only-db.sample.internal.
10               IN      PTR    updatable-db.sample.internal.

作成した設定ファイルの所有者を変更する。

sudo chown named:named /var/named/sample.internal.zone
sudo chown named:named /var/named/35.168.192.in-addr.arpa.rev

NetworkManagerの設定の変更

リソルバを固定するため、「/etc/NetworkManager/NetworkManager.conf」の26行目あたりにあるDNSの設定を変更する。

[main]
#plugins=ifcfg-rh,ibft
dns=none

変更後は、NetworkManagerを再起動する。

sudo systemctl restart NetworkManager

「/etc/resolv.conf」の設定を変更する。

nameserver 192.168.35.20

おわりに

本番環境のRoute53と同じ動作をするための開発環境用のDNSサーバを構築できた。

初めてのDNSサーバの構築で、DNSの設定だけではなく、NetworkManagerやらresolv.confを修正しないといけなかったので意外と時間が掛かった気がする。

構築したDNSサーバを使用するときは、PCのDNSサーバの設定を変更する必要あり。

WindowsDNSサーバの変更

support.t-com.ne.jp

MacDNSサーバの変更

pc-karuma.net