[Elasticsearch] Bulk Indexing 후 Data Consistency 관리.
Elastic/Elasticsearch 2013. 9. 17. 12:35벌크 인덱싱 후 간혹 샤드간에 데이터가 왔다 갔다 할 때가 있습니다.
이건 elasticsearch 색인이 잘못 되었다고 보시면 안됩니다.
인덱스와 샤드의 status 정보를 보면
- num_docs
- max_docs
- deleted_docs
이런게 있죠.
기본적으로 벌크 색인 시 empty index 에 색인을 하게 될 텐데요.
색인 도중 문제가 발생해서 일부 색인 데이터가 들어가고 다시 같은 인덱스에 색인을 하게 되면 updateDocument 를 실행 하게 됩니다.
뭐 루씬 API 보시면 이제 add/update 가 하나의 API 로 동작 하긴 합니다.
암튼 이렇게 되다 보니 deleted_docs 가 발생 하게 되고 num_docs 와 max_docs 수치가 안맞게 됩니다.
즉, num_docs = max_docs - deleteed_docs 와 같습니다.
이런 관계로 색인 완료 시 recovery 또는 optimize 작업을 통해서 data consistency 를 보정해 주어야 합니다.
그럼 이걸 어떻게 할까요?
아래 명령어로 해보시고 ES API 문서 참고 하시면 되겠습니다.
(거의 대부분 default value 입니다.)
[Java API]
new OptimizeRequest()
.indices(indice)
.flush(true)
.onlyExpungeDeletes(false)
.refresh(true)
.waitForMerge(true)
.operationThreading(BroadcastOperationThreading.THREAD_PER_SHARD)
.maxNumSegments(1)
[Rest API]
curl -XPOST 'http://localhost:9200/indice/_optimize?only_expunge_deletes=false&max_num_segments=1&refresh=true&flush=true&wait_for_merge=true'
[Recovery]
curl -XPOST 'http://localhost:9200/indice/_close'
curl -XPOST 'http://localhost:9200/indice/_open'
client.admin()
.indices()
.close(new CloseIndexRequest("indice"));
client.admin()
.indices()
.close(new OpenIndexRequest("indice"));
[Reference]
http://www.elasticsearch.org/guide/reference/api/admin-indices-optimize/
http://www.elasticsearch.org/guide/reference/api/admin-indices-open-close/