こんにちは、AmazonESでElasticsearch2.3を使っての環境構築が終わった直後にElasticsearch5.1が利用可能になってショックを受けてる技術基盤部の磯野です。
ちょっとだけ時間ができたのでzipkinのバックエンドをAmazon Elasticsearch Serviceに差し替えてみました。
CassandraとElasticsearchどっちにしようかなぁと悩んでいたのですが、zipkinがいつの間にかElasticsearch Serviceに対応していたのでサーバー構築したくない病発症中のためノータイムでElasticsearch Serviceに決定しました。
まずは今回やったことまとめです。
Amazon Elasticsearch Serviceの起動
Elasticsearch domain nameはzipkin, Elasticsearch versionに(当時)最新の2.3を利用しています。
アクセスポリシー
以下のように設定しています。
zipkinの動いているEC2インスタンスのロールとsnapshotを取得するためのlambdaのロール、そしてkibanaの為に社内からのアクセスをIPで許可します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::[account-id]:role/zipkin-server", "arn:aws:iam::[account-id]:role/zipkin-snapshot-lambda" ] }, "Action": "es:*", "Resource": "arn:aws:es:ap-northeast-1:[account-id]:domain/zipkin/*" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:ap-northeast-1:[account-id]:domain/zipkin/*", "Condition": { "IpAddress": { "aws:SourceIp": "[office-ip-address]" } } } ] }
zipkinサーバーの設定
以前こちらで記載したのとほとんど変わりません、最新版をインストールし、必要な環境変数を指定して起動します。 ES_AWS_DOMAIN, ES_AWS_REGIONを指定することでインスタンスのIAMロール利用して自動的にホスト名を取得してくれます。
sudo STORAGE_TYPE="elasticsearch" ES_AWS_DOMAIN="zipkin" ES_AWS_REGION="ap-northeast-1" java -jar /opt/zipkin/zipkin.jar
zipkinサーバーのIAM Roleの設定
ES_AWS_DOMAIN, ES_AWS_REGIONからホスト名を取得するためにzipkin-serverのロールに権限付与が必要です。 (ホスト名[ES_HOSTS]で指定すればこの設定は不要です。)
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1484898974000", "Effect": "Allow", "Action": [ "es:DescribeElasticsearchDomain", "es:DescribeElasticsearchDomains" ], "Resource": [ "*" ] } ] }
設定を変更してみて
インスタンスの負荷の減少
見て分かる通り1/25前後で入れ替えています。 CPU負荷も減り、トレースデータを受け付けるインスタンスの台数も減らせています。
コスト削減
EC2インスタンスの台数を半分にしました。 またESについてはRDSの時よりも台数は増えましたが小さいインスタンスにしたため、コストとしては半分程度になっています。
検索高速化
MySQLの時に比較して高速にレスポンスが返却されるので負荷を気にせずに検索できます。
ServiceName,SpanNameの取得が遅い問題
MySQLの時はSQLのチューニングとテーブルにインデックスを張って高速化していたのですが、Elasticsearchのことがまだわかっていないので、どうしたらいいかわからず遅いままです。 検索と同様、チューニングできると思うので今後考えていきたいと思います。