[elasticsearch] 클러스터에서 인덱스 이름을 바꾸는 방법은 무엇입니까?

클러스터에있는 여러 인덱스의 이름 변경 해야 합니다 (이름 변경 해야 하며 별칭을 사용할 수 없습니다 ).

지원되는 방법이 없다는 것을 알았습니다. 가장 가까운 방법 은 인덱스의 디렉토리 이름바꾸는 것 입니다. 클러스터에서 시도했습니다.

클러스터는 3 기계를 가지고 A, B그리고 C와 파편이 그들 각각에 복제됩니다. 에서 elasticsearch를 종료하고로 A이름 /var/lib/elasticsearch/security/nodes/0/indices/oldindexname을 바꾸고 /var/lib/elasticsearch/security/nodes/0/indices/newindexname다시 시작했습니다 A.

클러스터의 상태는 노란색이었고 elasticsearch는 올바른 상태를 복원하기 위해 마법을 사용했습니다. 얼마 후 나는

  • oldindexname사용 가능하고 완전히 복제 됨 (복구 BC추측)
  • newindexname 사용할 수 있지만 (검색 할 수 있음) 헤드 플러그인에 샤드가 “할당되지 않음”상태이고 회색으로 표시됨 (복제되지 않음)이 표시됨

복구하는 동안 security.log다음 메시지가 표시되었습니다.

[2015-02-20 11:02:33,461][INFO ][gateway.local.state.meta ] [A.example.com] dangled index directory name is [newindexname], state name is [oldindexname], renaming to directory name

newindexname검색 할 수 있지만 확실히 정상 상태는 아닙니다.

을 삭제하여 이전 상태로 롤백했습니다 newindexname. 클러스터는 “할당되지 않음”항목없이 다시 녹색으로 돌아갑니다.

그렇다면 클러스터에서 어떻게 이름 oldindexname을 바꿀 수 newindexname있습니까?

참고 : 내가 염두에두고있는 궁극적 인 해결책은 스크롤 복사 oldindex하여 나중에 newindex삭제하는 것 oldindex입니다. 이것은 시간이 걸릴 것이므로보다 직접적인 솔루션이 있다면 좋을 것입니다.



답변

ElasticSearch 7.4부터 인덱스 이름을 바꾸는 가장 좋은 방법은 새로 도입 된 Clone Index API를 사용하여 인덱스를 복사 한 다음 Delete Index API를 사용하여 원래 인덱스를 삭제하는 것 입니다.

동일한 목적으로 Snapshot API 또는 Reindex API를 사용하는 것보다 Clone Index API의 주요 이점은 속도입니다. Clone Index API는 해당 콘텐츠를 다시 처리하지 않고 소스 인덱스에서 대상 인덱스로 세그먼트를 하드 링크하기 때문입니다 (on 하드 링크를 지원하는 파일 시스템, 그렇지 않으면 파일 시스템 수준에서 파일이 복사되므로 대체 방법보다 훨씬 더 효율적입니다. 또한 복제 인덱스는 대상 인덱스가 소스 인덱스의 모든 지점에서 동일하다는 것을 보장하며 (즉, 재 인덱싱 방식과 달리 설정 및 매핑을 수동으로 복사 할 필요가 없음) 로컬 스냅 샷 디렉터리를 구성 할 필요가 없습니다. .

참고 : 이 절차는 이전 솔루션보다 훨씬 빠르지 만 여전히 다운 타임을 의미합니다. 인덱스 이름 변경 (예 : 분할, 축소 또는 백업 워크 플로의 단계)을 정당화하는 실제 사용 사례가 있지만 인덱스 이름 변경은 일상적인 작업의 일부가되어서는 안됩니다. 워크 플로에서 인덱스 이름을 자주 변경해야하는 경우에는 대신 인덱스 별칭을 사용하는 것이 좋습니다.

여기서 인덱스의 이름을 변경하는 동작의 전체 시퀀스의 예 source_indextarget_index. Kibana에 통합 것과 같은 일부 ElasticSearch 특정 콘솔을 사용하여 실행할 수 있습니다 . Elastic Search 콘솔 대신 사용 하는 이 예제의 대체 버전은 이 요점 을 참조하십시오 curl.

# Make sure the source index is actually open
POST /source_index/_open

# Put the source index in read-only mode
PUT /source_index/_settings
{
  "settings": {
    "index.blocks.write": "true"
  }
}

# Clone the source index to the target name, and set the target to read-write mode
POST /source_index/_clone/target_index
{
  "settings": {
    "index.blocks.write": null
  }
}

# Wait until the target index is green;
# it should usually be fast (assuming your filesystem supports hard links).
GET /_cluster/health/target_index?wait_for_status=green&timeout=30s

# If it appears to be taking too much time for the cluster to get back to green,
# the following requests might help you identify eventual outstanding issues (if any)
GET /_cat/indices/target_index
GET /_cat/recovery/target_index
GET /_cluster/allocation/explain

# Delete the source index
DELETE /source_index


답변

REINDEX 를 사용 하여이를 수행 할 수 있습니다 .

재 색인은 대상 색인 설정을 시도하지 않습니다. 소스 인덱스의 설정은 복사하지 않습니다. 당신은 대상 인덱스를 설정 매핑, 파편 수, 복제 등을 설정하는 _reindex 작업을 실행 포함하기 전에

  1. 먼저 색인을 새 이름으로 복사하십시오.
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. 이제 색인을 삭제하십시오.
DELETE /twitter


답변

인덱스 이름을 바꾸려면 Elasticsearch Snapshot 모듈을 사용할 수 있습니다.

먼저 색인의 스냅 샷을 찍어야합니다. 복원하는 동안 색인의 이름을 바꿀 수 있습니다.

    POST /_snapshot/my_backup/snapshot_1/_restore
    {
     "indices": "jal",
     "ignore_unavailable": "true",
     "include_global_state": false,
     "rename_pattern": "jal",
     "rename_replacement": "jal1"
     }

rename_replacement :-데이터를 백업 할 새 인덱스 이름입니다.


답변

따라서 ES에서 색인을 복사하거나 이름을 바꾸는 직접적인 방법이 없습니다 (저는 내 프로젝트를 광범위하게 검색했습니다)

그러나 매우 쉬운 옵션은 널리 사용되는 마이그레이션 도구 [Elastic-Exporter]를 사용하는 것입니다.

http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/

[PS : 이건 내 블로그가 아니에요. 그냥 우연히 만나서 좋았어요.]

따라서 색인 / 유형을 복사 한 다음 이전 항목을 삭제할 수 있습니다.


답변

REINDEX 할 수없는 경우 해결 방법aliases 를 사용하는 것 입니다. 로부터 공식 문서 :

elasticsearch의 API는 특정 색인에 대해 작업 할 때 색인 이름을 허용하고 적용 가능한 경우 여러 색인을 허용합니다. 인덱스 별칭 API를 사용하면 모든 API가 별칭 이름을 실제 인덱스 이름으로 자동 변환하는 이름으로 인덱스 별칭을 지정할 수 있습니다. 별칭은 둘 이상의 인덱스에 매핑 될 수도 있으며이를 지정하면 별칭이 별칭 인덱스로 자동 확장됩니다. 별칭은 검색시 자동으로 적용될 필터 및 라우팅 값과 연결될 수도 있습니다. 별칭은 인덱스와 동일한 이름을 가질 수 없습니다.

이 기능과 유사 기능을 사용하는 경우이 솔루션이 작동하지 않습니다. https://github.com/elastic/elasticsearch/issues/16560


답변

인덱스의 이름을 바꾸거나 매핑을 변경하는 또 다른 방법은 logstash를 사용하여 다시 인덱싱하는 것입니다. 다음은 logstash 2.1 구성의 샘플입니다.

input {
  elasticsearch {
   hosts => ["es01.example.com", "es02.example.com"]
   index => "old-index-name"
   size => 500
   scroll => "5m"
  }
}
filter {

 mutate {
  remove_field => [ "@version" ]
 }

 date {
   "match" => [ "custom_timestamp", "MM/dd/YYYY HH:mm:ss" ]
   target => "@timestamp"
 }

}
output {
 elasticsearch {
   hosts => ["es01.example.com", "es02.example.com" ]
   manage_template => false
   index => "new-index-name"
 }
}


답변

스냅 샷 모듈에 대한 Elasticsearch 참조에 표시된대로 ,

rename_pattern 및 rename_replacement 옵션을 사용하여 정규식을 사용하여 복원시 인덱스 이름을 바꿀 수도 있습니다.