Ubuntu Weekly Recipe

第361回 Sensuでサーバーのリソースを可視化しよう

この記事を読むのに必要な時間:およそ 9 分

(読者がじゃぶじゃぶ可視化したくなるようなメトリクス心を煽りまくるリードテキスト。)

迫り来るクライシスに備えて

Recipeの第359回では水野さんが「Muninでサーバーのリソースを可視化しよう」と題して,継続的なメトリクスの収集と可視化もまた,障害の予防や振り返りにとって重要であることを説いてくれました。

ロードアベレージやメモリ・ディスクの使用量など数値化でき,その時間変化が重要な情報に対して,Muninはとても便利なツールです。しかし世の中にある監視したいものすべてが数値化できるとは限りません。サービスの死活,ファイルのチェックサム,ハードウェアのステータス,うつろいやすい彼女注1の気持ち。その一瞬の輝きが重要な定性的な情報を,継続的に監視したい場合もあるでしょう注2)⁠

注1)
サーバーのことです。
注2)
それNagiosでいいんじゃない? と思った人は,きっとNagiosでいいと思います。一番良いツールは,使う人にとってフィーリングが合っているツールですから。

さらに最近はクラウド上に何台ものインスタンスを立ち上げたり,そのインタンス上でもDockerやLXCで複数の仮想環境を立ち上げることも一般的になってきました。もちろん仮想環境自身も監視対象になり得ますので,モニタリングツールのエージェント・クライアントをインストールすることになるでしょう。しかしクライアントをインストールするたびに,モニタリングサーバーの設定を書き換えるのは不便です。というか忘れてしまいそうです。

そんな方に向けて,今回は「Sensu」を紹介します。

モニタリングフレームワーク「Sensu」

今回紹介するSensu注3はRuby製のモニタリングフレームワークやモニタリングルーターと呼ばれるツールです。情報を収集するSensu Serverと,監視対象のサーバーにインストールするSensu Clientに加えて,収集した情報を保持するRedis,RESTインターフェースを提供するSensu API,これら各コンポーネント間のメッセージ通信を担当するRabbitMQからなり,以下のような特徴を持っています。

注3)
ロゴからもわかる通り,元ネタは日本語の「扇子」です。
  • 設定ファイルはすべてJSONで小分けも可能
  • 監視やメトリクス用のプラグインは好みの言語を利用できる
  • NagiosのNRPEプラグインも流用できる
  • APIやExternal Inputといった機能で外部からの操作が可能
  • 監視結果をIRCやSlackといった外部のサービスへ整形して転送する機能
  • SSLを用いたセキュアな通信
  • スケールアウトや多重化が容易な自由度の高いコンポーネント構成

SensuそのものにはWebブラウザー向けのフロントエンドはありません。以前はSensu Dashboardと言うSinatraを使ったフロントエンドが存在していたのですが,現在はGo言語とAngular JSを使ったUchiwa注4の利用が推奨されています。

注4)
もしかしたらお気づきかもしれませんが「団扇」です。0.3.0より前はNode.jsを使っていました。

また収集したデータをグラフ化するには,各種時系列データベースや可視化ツールを使う必要があります。

Sensuそのものが提供するのは,モニタリングの「コア」の部分だけです。言い換えるとこのコアに,他のツールを組み合わせることで,より自分好みの監視システムを構築できるということです。

図1 結果的に今回はこういう画面になる

図1 結果的に今回はこういう画面になる

Sensuのセットアップ

Sensuには最初からChefのクックブックやPuppetのモジュールが用意されているため,これらの構成管理ツールを使ったインストールが一般的です。ただし今回のRecipeでは,何をどこにインストールするか把握するためにも,手作業でパッケージ一式をインストールする方法を説明します。

ちなみにここではSensu ServerやAPI,Uchiwaなどメトリクスの収集や監視,視覚化を担当するマシンを「サーバー」⁠監視対象のマシンを「クライアント」と呼ぶことにします。またサーバーにもSensu Clientをインストールして自分自身を監視させます。

サーバーの下準備

まずはSensu Server側のセットアップ方法から説明しましょう。クライアントやサーバーとRabbitMQはSSLで通信します。そのためはじめに証明書を作っておきます。

$ cd /tmp
$ wget http://sensuapp.org/docs/0.16/tools/ssl_certs.tar
$ tar -xvf ssl_certs.tar
$ cd ssl_certs
$ ./ssl_certs.sh generate

serverディレクトリにRabbitMQサーバー用の証明書が,clientディレクトリにSensu用の証明書がそれぞれ作成されます。

次にRabbitMQとRedisをインストールします。

$ sudo apt install rabbitmq-server redis-server

さらに先程作成した証明書を使って,RabbitMQのSSLの設定をしましょう。

$ sudo mkdir -p /etc/rabbitmq/ssl
$ sudo cp sensu_ca/cacert.pem server/cert.pem server/key.pem /etc/rabbitmq/ssl

/etc/rabbitmq/rabbitmq.configを作成し次のように編集します。

[
    {rabbit, [
    {ssl_listeners, [5671]},
    {ssl_options, [{cacertfile,"/etc/rabbitmq/ssl/cacert.pem"},
                   {certfile,"/etc/rabbitmq/ssl/cert.pem"},
                   {keyfile,"/etc/rabbitmq/ssl/key.pem"},
                   {verify,verify_peer},
                   {fail_if_no_peer_cert,true}]}
  ]}
].

ここにもあるようにRabbitMQのSSL接続時の待ち受けポート番号を5671に設定しています。このポートのみ,クライアントからアクセスする必要があるため,必要に応じてファイヤーウォールなどの設定を変更しておいてください。SSLではない通常のポートは5672です。こちらは特に設定していなくても最初から待ち受けています。Sensu Serverと同じホストにクライアントも用意する場合は,5672を使うのもありでしょう。また,設定ファイルの最後の「.」をお忘れなく。

RabbitMQを再起動したうえで,Sensu用の設定をいくつか行います。mypassはパスワードです。適宜変更してください。

$ sudo service rabbitmq-server restart
$ sudo rabbitmqctl add_vhost /sensu
$ sudo rabbitmqctl add_user sensu mypass
$ sudo rabbitmqctl set_permissions -p /sensu sensu ".*" ".*" ".*"

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入