gdnsd†
オープンソースのグローバルロードバランサー(GSLB)。
ソースコードがGSLBとしては少なく、高速動作が可能となっている。
ただし、ソースコードを減らす為にロギング機能が省略されていたり、
細かいヘルスチェックはスクリプトの作り込みが必要な為、
GSLBとしてフル機能を使いこなすにはコツが必要なソフトウェアである。
gdnsdはGSLBとして通信事業者レベルの採用実績があったりする。
また、ソースコードが少ないので機能追加も比較的楽に実装出来る。
参考サイト†
構築環境†
- オフィシャル
- ドキュメント
Parameter | Server-A | Server-B |
OS | openSUSE Leap 42.3 | openSUSE Leap 42.3 |
IP | 10.0.0.1 | 10.0.0.2 |
USER | gdnsd |
VERSION | v2.4.0 |
PREFIX | /usr/lcoal/gdnsd-2.4.0 |
CONFIG | /usr/lcoal/gdnsd/etc/gdnsd/config |
ZONE | /usr/lcoal/gdnsd/etc/gdnsd/zones/$ORIGIN |
インストール†
- 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
- 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
- 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,
}
+
| | 設定の解説
|
詳細はgdnsdの公式ドキュメントに書いてある。
細かい設定パラメータも存在するので、作り込む場合は内容を一読した方が良い。
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 => #ヘルスチェックモジュール保存先
|
- 4. ゾーンファイル
gdnsdのDNSゾーンはレコード登録したいORIGINと同じ実ファイル名で作成する必要がある。
"gslb.test.org"のゾーンを作成する場合、
DNSゾーンファイルは「/usr/local/gdnsd/etc/gdnsd/zones/gslb.test.org」となる。
通常のDNSレコードの書式はBINDのゾーン記法と同じな為、今回は解説を割愛する。
- 5. 起動
事前に作成したサービスファイルを用いてgdnsdを起動させる。
gdnsdのログはsyslogのdaemonファシリティに出力されるので、
エラーで起動しない時は該当ログを確認する。
# systemctl unmask gdnsd.service
# systemctl enable gdnsd
# systemctl start gdnsd
ヘルスチェック†
ヘルスチェックを元にした広域負荷分散処理が、GSLBの本質機能となる。
gdnsdにもヘルスチェック機能が搭載されている為、
単体でGSLBとして十分に稼働させる事が可能である。
ヘルスチェックの挙動はコンフィグファイルに書いた後、
DNSゾーンファイルで特殊なレコード設定を行う事により、
DNSレコードを動的に変更する事が出来る。
レコード種類によっては、GSLBとして定義出来ない物もある為、
詳細についてはgdnsdの公式ドキュメントを確認する。