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


110

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

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

클러스터는 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입니다. 이것은 시간이 걸릴 것이므로보다 직접적인 솔루션이 있다면 좋을 것입니다.

답변:


19

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

163

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

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

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

(일시적으로) 두 인덱스 모두에 대한 공간이 필요하지만 이것은 간단하고 완전히 서버에 있으므로 지금까지 가장 좋은 솔루션 인 것 같습니다 (문서에서 '실험적'상태에 대해 경고하더라도). 감사합니다.
WoJ

2
매핑이있는 경우 작동합니까 _source: {enabled: false}?
Harald

2
@Harald No, 원본 문서 데이터로 _reindex사용 _source합니다.
Agop

6
이 매핑 복사하지 않습니다 twitter에를 new_twitter내가 아는까지로한다.
Nick

3
_reindex의 솔루션에 동의하지만 질문을 변경해야합니다. 재 색인은 단순히 이름을 바꾸는 것이 아닙니다. 데이터 인덱싱 방식을 변경할 수도 있습니다.
lucabelluccini

62

인덱스 이름을 바꾸려면 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 :-데이터를 백업 할 새 인덱스 이름입니다.


4
Holycrap, 믿을 수 없을 정도로 유용합니다. 감사합니다!
Chris Cogdon

1
허용되는 솔루션보다 훨씬 낫습니다! 이것은 실제로 인덱스의 이진 복사본이므로 손실 위험이 없으며 _source인덱스에서 활성화 할 필요가 없습니다 . 나는 문제없이 이런 식으로 일부 다중 TB 인덱스의 이름을 변경했습니다.
Jacket

2
@Jacket-내 답변이 정말 도움이된다는 것을 알게되어 기쁩니다.
크리슈나 쿠마

1
나는 다시 색인화하는 것보다 훨씬 더 나은 솔루션, 데이터 손실 문제, 훨씬 더 빨리뿐만 아니라에 대한 큰 인덱스를 동의
로맹 Hautefeuille

1
매핑을 유지합니까?
Amogh Mishra

5

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

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

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

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

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


링크가 더 이상 작동하지 않습니다. 우리가 그것을 찾거나이 정보를 가질 수있는 다른 곳이 있습니까?
elachell

5

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

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

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


1
I need to rename several indexes in a cluster (their name must be changed I cannot use aliases).작성자 : @WoJ
Thales P

별칭이 작동하지 않는 이유 :을 사용 alias 하려면 미리 계획 as an alias하고 실제 인덱스에 대한 원래 인덱스 이름 을 만들어야합니다 . 그런 다음 새 별칭 이름을 만들고 다른 항목에 대해 이전 별칭 이름을 다시 사용할 수 있습니다. 그러나 real_index 만있는 경우 old_data에 대한 액세스 권한을 잃고 별칭을 만들고 이전 real_index를 삭제합니다. 이제 별칭은 아무것도 가리 키지 않습니다.
Jesse Chisholm

@JesseChrisholm 저는 "아무것도 가리키는 별칭"을 가질 수 없다고 생각합니다. real_index를 제거하면 "an alias to it"도 제거되는 것을 볼 수 있습니다.
mgaert

5

인덱스의 이름을 바꾸거나 매핑을 변경하는 또 다른 방법은 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"
 }
}

4
그렇다면 Elasticsearch 인덱스를 재 인덱싱하는 가장 좋은 방법은 Logstash를 설치 한 다음이를 사용하여 재 인덱싱하는 것입니다. 특히 Logstash를 원하지 않거나 사용하지 않는 경우 약간 과잉 인 것 같습니다.
M. Justin

대답의 유일한 문제는 "최고"부분입니다. . 나는 "또 다른 방법 '을 말할 것보다 다른, 좋은 대답이다.
로버트


-5

누군가가 여전히 그것을 필요로 할 경우를 대비하여. 공식적이지 않은 성공적인 인덱스 이름 변경 방법은 다음과 같습니다.

  1. 이름을 바꿔야하는 인덱스 닫기
  2. 마스터 및 데이터 노드의 모든 데이터 디렉토리에서 인덱스 폴더의 이름을 변경합니다.
  3. 이전 닫힌 색인을 다시 엽니 다 (kofp 플러그인 사용). 이전 인덱스는 다시 열리지 만 할당되지 않은 상태로 유지됩니다. 새 인덱스는 닫힌 상태로 나타납니다.
  4. 새 인덱스 다시 열기
  5. 이전 색인 삭제

"dangled index directory name is"오류가 발생하면 모든 마스터 노드 (데이터 노드가 아님)에서 인덱스 폴더를 제거하고 데이터 노드 중 하나를 다시 시작하십시오.


2
Elastic은 매우 낙담합니다. 그렇게 할 경우 백업이 있는지 확인하십시오.
lucabelluccini

데이터 디렉토리에서 색인 이름이 어디에 표시되는지 이해할 수 없습니다. / var / lib / elasticsearch / nodes / 0 / indices /를 보면 디렉토리 이름이 "1aS4RusHSYWLdt-Wx7NnBw"(Elasticsearch 버전 5.6.3)와 같이 무작위로 생성됩니다.
Johan Boulé 2017

1
@ JohanBoulé,이 메서드는 Elasticsearch 버전 5부터 더 이상 유효하지 않습니다.
Anh Le

@lucabelluccini, 동의했습니다. 그대로두고 별칭을 사용하는 것이 좋습니다.
Anh Le
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.