Elasticsearch routing, routing shard

metadata 의 routing 이란 ?

routing 은 Elasticsearch 에서 색인된 문서를 검색할 때, 특정한 라우팅 값을 사용하여 검색을 수행하는 방법입니다.

기본 routing 값은 문서의 _id 값이며, 이 값은 색인 시에 자동으로 생성됩니다.

routing 을 사용하면 특정한 샤드에만 검색을 수행할 수 있습니다.

이를 통해 실무에서 성능 향상 경험이 있었습니다.


색인 방법

routing 을 사용하는 방법은 다음과 같습니다.

PUT test/_doc/1?routing=code20240101
{
  "uid": "[email protected]"
}

조회 방법

일반적인 조회 방법은 다음과 같습니다.

routing 을 설정하지 않았다면, 엘라스틱 서치는 해당 문서가 어디에 있는지 모르기 때문에 모든 샤드에 대해 조회를 수행합니다.

GET test/_search

# response
{
    "took" : 30,
    "timed_out" : false,
    "_shards" : {
        "total" : 18,
        "successful" : 18,
        "skipped" : 0,
        "failed" : 0
    },
    .
    .
}

하지만, routing 을 사용하여 조회를 하게되면 결과는 달라지게 됩니다.

GET test/_search?routing=code20240101

# response
{
    "took" : 1,
    "timed_out" : false,
    "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
    },
    .
    .
}

문서가 색인된 샤드에 대해서만 조회를 수행하게 되어, 성능이 향상됩니다.

실제로 여러개의 샤드가 있는 경우 특정 code 가 code20240101 인 문서를 조회한다고 가정하면 routing 을 사용하지 않았을 때와 사용했을 때의 큰 차이를 확인할 수 있습니다.

ES 공식 문서를 확인하면 query 에서 routing 를 이용하여 검색과 여러개의 routing 을 이용한 검색에 대한 내용을 확인할 수 있습니다.

Logstash 를 통해 색인 시에 routing 설정하기

필자는 Logstash 를 통해 Elasticsearch 에 색인을 수행하고 있습니다.

Logstash 의 elasticseach output plugin 을 통해 routing 을 설정하는 방법은 다음과 같습니다.

elasticsearch {
    routing => "%{[@metadata][_routing_id]}"
}

routing 설정 시 어느 샤드에 배치 되었는지 확인하는 방법

특정 routing 값을 가진 문서가 어느 샤드에 배치되었는지 직접 확인하는 방법은 _search_shards API 를 이용하여 query parameter 로 routing 을 같이 넘기는 방법이 있다.

GET test/_search_shards?routing=code20240101

# response
{
  "test" : {
    "shards" : [
      [
        {
          "state" : "STARTED",
          "primary" : true,
          "node" : "node1",
          "index" : "test",
          "shard" : 0,
          "allocation_id" : {
            "id" : "allocation_id"
          }
        }
      ]
    ]
  }
}

reference