
先日 Azure Database for MySQL,PostgreSQL が登場しました。(現時点ではpreview版になります。)
今までもAzureのMarketplacesにはDBaas(Database as a Service)としてMySQLはあったのですが、こちらはClearDB社が提供しているものでした。今回提供開始されたものはPublisherはMicrosoftとなります。今回こちらをZabbix ServerのバックエンドDBに利用してみたいと思います。
Azure MySQLの用意
まず Azure上にMySQLを用意します。下図のように MySQLを選択し、あとは流れ通りに進めれば簡単に作成できます。
インスタンス作成後 Overviewを確認し、接続情報を控えておきます。
ここでは下のパラメータを例にし進めていきます。
item | value |
---|---|
Server name | example.mysql.database.azure.com |
Server admin login name | your_user@example |
server admin login password | your_user_password |
Azure MySQL の Firewall Rules の許可設定
MySQLのインスタンスを用意したら、Firewall Rulesに接続を許可するIPアドレス帯を追加します。
Zabbix Server コンテナーの用意
次にOSを用意しDockerをあらかじめインストールしておきます。私はAzure Virtual MachineのCentOSを使用しました。そしてZabbixコンテナーを用意する上でofficialなDocker repositoryを確認してみると何だか色々あります。
これはZabbixのフロント部分やバックエンド部分毎にコンテナーが分けられていて、更に使われているミドル(Apache or NginX, MySQL or PostgreSQL)やZabbix Server,Proxy,Agent などで分かれています。Zabbix Server(Nginx & MySQL)を用意する場合は下記のコンテナーを使用する必要があります。
- zabbix/zabbix-server-mysql
- zabbix/zabbix-web-nginx-mysql
- mysql -> AzureのMySQLを使用するため今回は使用しない
では早速ZabbixのDockerコンテナーをプロビジョニングしますが、その前に念のためDockerfileを確認しました。MySQL側の準備、データベースのCreateやスキーマのインポート処理が定義されていたので MySQL側の準備は接続の口だけ用意しておけば大丈夫そうでした。では Azure MySQLのパラメータをセットして docker run
を実行しましょう。私は軽量なAlpine Linuxを選択しました。
[code]
$ docker run –name zabbix-server \
-e DB_SERVER_HOST=”example.mysql.database.azure.com” \
-e MYSQL_USER=”your_user@example” \
-e MYSQL_PASSWORD=”your_user_password” \
-d zabbix/zabbix-server-mysql:alpine-latest
[/code]
実行後に docker logs zabbix-server -f
でログを確認しますが、Not available
の状態が続くようだとMySQLの接続情報に間違いがある可能性が高いです。概ね1分もあれば起動できるはずです。
起動したら今度はZabbixのフロントエンドのコンテナーを起動します。こちらもMySQLの接続情報が必要になります。
[code]
$ docker run –name zabbix-web -t \
–link zabbix-server:zabbix-server \
-e DB_SERVER_HOST=”example.mysql.database.azure.com” \
-e MYSQL_DATABASE=”zabbix” \
-e MYSQL_USER=”your_user@example” \
-e MYSQL_PASSWORD=”your_user_password” \
-e PHP_TZ=”Asia/Tokyo” \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:alpine-latest
[/code]
docker ps
コマンドで zabbix-server
と zabbix-web
コンテナーが起動しているのを確認したらブラウザーから http://<ipAddress or DNS>
にアクセスします。 デフォルトのユーザ、パスワードは Admin / zabbix
です。(ちなみに日本語はデフォルトで用意されていたので切り替えが可能です。)
Zabbix Agent インストール
次にZabbix Server自身(自ホスト)の監視の為にZabbbix Agentを導入します。Zabbix Agentのコンテナー もありましたが監視したいのはDockerホストなので、ホストOSにインストールします。
[code]
$ sudo rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
$ sudo yum install –enablerepo=zabbix zabbix-agent
$ sudo sed -i “s/^enabled=1/enabled=0/g” /etc/yum.repos.d/zabbix.repo
[/code]
/etc/zabbix/zabbix_agentd.conf
の以下の部分を変更します。(抜粋)
[code]
$ sudo vim /etc/zabbix/zabbix_agentd.conf
~~snip~~
Server=172.XXX.XXX.XXX # zabbix-serverのdockerコンテナのip
ServerActive=172.XXX.XXX.XXX # zabbix-serverのdockerコンテナのip
Hostname=Zabbix server # ZabbixのWeb画面から登録する際のホスト名と同じにする必要があります。
~~snip~~
[/code]
Zabbix Agentサービスを起動します。
[code]
$ sudo systemctl start zabbix-agent
[/code]
Zabbix Web から監視対象のホストを登録します。[Configuration] -> [host] -> [Create host] の順に進めます。
Zabbix serversのグループに所属していればデフォルトの監視テンプレートが充てられるのでこれはこのままにします。
Host name
はZabbix server
のままです。Agent interfaces
に DockerホストのIP addressを入力
最後に最下部の Enabled
にチェックをいれて Add
を押します。
しばらくすると、ZBX
マークがグリーンになり、監視が開始されたことが確認できるようになります。
最後にこの構成にした経緯について
最後になりましたが、今回Zabbix Serverを用意するにあって 移設を見据えたZabbix環境の構築 をする必要がありました。というのもZabbixを構築する予定のホストOSには既にいくつかのアプリケーションが稼働していました。同じホスト上にZabbixを同居させるに至った理由はAzure Virtual Machineのランニングコストを抑える為です。ただし、これによる懸念としては高負荷によるパフォーマンスの低下や、サーバーメンテナンス時にホスト上のアプリケーションが全て使えなくなった際の業務インパクトが未知数でした。前者はインスタンスサイズのランクアップすることで対応できますが、後者の場合は別ホストを用意する必要があります。こういった要件からZabbix Serverを用意するには柔軟性が必要でした。そこででDockerなんてどっかーなーと思った次第です。はい、次。
ここまできて問題になるのが、ZabbixのバックエンドのDBについてです。将来的に可用性を確保するために冗長化構成にする可能性もあります。冗長化構成にすれば別々のインスタンスを用意する必要があるのでランニングコスト抑止の要件にそぐわない形になります。そこで今回はDBaaS である Azure MySQLを利用することにしました。デフォルトで可用性が確保できる上にランニングコストはプランにもよりますがインスタンスを2台分より大分安くなります。更にZabbixのフロントエンドはいくらでも構築し直せます。つまりZabbixの移設についてはフロントエンドのDockerコンテナをプロビジョニングし直すだけになり、Agentホスト側のZabbix Serverの宛先(zabbix-agentd.conf)の変更はAnsibleなどで一括で書き換えるという方法で楽ができそうだ、といった経緯がありました。
—
Kentaro Morone


コメント投稿