こんにちは。技術基盤部の磯野です。 弊社ではここ数年、HOME'Sのクラウド化やマイクロサービス化を推進しています。
アプリケーションのクラウドサービスへの移行に関してはそろそろ終わりが見えてきているのですが、 マイクロサービスに関してはまだまだ道半ばということもあり、推進していくにあたって、 各サービス間の依存関係やトレース情報を可視化する手段としてzipkinをAWS上に試験的に導入してみました。
今回はZipkinサーバーの導入までの手順についてまとめたいと思います。
Zipkin とは
分散環境における各サービスの呼び出し状況を収集・可視化できるシステムです。
文字だけだとよくわかりませんが、サービス間の呼び出しをこんな感じで可視化できるサービスです。
※個人環境のデータです。
データストレージの選択
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内の構成を作る作業を行います。
サービスのインストール
MySQLの設定
MySQL5.6で利用できるので、今回はMySQL5.6互換なAuroraを利用します。
※Auroraの起動方法やセキュリティグループの設定などについては割愛します。
まず、新規にパラメータグループを作り、innodb_file_formatをBarracudaに設定を行います。
作成したパラメータグループを指定して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編)の予定です。