ども、 cloudpackかっぱ (@inokara) です。

はじめに

Sensu のメトリクス要員としてもはやデフォルトな Graphite ですが、バックエンドとなる carbon-cache や whisper のスケールに頭を悩ませている方々は多いようです。そんな中でストレージ部分を Cassandra に置き換える為の cyanite というアプリケーションが公開されているので試してみました。

cyanite とは

プロジェクト、参考

改めて cyanite とは

  • 読み方は「サイアナイト」
  • Clojure にて実装されている(Clojure とは JVM 上で動作する LISP 言語の一つ?)
  • 実行時には jar を利用する
  • 設定は YAML で記述する
  • graphite-web のプラグインとして graphite-cyanite も存在する
  • ざっくり言うと carbon-cache の代替としてメトリクスを受け付けて Cassandra に保存する役目

イメージ

従来の構成と cyanite と Cassandra の組み合わせは以下のようなイメージ。
graphite 従来の構成と cyanite と Cassandra の組み合わせ: イメージ図

ストレージ部分を whisper から Cassandra に置き換えることで Cassandra の可用性とスケーラビリティを享受出来るという算段…(多分)

とりあえず使ってみる

今日のゴール

  • Cassandra にメトリクスが保存されていることを確認する

環境

  • CentOS 6.6
  • Cassandra 2.0.12(cyanite は Cassandra 2.0 以上が必要となります)
  • JDK 1.7.x 以上(cyanite の JAR を生成する際に 1.6 系だとエラーになります)
  • 既に Graphite 環境は構築済み

JDK のセットアップ

yum -y install java-1.7.0-openjdk.x86_64

Cassandra のセットアップ

cat << EOT > /etc/yum.repos.d/datastax.repo
[datastax]
name = DataStax Repo for Apache Cassandra
baseurl = http://rpm.datastax.com/community
enabled = 1
gpgcheck = 0
EOT
yum -y install dsc20.noarch cassandra20.noarch

Cassandra に Keyspace を定義しておく

事前に Cassandra にスキーマを流し込んでおきましょう。

cat << EOT > /tmp/test.cql
CREATE KEYSPACE metric WITH replication = {
  'class': 'SimpleStrategy',
  'replication_factor': '1'
};

USE metric;

CREATE TABLE metric (
  period int,
  rollup int,
  tenant text,
  path text,
  time bigint,
  data list,
  PRIMARY KEY ((tenant, period, rollup, path), time)
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  index_interval=128 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='NONE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'LZ4Compressor'};
EOT
#
cqlsh < /tmp/test.cql

cyanite のビルド

cd /usr/local/bin
wget https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein
cd /opt
# git がインストールされていない場合には事前にインストールしておきましょう
git clone https://github.com/pyr/cyanite.git
cd cyanite
lein uberjar

lein uberjar を実行すると target/cyanite-0.1.3-standalone.jar が生成されます。

cyanite の設定と起動

以下のように cyanite の設定ファイルを YAML 形式で用意します。

carbon:
  host: "127.0.0.1"
  port: 2003
  rollups:
    - period: 60480
      rollup: 10
    - period: 105120
      rollup: 600
http:
  host: "127.0.0.1"
  port: 8080
logging:
  level: info
  console: true
  files:
    - "/tmp/cyanite.log"
store:
  cluster: 'localhost'
  keyspace: 'metric'
  chan_size: 10000 # defaults to 10000
  batch_size: 500 # defaults to 500

事前に carbon-cache を停止した上で cyanite を起動します。

sudo service carbon-cache stop
cd /opt/cyanite
java -jar target/cyanite-0.1.3-standalone.jar &

一応、起動の確認。

$ netstat -an | grep 2003
tcp        0      0 ::ffff:127.0.0.1:2003       :::*                        LISTEN

メトリクスを飛ばしてみる

以下のようにメトリクスを飛ばしてみます。

echo "`hostname -s`.hoge.huga.test `echo $RANDOM` `date +%s`" | nc 127.0.0.1 2003

以下のようなデバッグが出力されました。

DEBUG [2015-02-14 16:57:22,436] async-dispatch-23 - io.cyanite.store - Batch written

Cassandra にてメトリクスを確認

確認には cqlsh を利用します。

cqlsh

ほぼ SQL ライクにクエリを投げることが出来ます。

use metric;
select * from metric;

以下のように出力されました。
cqlsh を利用して Cassandra にてメトリクス確認: 動作確認

おお。

ということで…

今日のゴールには

  • 到達しました

今日の知見

  • Graphite のメトリクスは carbon-cache と whisper の一択ではない
  • cyanite というツールを使うことで Cassandra にもメトリクスを保存することが出来る

次回の予定

  • Graphite-web との連携

元記事はこちらです。
graphite のバックエンド(carbon-cache と whisper)を Cassandra に置き換える cyanite を試したメモ(1)