Dockerコンテナーで用意したZabbix ServerのバックエンドDBにAzure MySQLを利用する

先日 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を選択し、あとは流れ通りに進めれば簡単に作成できます。

screenshot.1498631332

インスタンス作成後 Overviewを確認し、接続情報を控えておきます。

screenshot.1498632146

ここでは下のパラメータを例にし進めていきます。

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アドレス帯を追加します。

screenshot.1498639179

Zabbix Server コンテナーの用意

次にOSを用意しDockerをあらかじめインストールしておきます。私はAzure Virtual MachineのCentOSを使用しました。そしてZabbixコンテナーを用意する上でofficialなDocker repositoryを確認してみると何だか色々あります。

screenshot.1498630324

これはZabbixのフロント部分やバックエンド部分毎にコンテナーが分けられていて、更に使われているミドル(Apache or NginX, MySQL or PostgreSQL)やZabbix Server,Proxy,Agent などで分かれています。Zabbix Server(Nginx & MySQL)を用意する場合は下記のコンテナーを使用する必要があります。

では早速ZabbixのDockerコンテナーをプロビジョニングしますが、その前に念のためDockerfileを確認しました。MySQL側の準備、データベースのCreateやスキーマのインポート処理が定義されていたので MySQL側の準備は接続の口だけ用意しておけば大丈夫そうでした。では Azure MySQLのパラメータをセットして docker run を実行しましょう。私は軽量なAlpine Linuxを選択しました。

$ 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

実行後に docker logs zabbix-server -f でログを確認しますが、Not available の状態が続くようだとMySQLの接続情報に間違いがある可能性が高いです。概ね1分もあれば起動できるはずです。

起動したら今度はZabbixのフロントエンドのコンテナーを起動します。こちらもMySQLの接続情報が必要になります。

$ 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

docker ps コマンドで zabbix-serverzabbix-web コンテナーが起動しているのを確認したらブラウザーから http://<ipAddress or DNS> にアクセスします。 デフォルトのユーザ、パスワードは Admin / zabbix です。(ちなみに日本語はデフォルトで用意されていたので切り替えが可能です。)

screenshot.1498641410

Zabbix Agent インストール

次にZabbix Server自身(自ホスト)の監視の為にZabbbix Agentを導入します。Zabbix Agentのコンテナー もありましたが監視したいのはDockerホストなので、ホストOSにインストールします。

$ 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

/etc/zabbix/zabbix_agentd.conf の以下の部分を変更します。(抜粋)

$ 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~~

Zabbix Agentサービスを起動します。

$ sudo systemctl start zabbix-agent

Zabbix Web から監視対象のホストを登録します。[Configuration] -> [host] -> [Create host] の順に進めます。

screenshot.1498713136

Zabbix serversのグループに所属していればデフォルトの監視テンプレートが充てられるのでこれはこのままにします。

  • Host nameZabbix server のままです。
  • Agent interfaces に DockerホストのIP addressを入力

最後に最下部の Enabled にチェックをいれて Add を押します。

screenshot.1498734933

しばらくすると、ZBX マークがグリーンになり、監視が開始されたことが確認できるようになります。

screenshot.1498735029

最後にこの構成にした経緯について

最後になりましたが、今回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

Be the first to comment

コメント投稿

Your email address will not be published.


*