Amazon Linux 2 に elasticsearchのbenchmarkツールrallyをインストールして、Amazon Elasticsearch Serviceの性能評価を行う.

# Amazon Linux 2 に elasticsearchのbenchmarkツールrallyをインストールして、Amazon Elasticsearch Serviceの性能評価を行う.


Amazon Elasticssearch Serviceのパフォーマンスを調査する為に、Elasticsearchが提供するベンチマークツールの[rally](https://github.com/elastic/rally)を導入したEC2インスタンスを立ち上げ、性能評価を行います。

AMIは、最近発表された
`Amazon Linux 2 LTS Candidate AMI 2017.12.0 (HVM), SSD Volume Type - ami-7707a10f`
を利用してみます.

rallyは、python3上で動作する為、python3をインストールが必要になります. 
AMIとして利用するAmazon Linux2に標準でインストールされているpythonは、version2系(`Python 2.7.5`)の為、python3系をインストールします。

```
$ sudo amazon-linux-extras install python3
$ python3 --version
Python 3.6.2
```

rally用のpython3環境とする為、python3の仮想環境を作ります.

```
$ python3 -m vent .py-esrally-venv
$ source .py-esrally-venv/bin/activate
```

rallyのインストール,実行時に不足するライブラリをインストールします.

```
$ sudo yum install gcc python3-devel git
```


rallyをインストールします.

```
(.py-esrally-venv) $ pip3 install esrally
(.py-esrally-venv) $ esrally configure
 # Press Enter to skip. 
```


elasticsearch serviceへのアクセスは、 Signature Version 4でアクセスする必要がある為、rallyから直接接続するすることができません. そこで Elasticsearch serviceにアクセスする為のproxyを立ち上げます.
今回は、 nodeベースのproxy [aws-es-proxy](https://github.com/joona/aws-es-proxy)を利用します.

nodeをインストールする為にnvmのインストールを行い、その後、nodeをインストールし、 aws-es-proxyを導入します. 

```
(.py-esrally-venv) $ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
(.py-esrally-venv) $ source .bashrc
(.py-esrally-venv) $ nvm install  v8.9.3
(.py-esrally-venv) $ npm init
(.py-esrally-venv) $ npm install --save aws-es-proxy
```

proxyを起動します.
なお、aws credentials情報(access_key_id, aws_secret_access_key)は、aws cliで設定しておいてください. 

```
(.py-esrally-venv) $ node_modules/aws-es-proxy/bin/aws-es-proxy --port 9200 --profile default --region [region]  [endpoint]
```


proxy経由でElasticsearch Serviceにアクセスできることを確認します.

```
(.py-esrally-venv) $ curl http://localhost:9200/
```



rallyを実行します. target-hostsとして、proxyのアドレスを指定します。

```
(.py-esrally-venv) $ esrally --pipeline=benchmark-only --target-hosts=localhost:9200
```

```
    ____        ____
   / __ \____ _/ / /_  __
  / /_/ / __ `/ / / / / /
 / _, _/ /_/ / / / /_/ /
/_/ |_|\__,_/_/_/\__, /
                /____/

[INFO] Writing logs to /home/xxxxx/.rally/logs/rally_out_20171225T052238Z.log

************************************************************************
************** WARNING: A dark dungeon lies ahead of you  **************
************************************************************************

Rally does not have control over the configuration of the benchmarked
Elasticsearch cluster.

Be aware that results may be misleading due to problems with the setup.
Rally is also not able to gather lots of metrics at all (like CPU usage
of the benchmarked cluster) or may even produce misleading metrics (like
the index size).

************************************************************************
****** Use this pipeline only if you are aware of the tradeoffs.  ******
*************************** Watch your step! ***************************
************************************************************************
    :
```


* 参考
利用させていただいたproxy. 
https://github.com/joona/aws-es-proxy 
esrallyのドキュメント 
https://esrally.readthedocs.io/en/latest/index.html

* 残件 
 Amazon Elasticsearch Serviceの構成変更での性能評価を目的としている為、異なるproxyを利用する必要はないと想定しているが、go言語で実装された [aws-es-proxy](https://github.com/abutaha/aws-es-proxy)を使った場合の比較などもやっておくべきかもしれない. proxyで、パフォーマンスに差が出ると、性能指標の基準が低くなってしまうはず.. 
 trackを指定することで、異なるデータパターンでの評価を行うことができるので、サービスでの利用方法に近いtrackでの評価を実施すべき..デフォルト(オプション指定無)は、`geonames`.


* 備考
インスタンスタイプが`t2.micro`だと、途中で異常終了してしまうようです. 評価中、CPU Creditを、使い切って途中で異常終了しました.
また、Amazon Elasticsearch Service側の構成として、簡単に1台で立ち上げられますが、1台構成の場合、Statusが`Yellow`の為、デフォルトでは、測定できません。 以下のようなERRORを出力して、測定が中断します.
`[ERROR] Cannot race. ('Could not execute benchmark', Cluster did not reach status [green]. Last reached status: [yellow])` 
どうしても１台構成で実行する場合は、rally実行時に、 `--cluster-health=yellow` optionを付与する必要があります。