気持ちよくなるためのElasticsearchの使い方

## 前書き
みなさん、elasticsearch使ってますか？
そうです、あの便利で万能でたくさんデータが集まってる気がして気持ちよくなれるelasticsearchです。
N番煎じだと思われますが、この度rgnet[^1]で運用開始したelasticsearchのチューニングのお話をしたいと思います。

## 今回の機材/要件
- サーバー1台
- HDD: 500G / SSD: 1T
- ログデータ等を入れたい。冗長化を行うほど重要ではなく、機材もない。(1Node)
- 最低限入れたいデータはsyslog/auditログ/apacheログ

## インストール/クラスタ設定
インストールは[公式ドキュメント](https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html)を参考にelasticsearch,kibanaをインストールします。
今回はversion 6.3以降から無料となった[^2]X-Packという拡張機能を有効化したいと思います。X-Packを入れることにより、ユーザー認証やSSL、その他様々な機能が有効化されます。
クラスタについての設定は`/etc/elasticsearch/elasticsearch.yml`に格納されています。今回は以下のように設定しました。

```
cluster.name: rgroot-es
node.name: es.sfc.wide.ad.jp
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
xpack.security.enabled: true
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: /etc/elasticsearch/letsencrypt/live/es.sfc.wide.ad.jp/privkey.pem
xpack.security.http.ssl.certificate: /etc/elasticsearch/letsencrypt/live/es.sfc.wide.ad.jp/fullchain.pem
bootstrap.memory_lock: true
network.host: ::0
http.port: 9200
transport.host: ::0
transport.tcp.port: 9300
discovery.type: single-node
```

今回はX-PackのSSLの設定を追加で行いました。
また、elasticsearchにはproduction modeとdevelop modeがあり、`network.host`の設定がlocalhost意外であればproduction modeとして動作します。そのため、productionで利用する場合は必ず設定を行いましょう。

elasticsearchはjavaで動作しています。そのため、JVMの設定変更も忘れず行いましょう。設定ファイルは`/etc/elasticsearch/jvm.options`にあります。デフォルトでは`Xms`・`Xmx`が1Gで設定されているのでメモリに余裕があれば必ず上げておきましょう。

さらにswapの設定等細かい推奨設定がありますので[system設定の公式ドキュメント](https://www.elastic.co/guide/en/elasticsearch/reference/master/system-config.html)を確認しておきましょう。

(RBACなどに関しては今回は説明しないので[Security設定に関する公式サイト](https://www.elastic.co/jp/blog/getting-started-with-elasticsearch-security)を参考にしてください)

## indexのチューニング
ここまで行うとelasticsearchのクラスタがチューニングできた状態で起動することができると思います。

しかし、このまま利用開始するとindex healthが`yellow`となり、警告状態となると思います。 これはクラスターで運用することが前提となっており、デフォルトのshard数(冗長化の数)が3になっているからです。shardが3になっているのにもかかわらず、nodeの数が１のため、冗長化できずにアラートが出ている状態です。


### デフォルトのshard数の変更
今回はあまり重要ではないデータなので冗長化を行わないため、デフォルトのshardの数を１にしておきましょう(重要なデータがある場合はダメです)

shard数の変更にはkibanaのdev toolsを利用します。今回はshard:1/replica:0に設定します。以下のようにして実行します。
![Screenshot from 2019-12-09 02-11-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236639/faabba9d-5572-84fd-241e-8f94f7b362fb.png)

`"acknowledged" : true`と出れば設定されています。
今回は`default`という名前で、`*`にマッチするindex(すべてのindex)に対し、shard:1/replica:0になるように設定しました。
この設定はindex-templateに対する設定であり、個別にindex作成のときなどにshard数等を指定して作成するとそちらが優先されるので注意してください。

データを投入後、`GET _cat/indices`を実行し、以下のようにgreenになれば正常です。
![Screenshot from 2019-12-09 02-21-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236639/0c4fc194-a098-d834-922c-eeb70f902ab0.png)

## ILMの設定
ElasticsearchにはILM(Index Lifecycle Policies)というものがあります。この機能はindexの状態をフェーズ分けし、効率よくノード分けしたり、ローテートしたりできます。詳しくは説明しないので[他の方の記事](https://qiita.com/tak7iji/items/6f4df5eeb6c16d8bc987)を参照してください。

logstashやbeatなどのelastic公式のinput先を利用している場合はILMに対応しているのでKibanaの設定からいろいろ変更することが可能です。対応していない場合は自分で作成しましょう。

## あとがき
今回は非常にざっくり、チューニングするときの流れをまとめてみました。個別個別の設定に関してはだいぶ端折りましたが(ごめんなさい)、elasticsearchは公式ドキュメントが非常にしっかりしてるのでしっかりと読み込みましょう。
みなさんもオンプレelasticsearchを構築して気持ちよくなりましょう！！

[^1]: rgnetとはrgで運用されている研究室ネットワークのことです。[policy](https://github.com/sfc-rgroot/policy)
[^2]: https://www.elastic.co/jp/what-is/open-x-pack