share facebook facebook2 twitter menu hatena pocket slack

2014.07.16 WED

Sensu から出力されるメトリクスデータ収集を Graphite の carbon-relay でパス毎に異なる Graphite サーバーの carbon-cache に保存してみる

川原 洋平

WRITTEN BY川原 洋平

cloudpack の 自称 Sensu芸人 の かっぱこと 川原 洋平@inokara)です。久しぶりに Graphite ネタです。

carbon-relay とは…

carbon-relay とは Graphite によるデータ収集をレプリケーションやシャーディングする機能。carbon-relay を使えば carbon-cache のスケールアウトとかお手軽に出来るようです。(但し、carbon-relay が SPOF に成りうるので別途冗長化等を検討する必要があるようです)

Graphite の各種コンポーネントについては下記のスライドで一目瞭然です。

解りやすいですね。また、設定あたっては以下の記事が解りやすかったです。

記事のタイトル、まさにそのまんまですね。


やりたいこと

ざっくりやりたいこと

Sensu Server の Graphite ハンドラから吐かれるメトリクスデータに関してパス毎に異なる carbon-cache に保存します。

以下のようなイメージです。(とりあえずテキストベース)

  • stats.hoge は Graphite ホスト A の carbon-cache
  • stats.huga は Graphite ホスト B の carbon-cache

これが出来るようになると Sensu Server にガッツリ集めたメトリクス情報をサービス毎等の carbon-cache に渡すパス毎で吐き出し先を分けることが出来て色々と嬉しいかもしれないですね。

やりたいことのイメージ

手書きですんません。

01


設定

追加の Graphite サーバーを構築しておく

  • ${additional_host}
  • Carbon Cache の各種 Listen ポートを 2003 から 2013 と 2004 から 2014 に変更しておく

/etc/carbon.conf

ここに書いてあるように Carbon Relay を使う場合には…

Carbon-cache and carbon-relay can run on the same host! Try swapping the default ports listed for LINE_RECEIVER_PORT and PICKLE_RECEIVER_PORT between the [cache] and [relay] sections to prevent having to reconfigure your deployed metric senders. When setting DESTINATIONS in the [relay] section, keep in mind your newly-set PICKLE_RECEIVER_PORT in the [cache] section.

とあるように carbon.conf を以下のように修正しました。

--- carbon.conf.bk      2014-07-01 04:59:09.128875195 +0000
+++ carbon.conf 2014-07-10 15:51:05.803815812 +0000
@@ -77,17 +77,17 @@
 MAX_CREATES_PER_MINUTE = 50

 LINE_RECEIVER_INTERFACE = 0.0.0.0
-LINE_RECEIVER_PORT = 2003
+LINE_RECEIVER_PORT = 2013

 # Set this to True to enable the UDP listener. By default this is off
 # because it is very common to run multiple carbon daemons and managing
 # another (rarely used) port for every carbon instance is not fun.
-ENABLE_UDP_LISTENER = False
+ENABLE_UDP_LISTENER = True
 UDP_RECEIVER_INTERFACE = 0.0.0.0
-UDP_RECEIVER_PORT = 2003
+UDP_RECEIVER_PORT = 2013

 PICKLE_RECEIVER_INTERFACE = 0.0.0.0
-PICKLE_RECEIVER_PORT = 2004
+PICKLE_RECEIVER_PORT = 2014

 # Set to false to disable logging of successful connections
 LOG_LISTENER_CONNECTIONS = True
@@ -225,9 +225,9 @@
 [relay]
 USER = carbon
 LINE_RECEIVER_INTERFACE = 0.0.0.0
-LINE_RECEIVER_PORT = 2013
+LINE_RECEIVER_PORT = 2003
 PICKLE_RECEIVER_INTERFACE = 0.0.0.0
-PICKLE_RECEIVER_PORT = 2014
+PICKLE_RECEIVER_PORT = 2004

 # Set to false to disable logging of successful connections
 LOG_LISTENER_CONNECTIONS = True
@@ -268,7 +268,7 @@
 #
 # If using RELAY_METHOD = rules, all destinations used in relay-rules.conf
 # must be defined in this list
-DESTINATIONS = 127.0.0.1:2004
+DESTINATIONS = 127.0.0.1:2014, ${additional_host}:2014

 # This defines the maximum "message size" between carbon daemons.
 # You shouldn't need to tune this unless you really know what you're doing.

ポイントとしては…

  • [cache] ディレクティブの LINE_RECEIVER_PORT を 2013 に修正
  • [cache] ディレクティブの UDP_RECEIVER_PORT を 2013 に修正
  • [cache] ディレクティブの PICKLE_RECEIVER_PORT を 2014 に修正
  • [relay] ディレクティブの LINE_RECEIVER_PORT を 2003 に修正
  • [relay] ディレクティブの PICKLE_RECEIVER_PORT を 2004 に修正
  • [relay] ディレクティブの DESTINATIONS に各 Carbon Cache の IP とポート番号を追加

/etc/carbon/carbon-relay.conf

/etc/carbon/carbon-relay.conf を以下のように作成。

[kappa-test]
pattern = ^stats.kappa-test.*
destinations = ${additional_host}:2014

[default]
default = true
destinations = 127.0.0.1:2014

上記の場合、stats.kappa-test.* のメトリクスは ${additional_host}:2014 の Carbon Cache に転送されます。このパス以外のメトリクスは 127.0.0.1:2014 の carbon-cache に転送されます。

carbon-relay や carbon-cache を再起動する

/etc/init.d/carbon-cache restart
/etc/init.d/carbon-relay restart

動作確認

とりあえず telnet と nc で…それぞれパスを変えて同じ ${carbon_relay_host} にメトリクスを投げてみます。

echo "stats.hoge-test `echo $RANDOM` `date +%s`" | nc ${carbon_relay_host} 2003

以下のように出力されます。

02

echo "stats.kappa-test `echo $RANDOM` `date +%s`" | nc ${carbon_relay_host} 2003

以下のように出力されます。

03

同一の ${carbon_relay_host} にメトリクスを投げていながら異なる Graphite サーバーで確認出来ます。

動作確認として telnet と nc コマンドを使いましたが、ここまでくれば Sensu からも同じようにメトリクスを投げることは可能かと思います。


さいごに

  • パス毎に異なる Graphite サーバーにメトリクスの出し分けは出来そう
  • でも、全てのパスを取っておきたい場合もありそうなので引き続き検証が必要
  • あと、負荷分散も出来ないか検証したい

元記事は、こちら