26 10월 2016 출시

Elasticsearch 5.0.0 GA 출시

By Clinton Gormley

Elasticsearch 2.0.0 출시 이후 310명의 커미터들에 의해 추가된 2,674건의 풀 리퀘스트의 반영과 Lucene 6.2.0이 기반이된 Elasticsearch 5.0.0 GA의 출시를 발표하게 되어 자랑스럽게 생각합니다. 이번에 출시된 버전은 최신의 안정화된 버전이며, 당사의 Elasticsearch 클라우드 서비스 플랫폼인  Elastic Cloud에 이미 반영되어 있습니다.

지금 바로 다운로드하세요! 꼭 필요하실 겁니다.

Elasticsearch 5.0.0에는 모든 사람들을 위한 무언가가 있습니다. 이번 버전은 Elasticsearch 역사상 가장 빠르고 안전하며 탄력적이고 사용이 편리한 버전이며, 향상된 성능과 새로운 기능들이 함께 제공됩니다.

인덱싱 성능

5.0.0에서는 숫자형 데이터 구조를 비롯한 여러 가지 변경 사항이 적용되고 (새로운 데이터 구조 참조), 동일한 도큐먼트에 대한 동시 업데이트를 차단하는 락 컨텐션을 줄이고, 트랜잭션 로그를 동기화(fsync)할 때 차단 요건을 줄이면서 인덱싱 처리량이 크게 개선되었습니다. 비동기 트랜스로그 동기화(Asynchronous translog fsyncing)는 스핀 디스크 사용자에게 특히 유용하며, Elasticsearch를 사용해 도큐먼트 ID를 자동 생성하는 append-only 사례(시간 기반 이벤트)의 처리량이 크게 향상됩니다. 실시간 도큐먼트 GET 지원 방식이 내부적으로 변경되면서 더 많은 메모리를 인덱싱 버퍼로 사용할 수 있고 가비지 수집에 드는 시간을 크게 절약할 수 있게 되었습니다.

사용 사례에 따라 25~80%의 인덱싱 처리량 개선을 기대할 수 있습니다.

Ingest node

Elasticsearch로의 데이터 수집이 완전히 편리해 졌습니다. Logstash는 강력한 도구이지만, 소규모 사용자들은 방대한 라우팅 옵션 없이 필터만 필요로 하는 경우가 많습니다. 이에 따라, grok, split, convert, date와 같이 가장 인기 있는 Logstash 필터를 취해 Elasticsearch에 프로세서 형태로 구현했습니다. 여러 개의 프로세서가 파이프라인으로 통합되어, 인덱스 또는 벌크 API를 통한 인덱스 시간에 도큐먼트에 적용할 수 있습니다.

이제 로그 메시지 수집이 쉬워졌습니다. Ingest API로 파이프라인을 구성하고 Elasticsearch로 로그 파일을 전송하도록 Filebeat를 설정하기만 하면 됩니다. 심지어 전용 ingest node를 실행해서 검색, 어그리게이션, 인덱싱으로부터 추출 및 확대 작업 부하를 구분할 수도 있습니다. 자세한 내용은 새로운 수집 방법 - 제1부에서 확인할 수 있습니다.

Painless 스크립트

스크립트 언어의 사용은 Elasticsearch 어디서나 실행할 수 있지만, 보안상의 이유로 인해 스크립트 활성화를 기본으로 설정할 수 없다는 불만이 있었습니다. 신속하고 안전하며 기본 설정으로 활성화가 가능한 Painless라고 하는 새로운 스크립트 언어가 개발되었습니다. 그 외에도, Painless는 Groovy보다 4배 빠르며 점점 더 빨라지고 있습니다. 뛰어난 성능의 Painless가 새로운 기본 스크립트 언어로 채택되면서 Groovy, Javascript, Python은 사용하지 않기로 했습니다.

Painless에 대한 자세한 내용은 블로그 Painless: 새로운 스크립팅 언어에서 확인할 수 있습니다.

새로운 자료구조

Lucene 6은 Block K-D 트리라고 하는 숫자 및 위치정보 필드를 위한 새로운 소수점 자료구조를 도입하면서, 수치 값의 인덱싱 및 검색 방식에 혁신을 일으켰습니다. 이번 벤치마크에서 소수점 숫자는 쿼리 시간이 36% 빨라지고 색인 시간이 71% 빨라졌으며 디스크 사용량은 66%, 메모리 사용량은 85% 줄어들었습니다 (5.0의 numb3rs 검색참조). 소수점의 확장은 ip 필드가 IPv4는 물론 IPv6 주소도 지원할 수 있도록 합니다. 그 외에도, Lucene의 새로운 LatLonPoint를 사용하도록 geo_point 필드를 변경해서 위치정보 쿼리 성능이 몇 배가 되었습니다.

또한 half-precision(16비트) 부동 소수점을 위한 half_float 필드 유형과 scaled_float 유형을 long 필드 유형으로 내부적으로 구현하여 추가하면서, longs에 사용되는 압축 기법을 활용할 수 있게 되었습니다.

analyzed 및 not_analyzed 문자열 필드는 전체 텍스트 검색을 위한 전용 text 필드, 그리고 문자열 식별자 검색, 분류 및 어그리게이션을 위한keyword 필드로 대체되었습니다. 자세한 내용은 문자열은 죽었다, 문자열이여 영원하라! 를 참조하십시오.

마지막으로, 적절한 지원과 함께 dots-in-fieldnames가 다시 채택되었습니다. foo.bar 와 같은 도트 필드는 foo 내부 object 필드의 bar필드에 해당합니다. 2.x에서 dots-in-fieldnames가 지원되지 않아 1.7에서 사용하지 못하신 분들은 마이그레이션 통로를 제공하는 Elasticsearch 2.4.0 을 참조하십시오.

검색 및 어그리게이션

이전 일, 월, 년도의 일부 메트릭을 그래프로 표현하는 멋진 Kibana 차트의 속도가 Instant Aggregations을 통해 크게 향상되었습니다. 이 차트의 데이터 대부분은 더 이상 업데이트되지 않는 인덱스에서 가져오지만, { "gte": "now-30d", "lte": "now" }와 같은 범위를 캐싱할 수 없어 모든 요청에 대한 어그리게이션을 처음부터 다시 계산해야 했습니다. 이후 1년간에 걸쳐 노력한 검색 API 리팩토링을 통해 Elasticsearch는 range 쿼리를 실행하는 방식을 크게 개선할 수 있었으며,이제 변경된 인덱스에 대한 어그리게이션만 다시 계산됩니다.

이 외에도, 어그리게이션의 많은 부분이 개선되었습니다. 이제 히스토그램 어그리게이션이 일부 버킷을 지원하고, 음수 버킷의 반올림을 정확하게 처리하며, comnibatorial explosion의 위험이 줄어들어 텀 어그리게이션이 더욱 효율적으로 계산되고, 프로필 API가 어그레이게이션을 지원합니다.

Completion suggester는 삭제된 도큐먼트를 계정에 적용하도록 처음부터 다시 작성되었고, 이제 단순한 페이로드 대신에 도큐먼트를 반환합니다. 컨텍스트는 더 유연해지고 suggester는 하나의 컨텍스트, 여러 개의 컨텍스트, 또는 전체 컨텍스트에 대해 요청할 수 있습니다. suggestion에 대한 가중치 부여는 인덱스 시간을 제외하고 가능합니다. 점수는 접두사 길이, 컨텍스트, 위치를 기반으로 조정할 수 있습니다.

Percolator도 더 빨라지고 메모리 효율이 향상되도록 다시 작성되었습니다.이제 Percolator 쿼리의 텀은 기존의 강제적인 접근 대신에 확인이 필요한 잠재적 일치만 쿼리하도록 인덱싱됩니다. Percolator API는 퍼콜레이션에 검색 API의 모든 기능인 하이라이트, 스코어링, 페이징 등을 적용할 수 있는 percolate 쿼리로 대체되었습니다.

사용 편의성

5.0.0 버전의 주요 테마들은 Elasticsearch의 안전성과 사용 용이성을 향상시켜 주었습니다. 우리는 "Shout loud, shout early"라고 하는 접근법을 채택했습니다. 이 접근법은 어떤 문제가 발생했을 때 사용자의 추측에 기대거나 이후에 데이터가 손실될 위험을 감수하지 않고 즉시 문제를 알려주는 방식입니다. 이러한 원칙이 잘 드러난 예시가 인덱스 및 클러스터 설정에 이루어진 개선입니다.

이제 설정은 엄격하게 검증됩니다. Elasticsearch의 설정 값이 올바르지 않으면 문제가 제기됩니다. 설정이 정상적으로 인식되지 않아도 문제가 제기되고 did-you-mean 제안이 제시됩니다. 그 외에도, 이제 클러스터 및 인덱스 설정을 해제( null)하고include_defaults매개변수를 지정해서 기본 설정을 확인할 수 있습니다. 마찬가지로, 본문 및 쿼리 문자열 매개변수는 엄격하게 구문이 분석되고 잘못되거나 인식되지 않는 매개변수는 제외됩니다.

Rollovershrink API는 시간 기반 인덱스를 효율적으로 관리하는 새로운 패턴을 지원합니다: 색인 중에는 하드웨어 자원 대부분의 사용을 위해 여러개의 샤드를 사용하고 색인이 끝나면 효율적인 저장 및 검색을 위해 1개의 샤드(또는 몇 개의 샤드) 수준으로 shrink를 합니다.

인덱스 관리도 여러 가지로 개선되었습니다. 인덱스 생성이 기존보다 간단해 졌습니다. wait_for_status=green대신에, 이제 인덱스 사용이 가능할 때 인덱스 생성 요청이 반환됩니다. 새로 생성된 인덱스는 더 이상 클러스터를 red상태로 전환하지 않으므로, 시스템 관리자(sysadmins)는 밤에 편안히 잠을 취할 수 있습니다.

샤드 할당에 문제가 발생하는 경우 Elasticsearch는 더 이상 샤드를 무한정 할당하려고 시도하지 않습니다(로그를 입력하는 동안). 그 대신, 5회까지만 시도한 후 문제가 해결될 때까지 대기합니다. 문제 해결을 지원하기 위해 도입된 새로운 cluster-allocation-explain API 는 샤드가 할당되지 않는 이유를 찾는 데 필수적인 도구입니다.

마지막으로, 이제 현재 사용 중인 사용 중단(deprecated) 기능에 대한 충분한 경고를 위해 사용 중단 로그(deprecation logging) 가 디폴트로 활성화됩니다. 이 기능은 새로운 주요 버전에서는 스트레스가 훨씬 덜한 프로세스로 전환될 것입니다.

탄력성(Resiliency)

이번 릴리스에는 Elasticsearch를 더욱 안전하게 만들어주는 여러 가지 변경 사항이 적용되었습니다. 분산 모델의 모든 요소를 하나 하나 고르고, 리펙토링 및 간소화하며 신뢰성을 높였습니다. 이제 클러스터 상태 업데이트는 클러스터에 속한 모든 노드의 확인이 주어진 후에만 실행됩니다. 샤드의 복제본이 주 샤드에 의해 실패로 표시되면 주 샤드는 마스터 노드의 응답을 대기합니다. 인덱스는 인덱스 이름 대신에 데이터 경로의 UUID를 활용하여 명명 충돌을 회피합니다.

시스템이 충분한 가용 파일 설명자(file descriptors)를 가지도록 적절히 구성하지 않으면 나중에 데이터가 손실될 위험이 있습니다. 이제 Elasticsearch는 진행 중의 예기치 못한 상황에 대비할 수 있도록 부트스트랩 확인(bootstrap checks) 을 사용합니다. 그러나 시스템을 적절하게 구성하는 것은 부담스러울 수 있으며, 노트북에서 테스트 실행만 원하는 경우에는 특히 그렇습니다. Elasticsearch는 부적절한 구성을 경고하는 로컬 호스트 전용 개발자 모드를 채택했습니다. 네트워크를 구성해서 클러스터를 형성하자마자 운영 모드로 전환되고 모든 시스템 확인이 강화됩니다. 부트스트랩 확인: 지금 잠시 동안의 번거로움으로 나중의 재앙을 방지하세요! 를 참조하십시오.

우리는 새로운 서킷 브레이커(circuit breaker) 를 추가했습니다. 이것은 in-flight 요청에 사용된 메모리 사용량을 제한하고, 어그리게이션 버켓의 메모리 사용을 추적하기 위한 서킷 브레이커 요청을 확장하며, 수십억개의 버킷을 생성하는 병적인 요청을 무시합니다. 만약 이것이 발생되면 노드는 undefined 상태에서 성능 저하를 일으키는 대신 깔끔하게 작업을 중단합니다(die-with-dignity).

시스템 관리자(sysadmins)를 위한 기능으로는 클러스터를 악성 사용자로부터 보호하고 이들이 위험 영역에 침입했을 때 선의의 피해자에게 경고를 제공하는 soft limits 가 다수 추가되었습니다. 그 예시로, 기본 검색 대기 시간 초과, text 필드의 필드 데이터(fielddata) 로딩 비활성화, 검색 요청이 목표로 할 수 있는 샤드 수 제한, 매핑의 필드 수 제한 등이 있습니다.

Java REST 클라이언트

수 년의 기다림 끝에 마침내 low-level의 Java HTTP/REST 클라이언트가 출시되었습니다. 이는 의존성이 최소화된 단순한 HTTP 클라이언트로서, 노드 오류 시 요청의 스니핑, 로깅, 요청의 라운드 로빈 및 실패시 재시도를 처리합니다. 오래전부터 Java API보다 훨씬 안정적이라고 검증된 REST 계층을 사용하므로, 여러 업그레이드에 사용할 수 있으며, 주요 버전의 업그레이도 가능합니다. Java 7과 함께 작동하며 의존성이 매우 낮아, Transport 클라이언트에 비해 의존성 충돌이 적습니다. 단순한 HTTP 이므로, 다른 HTTP 클라이언트들과 마찬가지로 방화벽과 프록시 설정이 가능합니다. 우리의 벤치마크에서 Java REST 클라이언트는 Transport 클라이언트와 거의 유사한 성능을 나타냈습니다.

이것은 low-level 클라이언트라는 점에 유의해야 합니다. 현재 단계에서는 IDE에서의 자동 입력을 지원하는 쿼리 빌더나 헬퍼가 제공되지 않습니다. JSON-in, JSON-out 방식이며, JSON 구축 방식에 따라 결과가 달라집니다. 개발은 계속될 것입니다. 쿼리를 구성하고 응답을 구문 분석할 수 있는 API가 추가될 예정입니다. 변경 사항은 #19055이슈에서 확인하실 수 있습니다.

마이그레이션 헬퍼

Elasticsearch 마이그레이션 헬퍼는 Elasticsearch 2.3.x/2.4.x에서 Elasticsearch 5.0으로의 마이그레이션을 대비할 때 사용하도록 설계된 사이트 플러그인입니다. 3가지 도구로 구성되어 있습니다.

클러스터 점검
클러스터, 노드, 인덱스에 대해 일련의 점검을 실행하고 업그레이드 전에 수정이 필요할 것으로 확인된 문제를 알려줍니다.
재색인(Reindex) 헬퍼
v2.0.0 전에 생성된 인덱스는 재색인을 해야 Elasticsearch 5.x에서 사용할 수 있습니다. 재색인 헬퍼에서 버튼 하나만 누르면 기존 인덱스가 업그레이드 됩니다.
사용중단 로그(Deprecation Logging)
Elasticsearch는 사용 중단 기능이 사용되는 각각의 경우에 메시지를 기록하는 사용 중단 로그를 제공합니다. 이 도구를 사용하면 클러스터에 대한 사용 중단 로깅을 활성화 또는 비활성화할 수 있습니다.

Elasticsearch 마이그레이션 헬퍼 설치 가이드.

Elasticsearch 1.x에서 직접 마이그레이션하는 경우 관련 가이드는 업그레이드 문서를 참조하십시오.

결론

Elasticsearch 5.0.0을 다운로드하여 테스트 해 보시고 당사 트위터(@elastic) 또는 포럼에 의견을 남겨주시기 바랍니다. 발견되는 문제는 GitHub 이슈 페이지에 보고하실 수 있습니다.