Elasticsearch入門

Elasticsearch構築メモ

# 環境
<dl>
  <dt>OS</dt>
    <dd>Censtos7.2</dd><br>
  <dt>ソフトウェア</dt>
    <dd>Elasticsearch 5.2.2</dd>
    <dd>kibana 5.2.2</dd>
    <dd>grafana 4.1</dd><br>
    <dd>cerebro 0.6.3
  <dt>ハードウェア</dt>
    <dd>メモリ : 4GB</dd>
    <dd>CPU : 2core
</dl>

# インストール
 
やんごとなき理由でローカルインストールです・・・
<pre>
 su -l
 yum install -y elasticsearch-5.2.2.rpm
 yum install -y kibana-5.2.2-x86_64.rpm
 yum install -y grafana-4.1.2-1486989747.x86_64.rpm
 tar zxvf cerebro-0.6.3.tgz
</pre>

## 設定

### クラスタ設定
今回は推奨の3台構成。
<pre>
 vi /etc/elasticsearch/elasticsearch.yml
+ network.host: 0.0.0.0
+ discovery.zen.ping.unicast.hosts: ["ip_address1", "ip_address2","ip_address3"]
+ discovery.zen.minium_master_nodes: 2
</pre>

`discovery.zen.minuum_master_nodes`については公式にもある通り、
クラスタ構成台数/2+1に設定します。


### kibana設定

<pre>vi /etc/kibana/kibana.yml
+ server.host: 0.0.0.0
</pre>

また、5.2では一部kibanaのコードにバグがあり、ファイヤーウォール環境下ではページ描画に時間がかかるため以下の設定を変更します。
<pre>
\# vi /usr/share/kibana/src/server/config/schema.js

\- manifestServiceUrl: _joi2['default'].string()\['default'\]('https://tiles.elastic.co/v2/manifest'),
+ manifestServiceUrl: _joi2['default'].string()\['default'\]('https://localhost'), 
</pre>

調べるとどうも`https://tiles.elastic.co/v2/manifest?my_app_version=5.2.0`というURLにアクセスしようとしてタイムアウトを待っているようです。

*2017年2月現在、GitHubのissueにも挙がっています。*
https://github.com/elastic/kibana/issues/10205

## 起動
<pre>
systemctl enable elasticsearch
systemctl start elasticsearch
systemctl status elasticsearch

systemctl enable kibana
systemctl start kibana
systemctl status kibana

/root/cerebro-0.6.3/bin/cerebro &
</pre>

#設計
ElasticsearchではIndex,Type,Documentという概念があり、
それぞれRDBでいうデータベース、テーブル、レコードに相当します。
##Mapping
RDBでいうDB設計です。
今回は以下の定義でIndexを作成します。

ちなみにこれ以降設定等は基本的にKibanaのコンソールから行います（面倒なので！）


<pre>
PUT /log

{
    "settings":{
        "number_of_shards" : 3,
        "number_of_replicas" : 1,
        "max_result_window":100000,
        "refresh_interval":"5s",
        "index":{
            "mapping":{
                "ignore_malformed":"true"
            }
        },
        "mapper":{
            "dynamic":"false"
        }
    },
    "mappings":{
        "alert":{
            "properties":{
                "server":{
                    "type":"keyword",
                    "fields"{
                       "text":{
                           "type":"text"
                       }
                    }
                },
                "date":{
                    "type":"date"
                },
                "log":{
                    "type":"text"
                }
            }
        }
    }
}
</pre>


実はElasticsearchはDynamic Mappingにも対応していて、
存在しないindexにデータを投入すると自動でindexを作成してくれます。
しかし、余計な設定や意図しない設定が反映されたりするのでやはりMappingは手動をおすすめします。


##Index
indexとはRDBでいうDB相当です。ここにデータであるdocumentを格納します。
Elasticsearchはクラスタを組むことでデータをノードごとに分散して保持することが可能ですが、
何台でデータを保持するか（shards）を基本的にIndex作成後にで変更出来ないため、設計時によく考える必要があります。
今回はデフォルトで3としています。

##Type
タイプはRDBでいうテーブルのようなものです。
ただここで設計したフィールドは他のTYPEでも同じ設計でないといけません。
（例えばlogというフィールド名でフィールドタイプがtextだった場合、他のタイプでもlogというフィールドはtext型でないといけない）

ただし、TYPEは6.0で削除されるので使わない方がよいでしょう。

##Shard
shardは一つのIndexを分割したものです。
各shardは基本的にノードごとに分散して配置されます、shardを適切な数に設計することが高速化につながります。
shardは基本的に一度設定すると変更が不可能なため、事前に十分な運用・拡張性を考慮する必要があります。

また、各shardには上限ドキュメント数があり、約20億doc（2,147,483,519）を越えてデータを投入することはできません。（Lucenの限界）
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/_basic_concepts.html