04 1월 2016 엔지니어링

Elasticsearch 1.x에서 2.x로 업그레이드할 때 알아야 할 주요 사항

By Miguel BosinDamian Pfister

개요

소프트웨어 배포 수명 주기(lifecycle) 동안 새로운 기능, 버그 수정, 지속적인 지원을 제공받기 위해 최신 버전의 제품으로 업그레이드해야 하는 경우가 많습니다. Elasticsearch도 마찬가지입니다. 새로 출시된 버전 2.0에는 주요 변경 사항이 다수 포함되어 있으며, 업그레이드 시 기존에 설치된 1.x에서 정상적으로 작동하던 결과들이 손상될 수 있습니다. 본 문서에서는 이를 주요 변경 사항(breaking change) 이라고 합니다. 또한 전체 cluster의 재시작이 필요합니다.

동영상 보기: Elasticsearch 1.x에서 2.x로 업그레이드

2014-08-29_15_20_20_-Upgrade_-_Maintain_Speed.JPG

Elasticsearch 2.x로 원활하게 업그레이드하는 방법

개발(비 운영) 환경에서 약간의 테스트만 거치면 업그레이드가 실패하거나 데이터 불일치가 발생할 이유가 거의 없습니다. 하지만 이를 위해서는 아래 요약된 내용과 같은 일부 계획이 필요합니다.

  • 최신 릴리스에 포함된 주요 변경 사항목록을 숙지하십시오. 그러면 "어! 내가 전에 사용하던 기능이 어디로 갔지?"하고 놀라지 않아도 됩니다.
  • elasticsearch.yml에서 network.host_non_loopback 주소로 설정하십시오. "_[networkInterface]_"로 구성된 인터페이스일 수도 있습니다(예: "_en0_", "_ens160_" 또는 "_eth0").
  • 업그레이드하기 전에 마이그레이션 플러그인을 클러스터에 다운로드하고 설치하십시오. 노드를 다시 시작할 필요는 없습니다. 이 플러그인은 매핑, 인덱스 설정 및 세그먼트를 확인하기만 하고(수정은 안 함) 마이그레이션 프로세스 시작 전에 수정할 부분을 하이라이트합니다. 이 플러그인은 인덱스 템플릿을 확인하지않으므로, 필요한 변경을 수동으로 하기 전에 주요 변경 사항 문서를 모두 검토해야 합니다.
  • 모든 마이그레이션 업그레이드를 테스트 하기 위해 스냅샷 및 복원 기능을 사용해 (반드시) 운영 데이터의 복사본을 테스트 환경에 준비하십시오. 운영 cluster를 손상시키는 것 보다는 테스트 환경을 손상시키는 것이 훨씬 낫습니다.
  • 주요 버전 간에(1.x에서 2.x로) 업그레이드하려면 전체 클러스터를 다시 시작해야 합니다.
  • 비 시스템 설치(non-systemd installations)의 경우, 1.x에서 2.x로 최신 elasticsearch init 스크립트를 사용하는 것이 좋습니다(상당한 차이가 있음).

        2.1 DEB init
        2.1 RPM init

  • 마이그레이션 plugin이 제공한 결과 그리고 the 주요 변경 사항 문서를 바탕으로, 이와 관련하여 애플리케이션이 사용할 수 있는 백엔드/프런트엔드 코드와 cluster 구성을 권장된 대로 모두 수정해야 합니다.
  • Elasticsearch plugin 의 모든 업그레이드 문서를 참고하여 최신 버전에서 모든 기능이 정상적으로 동작하는지 확인해야 합니다.
  • Elasticsearch 2.x와 완벽한 호환을 위해서는 Logstash 그리고 Kibana 를 모두 지원되는 버전으로 업그레이드해야 합니다.
  • UI 기능들이 Kibana 에 내장됨에 따라 Kibana 업그레이드 후에는 Marvel plugin 및 에이전트의 업그레이드도 필요합니다.
  • Sense 는 이제 Open Source이고 Marvel이 아닌 Kibana plugin 이므로 업그레이드 이후 별도의 설치가 필요합니다.
  • 이제 Logstash 2.x가 기본적으로 HTTP 프로토콜 을 사용하므로 logstash 구성을 수동으로 변경해야 할 수도 있습니다. 필요한 경우 elasticsearch_java 출력 plugin을 설치할 수 있습니다.
  • 올바른 업그레이드 경로 를 따라야 합니다.
  • 인덱스 업그레이드 프로세스를 모니터링할 수 있습니다. 'check upgrade status' API 명령 을 참조하십시오

업그레이드 시 문제가 발생한 경우

위의 절차를 주의깊게 따랐음에도 업그레이드 시 문제가 발생한 경우, 다음과 같이 추가로 도움을 받을 수 있습니다.

  • Discuss 사용자 커뮤니티에 질문을 하십시오. 사용자 커뮤니티가 얼마나 유용한지 놀라실 것입니다.
  • 업그레이드 과정에서 새로운 버그가 발견된 경우 깃헙(GitHub) 에 버그 보고서를 제출하십시오.
  • 기술지원 대상 고객의 경우, 지원 포털에 ticket을 등록하고 Elastic 전담 지원팀의 도움을 받아 업그레이드 문제를 해결할 수 있습니다.

전체 cluster 재시작을 위한 유지 관리 시간을 줄이고 가동 중단 시간을 최소화하는 방법

위험이 너무 커보이거나 업그레이드가 너무 까다로운 경우에는 다음과 같은 옵션을 고려할 수 있습니다.

  • 최신 버전의 Logstash 및 Kibana, 그리고 (필요한 경우) 기타 plugin과 함께 최신 버전의 Elasticsearch로 새 cluster를 구축합니다.
  • 소스 데이터를 이전 클러스터와 새 cluster 모두에 이중으로 입력하고, 필수 보관 기간이 지나면 이전 cluster를 해제합니다. 이 옵션은 보존 기간이 7일 또는 1달 등으로 짧은 경우에 더 효과적일 수 있습니다.
  • 소스에서 새 cluster로 전체 데이터 세트의 인덱스 처리를 다시 수행한 후 이전 cluster를 해제합니다.

이 접근 방식은 처음에 더 많은 물리적(또는 가상) 리소스를 필요로 하지만 (단, 테스트 환경이기에 약간의 추가 용량 비용으로 테스트에 맞게 일시적으로 기능을 조정할 수 있음) 이는 매우 짧은 기간에 불과합니다. 프런트엔드 애플리케이션에 대한 모든 필수 기능이 정상적으로 매치가 되고 이전 cluster의 데이터가 새 cluster에 확보된 후에는 전체적인 교체가 보다 간편한 대안일 수 있습니다.

주의: 변경된 매핑 또는 기능을 사용하는 Elasticsearch에서 데이터를 보내거나 받기 위해 작성된 코드(주요 변경 사항 참조)는 선택한 업그레이드 에 관계없이 여전히 수동으로 수정해야 합니다.

알려진 문제들

다음은 업그레이드를 계획할 때 고려해야 하는 주요 문제와 업그레이드 실패 또는 부분 업그레이드 시 수행해야 하는 문제 해결에 관한 정보입니다.

  • network.host 가 설정되지 않음(또는 올바르게 설정되지 않음). Elasticsearch 2.x 시작 전에 elasticsearch.yml에 network.host_non_loopback 을 설정해야 합니다.
  • 마이그레이션 plugin 은 Elasticsearch 버전 1.x에만 호환되므로 업그레이드하기 전에 변경이 필요없다는 것이 확인되면 실제 업그레이드 수행 전에 모든 1.x 플러그인과 함께 제거해야 합니다.
  • 모든 설정 파일을 백업해두고 패키지 업그레이드 이후 다시 적용 한 뒤, 필수 cluster 설정에 맞게 새 구성 파일을 수정할 수 있도록 합니다.
  • 업그레이드 전에 주어진 cluster 노드에 충분한 디스크 공간이 있는지 확인합니다. 이 기본적인 업그레이드 원칙이 간과되는 경우가 종종 있습니다.
  • 아주 오래된 버전(0.90 이전)으로부터 업그레이드하는 경우가 있습니다. Lucene 버전이 Elasticsearch 2.x와 호환되어야 하므로 업그레이드 API 문서를 참조하여 수동 업그레이드 API 요청을 미리 해야 하는지 확인하십시오.
  • 최신 버전의 Elasticsearch와 호환되도록 최신 상태의 plugin을 유지해야 합니다. 업그레이드하는 Elasticsearch 2.x 버전과 호환되는 최신 버전의 plugin이 있으면 이전 plugin을 반드시 제거하고 업그레이드를 수행한 후 최신 plugin을 설치합니다. 마찬가지로 플러그인 폴더에 잘못된 플러그인이 있으면 Elasticsearch가 시작되지 않습니다.
  • cluster의 모든 노드에 Marvel 에이전트를 설치해야 합니다. Marvel 에이전트 plugin에는 라이센스 plugin이 필요하므로, 먼저 모든 노드에 라이센스 plugin을 설치해야 합니다. 이렇게 하지 않으면 라이센스 jar가 프로젝트에 포함되지 않았을 때, java 노드 클라이언트를 사용할 경우 특히 문제가 발생할 수 있습니다.
  • 노드 타입으로 실행되는 Marvel에 대한 2.0의 알려진 문제로 인해, Marvel 에이전트를 실행하는 클라이언트 노드는 Elasticsearch 2.1 또는 이후 버전으로 업그레이드해야 합니다.
  • 필드 매핑이 충돌하는 인덱스는 Elasticsearch 2.x로 업그레이드할 수 없습니다(이러한 인덱스는 시작되지 않을 수도 있음!). 앞서 언급된 마이그레이션 plugin이 이 문제를 확인할 수 있습니다.
  • 닫힌 인덱스가 있고 마이그레이션 plugin에서 필터를 사용할 때 마이그레이션 plugin을 실행할 수 없는 경우, 이 임시 해결 방법을 참조하십시오.
  • index_analyzer 가 더 이상 존재하지 않고 마이그레이션 plugin이 템플릿은 확인하지 않기 때문에 일부 예외가 발생할 수 있습니다. 이 문제에 대한 임시 해결 방법은 이전 템플릿을 수동으로 업데이트하는 것입니다.
  • 이전 커널 버전은 Elasticsearch 2.x가 사용하는 최신 fsync와 관련하여 문제가 발생하므로 커널 버전이 최신인지 확인합니다.
  • 일부 노드가 이전 버전으로 남아 있는 경우 Elasticsearch 2.x와 같은 상위 버전으로 업그레이드할 수 없습니다. 재시작 업그레이드 절차 를 통해 모든 노드를 새 버전으로 업그레이드해야 합니다.
  • Elasticsearch 2.x로 업그레이드한 후 호환되지 않는 버전의 LogstashKibana 실행.