Elasticsearch REST APIでのIndex再構築
こんにちは。APIチームの小島です。
今回はElasticsearchのIndex再構築手順について書きます。
Elasticsearchを運用している中でスキーマを変更する際、Shard数を変更する場合にIndexを新しく作り直す事があります。再構築に関してはElasticsearchの使い方、サービスの性質、利用ツールによりやり方はそれぞれなのであくまでも一例として紹介します。
環境
・Elasticsearch 6.2
Indexについて
今回はユーザ情報を入れるIndexとして以下のような命名で説明します。
・使用中のIndex名: user_v20180701000000
・新しく作るIndex名: user_v20181001000000
・Aliase名: user
Aliaseはサービスから参照させたいIndexに結びつけておき、Indexの再構築完了後に新しいIndexにつけ直すことでサービスへの影響を最低限にIndexの移行を行う事ができるので、必ず設定しておきましょう。
手順
- Indexを作成
- Indexの内容をコピー
- Aliaseを切り替え
1. Indexを作成
まずはじめに新しいIndexを作成します。
curl -X PUT xx.xx.xx.xx/user_v20181001000000 -H ‘Content-Type: application/json’ -d ‘
{
"mappings":{
"_doc": {
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
・ ・ ・ ・ ・ ・ ・ ・ 略 ・ ・ ・ ・ ・ ・ ・
}
}
},
"settings":{
"index":{
"number_of_shards" : 1,
"number_of_replicas": 0
}
}
}’
上記の例ではmappingsとsettingsでそれぞれスキーマの定義、Shard数の設定を行っています。mappingsに関してはTemplate機能を使用していて不要であれば省略できます。また、settings内に記述されているnumber_of_shardsはindex作成後は変更できないのでここで適切な値を設定します。反してnumber_of_replicasは後から変更ができます。他にもIndexに必要な設定がある場合はここで行います。
2. Indexの内容をコピー
続いて、既存のIndexから新しく作成したIndexに向けてデータを移します。
curl -XPOST xx.xx.xx.xx/_reindex -H 'Content-Type: application/json' -d '
{
"source":{
"index":"user_v20180701000000"
},
"dest":{
"index":"user_v20181001000000"
}
}'
注意としてはreindex完了後にshardの初期化・配置処理が走るのでこれが全て完了し、Cluster health statusが「green」戻っていることを確認してから次に進む必要があります。また、この間に旧Indexに更新処理が走ることで新Indexとの間に差分が出てしまいます。なのでこの間更新を止められるものは止めておく、止められない場合はサービスから新旧同時書き込みをするなどしましょう。
3. エイリアスを切り替え
最後に旧Index user_v20180701000000 から新Index user_v20181001000000へとサービス参照を切り替えるためエイリアスの変更を行います。エイリアスは複数Indexにつける事ができますが、Elasticsearchの更新系APIはエラーとなってしまうため、書き込みのあるエイリアスは旧からの削除と新への追加を必ず同時に行います。
curl -XPOST "xx.xx.xx.xx/_aliases" -H 'Content-Type: application/json' -d '
{
"actions": [
{
"remove": {
"index": "user_v20180701000000",
"alias": "user"
}
},
{
"add": {
"index": "user_v20181001000000",
"alias": "user"
}
}
]
}'
_cat/indices APIなどでエイリアスがつけ変わっていて正しいIndexに参照が向いていることを確認しましょう。これでIndexの再構築は完了です。
最後に
今回Index再構築の一例をREST APIを使用して説明しました。実際に運用する際はスクリプト化する、ツールを利用するなどすると思いますが、最初に何が起こっているのかを理解するためにも一度実際にAPIを叩いて動作を確認することをおすすめします。