Elasticsearchで最初にぶつかるワードたち

Elasticsearchで最初にぶつかるワードの意味などをRDBに例えて覚えたので、それらを書いておく。
加えて3日ほどで覚えた知識も併せて書く。

# 対応表

|Elasticsearch|RDB|備考|
|:--|:--|:--|
|index|テーブル|elasticはスキーマレスだがmappingというカラムの型情報がある|
|type|該当なし||
|document|row|行データ|
|node|DBサーバー|保存領域の数|
|shard||データ保存の分割数。検索処理の並列数にも影響する|
|primary shard|master|水平分割数|
|replica shard|slave|レプリケーション数|

# index と type

RDBのデータベースとテーブルの関係と書かれていることが多いが、Elasticsearch6ではindex(1) : type(1)、さらに将来ではtypeは削除されるかもしれないので、indexがテーブルに該当することとなる。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">typeは今後なくなるかつ6では1つしか定義できないので、お気をつけください。基本、ないものと考えていただくのが良いかと。</p>&mdash; Jun Ohtani (@johtani) <a href="https://twitter.com/johtani/status/965864467635433472?ref_src=twsrc%5Etfw">2018年2月20日</a></blockquote>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">はい。理由や今後のスケジュールはこちらにあります。<a href="https://t.co/Ir5z2swCP9">https://t.co/Ir5z2swCP9</a> 複数タイプに関してはどう考えればいいかなどもあるので参考にしていただければと。</p>&mdash; Jun Ohtani (@johtani) <a href="https://twitter.com/johtani/status/965894751089119237?ref_src=twsrc%5Etfw">2018年2月20日</a></blockquote>

## index名の付け方の考察

"(データ名)-yyyy.mm.dd" の形式が良いかと思われる。

- logstash形式でデータを保存すると、indexが"logstash-yyyy.mm.dd"となる。kibanaもこの形式を標準にしている。
- この形式だと日付パーテーションの役割も兼ねるので、n日以前のデータ削除としても使える。
- "logstash-yyyy.mm.dd"ではなく"(データ名)"を先頭を付けるのは、日付パージの粒度をデータ毎に調整できるから。（日単位、週単位、月単位）
- index作成後にshard(分割数)の変更ができないので、日単位でindexを作ると、後になって日毎のデータ量が増えてきた時に分割数を増やすことができる
- Elasticsearchは利用するindexを前方一致で指定できるので、末尾に日付が付いていても人間の検索コストは増えない。RDBだとtableのpartitionを超えて検索するのに似ている。

# nodeとshard

- indexは複数のshardに分割することができる
 - データの水平分割
- shardには primary(1) と replica(n) がある
 - master/slave構成
 - Elasticsearchではこの組を`レプリケーショングループ`と呼ぶ
- nodeの中に複数のshardを格納することができる
 - 1つのnodeには primary shard と 対となるreplica shard を同時に置けない 
 - ~~この制約があるので`primary数 + replica数 <= node数`とする~~
 - 1つのnodeに複数のprimary shardを配置できるので、上の例だとnode上に2個のpraimaryがあると破綻する。
 - `replica数 < node数`が正しい
- primary shardの数はindex作成時から変更できない
 - コンテンツが成長したらデータ数が増えるので、shard数も増やせるように日付indexが良いと思う
 - replicaは後から変更できる

# nodeとshardの配置例題(RDB風の説明付き)

primary shard = p
replica shard = r
と省略します

- レプリケーション master(1) : slave(1)

|index|node|shard||
|:--|:--|:--|:--|:--|
|index|node1|p1||
||node2|r1||
||node3|(空き)||

- レプリケーション master(1) : slave(2)

|index|node|shard||
|:--|:--|:--|:--|:--|
|index|node1|p1||
||node2|r1||
||node3|r2||


- 水平分割 master(2) : slave(0)

|index|node|shard||
|:--|:--|:--|:--|:--|
|index|node1|p1||
||node2|p2||
||node3|(空き)||

とか

|index|node|shard||
|:--|:--|:--|:--|:--|
|index|node1|p1|p2|
||node2|(空き)||
||node3|(空き)||



- レプリケーション master(1) : slave(1) + 水平分割(2) 

|index|node|shard||
|:--|:--|:--|:--|:--|
|index|node1|p1|p2のr1|
||node2|p2|p1のr1|
||node3|空き||

とか

|index|node|shard||
|:--|:--|:--|:--|:--|
|index|node1|p1|p2のr1|
||node2|p2||
||node3|p1のr1||

- レプリケーション master(2) : slave(2) + 水平分割(2) 

|index|node|shard||
|:--|:--|:--|:--|:--|
|index|node1|p1|p2のr1|
||node2|p2|p1のr1|
||node3|p1のr2|p2のr2|

# 読んでよかったもの

- 第１回 Elastisearch 入門 インデックスを設計する際に知っておくべき事
 - https://dev.classmethod.jp/server-side/elasticsearch-getting-started-01/
- 分散システムとしての #Elasticsearch
 - https://www.slideshare.net/snuffkin/elasticsearch-as-a-distributed-system