LIFULL Creators Blog

「株式会社LIFULL(ライフル)」の社員によるブログです。

Zipkinを導入してみた(サーバー編)

こんにちは。技術基盤部の磯野です。 弊社ではここ数年、HOME'Sのクラウド化やマイクロサービス化を推進しています。

アプリケーションのクラウドサービスへの移行に関してはそろそろ終わりが見えてきているのですが、 マイクロサービスに関してはまだまだ道半ばということもあり、推進していくにあたって、 各サービス間の依存関係やトレース情報を可視化する手段としてzipkinをAWS上に試験的に導入してみました。

今回はZipkinサーバーの導入までの手順についてまとめたいと思います。

Zipkin とは

分散環境における各サービスの呼び出し状況を収集・可視化できるシステムです。
文字だけだとよくわかりませんが、サービス間の呼び出しをこんな感じで可視化できるサービスです。 f:id:nextdeveloper:20160628165142p:plain ※個人環境のデータです。

データストレージの選択

Zipkinは標準で4つのデータストレージに対応しています。(InMemory, MySQL, Cassandra, Elasticsearch)
今回は試験的な導入ということもあり、運用面や金銭面も加味して、とりあえずMySQL(RDS-Aurora)で進めています。

以下に各項目について軽くまとめました。最終的にはElasticsearchもしくはCassandraに切り替えたいと考えています。

InMemory

永続化されないので確認的な利用以外では利用しにくい

MySQL

いいところ

わかりやすい RDSを利用すればほとんど管理コストがかからない

残念なところ

パフォーマンスに問題がある
書き込みは問題なかったが、読み込みは顕著に影響が出た
サンプリングレートをかなり下げているにもかかわらず、1日〜2日程度(数百万レコード)経過しただけで目に見えて検索が遅くなる
* r3.largeを利用していることも急激な速度低下の原因の一つだと思われる

Cassandra

いいところ

Expireを設定できるので明示的なデータ削除が必要ない
大量のデータでも高速に処理できる

残念なところ

マネージドサービスがあるわけではないので自分でインスタンスの管理をする必要がある
社内でのCassandraの評判が悪すぎる。誰も運用したくないみたい

Elasticsearch

いいところ

大量のデータでも高速に処理できる

残念なところ

Amazon Elasticsearch Serviceで利用できない
Amazon Elasticsearch Serviceはノード一覧をマスクした状態で返却するので、デフォルトのアダプタでは利用できない様子
マネージドサービスが利用できないので自分でインスタンスの管理をする必要がある

基本構成

まずは基本構成として、以下のようにする予定です。
今回は右側の管理用VPC内の構成を作る作業を行います。

f:id:nextdeveloper:20160628154521p:plain

サービスのインストール

MySQLの設定

MySQL5.6で利用できるので、今回はMySQL5.6互換なAuroraを利用します。
※Auroraの起動方法やセキュリティグループの設定などについては割愛します。

まず、新規にパラメータグループを作り、innodb_file_formatをBarracudaに設定を行います。

f:id:nextdeveloper:20160628154543p:plain

作成したパラメータグループを指定してAuroraインスタンスを起動します。
データベース名は標準でzipkinにしておくとZipkinサーバー起動時に指定しなくて済みます。

またzipkinに必要なテーブルを作ります。github上にsqlファイルがあるので、そちらを取得してsqlを流します。
{}で囲ってある部分は環境依存なので、必要に応じて変更してください。

$ sudo curl 'https://raw.githubusercontent.com/openzipkin/zipkin/master/zipkin-storage/mysql/src/main/resources/mysql.sql' -o /tmp/mysql.sql
$ mysql -h{zipkin_aurora_host} -u{zipkin_aurora_user} -p -Dzipkin < /tmp/mysql.sql

以下のファイルに注意事項が書いてあるので詳しくはこちらを参照してください。 https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql/README.md

zipkinのインストールと確認用の起動

EC2インスタンスを起動します。
セキュリティグループを設定する場合にはインバウンドで9410(scribe),9411(http)の2つのポートを解放しておく必要があります。
mysqlの設定時と同様{}で囲ってある部分は環境依存なので、必要に応じて変更してください。

$ sudo yum install mysql java-1.8.0-openjdk java-1.8.0-openjdk-devel
$ sudo alternatives --set java /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java
$ sudo mkdir /opt/zipkin
$ sudo curl -L 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec' -o /opt/zipkin/zipkin.jar
$ sudo STORAGE_TYPE="mysql" MYSQL_HOST="{zipkin_aurora_host}" MYSQL_USER="{zipkin_aurora_user}" MYSQL_PASS="{********}" java -jar /opt/zipkin/zipkin.jar

ブラウザから http://zipkinserver:9411/ を開くことでトップページにアクセスできます。

また、http://zipkinserver:9411/mappings にはURLのマッピング設定があります。
その中でも http://zipkinserver:9411/env は設定(環境変数、デフォルト値など)を返却してくれるので重宝します。
ただし、環境変数として渡したパスワードをマスクせずに返却するようなのでパスワードを利用する場合はアクセス制限した方がよさそうです。

supervisordのインストール

daemon化するためにsupervisordを入れてupstartの設定を追加しました。
※ pipをupgradeするとなぜか/usr/bin/pip → /usr/local/bin/pipになってしまうのでちょっと困ってます。

$ sudo pip install pip --upgrade
$ sudo /usr/local/bin/pip install supervisor

$ cat <<EOF | sudo tee /etc/init/supervisord.conf
description     "supervisord"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
exec /usr/local/bin/supervisord -n
EOF

$ mkdir /var/log/supervisor
$ mkdir /etc/supervisor.d
$ /usr/local/bin/echo_supervisord_conf | sudo tee /etc/supervisord.conf
$ cat <<EOF | sudo tee -a /etc/supervisord.conf
[include]
files = /etc/supervisor.d/*.ini
EOF
$ cat <<EOF | sudo tee /etc/supervisor.d/zipkin.ini
[program:zipkin]
command=java -jar zipkin.jar
directory=/opt/zipkin
autostart=true
autorestart=true
stopasgroup=true
logfile=/var/log/supervisor/zipkin.log
environment=STORAGE_TYPE="mysql",MYSQL_HOST="{zipkin_aurora_host}",MYSQL_USER="{zipkin_aurora_user}",MYSQL_PASS="{********}",SELF_TRACING_ENABLED="false"
EOF
$ sudo initctl start supervisord

これで万が一落ちても、supervisordが起動してくれます。
以上で基本的な設定は終了です。

おまけ

zipkinのすぐに使いそうな環境変数

環境変数 デフォルト値 説明
SELF_TRACING_ENABLED true falseにすることでzipkin自身のトレースを停止できる
COLLECTOR_SAMPLE_RATE 1.0 サンプリングレート 0.0〜1.0の範囲を指定。0にすればロギングを停止できる
COLLECTOR_PORT 9410 scribe用ポート
STORAGE_TYPE mem mem,cassandra,elasticsearch,mysqlから選択可能
MYSQL_HOST localhost 接続先MySQLホスト名
MYSQL_TCP_PORT 3306 接続先MySQLポート
MYSQL_USER - 接続先MySQLユーザー名
MYSQL_PASS - 接続先MySQLパスワード
MYSQL_DB zipkin 接続先MySQLデータベース
QUERY_PORT 9411 Webサーバーポート

すべての環境変数はこちらを参照してください。 https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server.yml

次回は、アプリケーションサーバーへの導入(PHP編)の予定です。