#author("2018-03-09T23:13:43+09:00","default:nowsky","nowsky")
*gdnsd [#p9c99800]
オープンソースのグローバルロードバランサー(GSLB)。
ソースコードがGSLBとしては少なく、高速動作が可能となっている。
ただし、ソースコードを減らす為にロギング機能が省略されていたり、
細かいヘルスチェックはスクリプトの作り込みが必要な為、
GSLBとしてフル機能を使いこなすにはコツが必要なソフトウェアである。
 
gdnsdはGSLBとして通信事業者レベルの採用実績があったりする。
また、ソースコードが少ないので機能追加も比較的楽に実装出来る。
~
*参考サイト [#h651c013]
-[[gdnsd:+http://gdnsd.org/]]
-[[GitHub gdnsd:+https://github.com/gdnsd]]
-[[gdnsdでかんたんGSLB:+https://qiita.com/jh1vxw/items/7ce5d14e9f964f001257]]
~
* 構築環境 [#f4cf0e44]
-[[オフィシャル:+https://github.com/gdnsd/gdnsd/releases/]]
-[[ドキュメント:+https://github.com/gdnsd/gdnsd/wiki]]
 
|LEFT:80|LEFT:180|LEFT:180|c
|CENTER:~Parameter|CENTER:~Server-A|CENTER:~Server-B|h
|&color(#2020ff){OS};|openSUSE Leap 42.3|openSUSE Leap 42.3|
|&color(#2020ff){IP};|10.0.0.1|10.0.0.2|
|&color(#2020ff){USER};|>|gdnsd|
|&color(#2020ff){VERSION};|>|v2.4.0|
|&color(#2020ff){PREFIX};|>|/usr/lcoal/gdnsd-2.4.0|
|&color(#2020ff){CONFIG};|>|/usr/lcoal/gdnsd/etc/gdnsd/config|
|&color(#2020ff){ZONE};|>|/usr/lcoal/gdnsd/etc/gdnsd/zones/$ORIGIN|
~
* インストール [#g603a033]
-&size(16){&font(b){1. インストール};};
gdnsdの最新機能を利用する為ソースからビルドする。
今回はバージョン管理が行える様にprefix指定を変更した上で、
シンボリックリンクで参照先を変更する。
 # zypper install libev4 libev-devel ragel
 # wget https://github.com/gdnsd/gdnsd/archive/v2.4.0.tar.gz
 # tar zxvf gdnsd-2.4.0.tar.gz
 # cd gdnsd-2.4.0
 # ./configure --prefix=/usr/local/gdnsd-2.4.0
 # make
 # make install
 
-&size(16){&font(b){2. 起動準備};};
gdnsdを動かす為に実行ユーザなどを作成する。
なお、gdnsdはsystemd起動に最適化されているので、今回はサービスファイルから起動を行う。
 # cd /usr/local
 # ln -s /usr/local/gdnsd-2.4.0 gdnsd
 # cd /etc
 # ln -s /usr/local/gdnsd/etc/gdnsd gdnsd
 # vi /usr/lib/systemd/system/gdnsd.service
 ---
 [Unit]
 Description=gdnsd Authoritative GSLB type DNS Server
 After=local-fs.target network.target syslog.service
 
 [Install]
 WantedBy=multi-user.target
 
 [Service]
 Type=notify
 NotifyAccess=all
 ExecStart=/usr/local/gdnsd/sbin/gdnsd -c /etc/gdnsd -f start
 ExecStop=/usr/local/gdnsd/sbin/gdnsd -c /etc/gdnsd stop
 
 # High security setting
 MountFlags=slave
 DevicePolicy=closed
 PrivateDevices=true
 PrivateTmp=true
 ProtectSystem=full
 ProtectHome=true
 
-&size(16){&font(b){3. コンフィグ};};
gdnsdはインストールディレクトリ内から固定参照でファイルを読み込んでいる。
今回は「/usr/local/gdnsd」にシンボリックリンクを張る形でインストールしている為、
設定ファイル名は「/usr/local/gdnsd/etc/config」にする必要がある。
コンフィグファイルにはヘルスチェック条件も書く事が出来るが、
権威DNSとしてのみ動かすならば、options項目のみ記述する事でgdnsdの起動テストが出来る。
なお、コンフィグのコメント接頭文字は"#(シャープ)"となる。
 # vi /usr/local/gdnsd/etc/config
 ---
 options => {
     username       => gdnsd,
     chaos_response => "GSLB",
     listen         => 0.0.0.0:53,
     http_listen    => 0.0.0.0:3506,
     log_stats      => 3600,
 #   tcp_threads    => 2,
 #   udp_threads    => 2,
 
     include_optional_ns    => true,
     disable_text_autosplit => false,
     zones_strict_data      => false,
     zones_rfc1035_auto     => false,
 
     state_dir              => /var/lib/gdnsd,
     run_dir                => /var/run/gdnsd,
     plugin_search_path     => /usr/local/gdnsd/lib64/gdnsd,
 }
#region(&color(#ff0000){設定の解説};)
詳細はgdnsdの[[公式ドキュメント:+https://github.com/gdnsd/gdnsd/wiki/GdnsdConfig]]に書いてある。
細かい設定パラメータも存在するので、作り込む場合は内容を一読した方が良い。
 username               => #gdnsdの実行ユーザ
 chaos_response         => #DNSのchaosクラス変更
 listen                 => #gdnsdのLISTENアドレス、ポート番号
 http_listen            => #ヘルスチェック画面のLISTENアドレス、ポート番号
 log_stats              => #gdnsdのクエリ統計データ出力秒
 tcp_threads            => #TCPクエリの実行スレッド数
 udp_threads            => #UDPクエリの実行スレッド数
 include_optional_ns    => #AUTHORITY-SECTIONにオプションのNSレコード注入
 disable_text_autosplit => #TXTレコードを255バイト毎に自動分割
 zones_strict_data      => #DNSゾーンデータのワーニングを無視
 zones_rfc1035_auto     => #DNSゾーンデータ変更時の自動リロード(RFC1035)の有効化
 state_dir              => #gdnsd一次フォルダ
 run_dir                => #gdnsdのPIDファイル保存先
 plugin_search_path     => #ヘルスチェックモジュール保存先
#endregion
 
-&size(16){&font(b){4. ゾーンファイル};};
gdnsdのDNSゾーンはレコード登録したいORIGINと同じ実ファイル名で作成する必要がある。
"gslb.test.org"のゾーンを作成する場合、
DNSゾーンファイルは「/usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org」となる。
通常のDNSレコードの書式はBINDのゾーン記法と同じな為、今回は解説を割愛する。
 
-&size(16){&font(b){5. 起動};};
事前に作成したサービスファイルを用いてgdnsdを起動させる。
gdnsdのログはsyslogのdaemonファシリティに出力されるので、
エラーで起動しない時は該当ログを確認する。
 # systemctl unmask gdnsd.service
 # systemctl enable gdnsd
 # systemctl start gdnsd
~
* ヘルスチェック [#g6be9422]
ヘルスチェックを元にした広域負荷分散処理が、GSLBの本質機能となる。
gdnsdにもヘルスチェック機能が搭載されている為、
単体でGSLBとして十分に稼働させる事が可能である。
 
ヘルスチェックの挙動はコンフィグファイルに書いた後、
DNSゾーンファイルで特殊なレコード設定を行う事により、
DNSレコードを動的に変更する事が出来る。
レコード種類によっては、GSLBとして定義出来ない物もある為、
詳細についてはgdnsdの公式ドキュメントを確認する。
 
-&size(16){&font(b){A. ラウンドロビン};};
#region(&color(#ff0000){設定内容};)
※作成中
#endregion