'elasticsearch'에 해당되는 글 420건

  1. 2015.09.16 [Elasticsearch] Part 2.0: The true story behind Elasticsearch storage requirements
  2. 2015.09.09 [Elastic] Elastic 제품들...
  3. 2015.08.28 [Elasticsearch] 2.0.0 beta 테스트를 위한 dependency 설정.
  4. 2015.08.27 [Elasticsearch] _id 와 _routing 이해하기.
  5. 2015.08.20 [Elasticsearch] SearchType.SCAN 사용 시 Aggregation 할 수 있나요?
  6. 2015.08.17 [Elasticsearch] Scripting 을 이용한 Field Value 조작하기.
  7. 2015.08.12 [Elasticsearch] Test Code 작성용 템플릿 Class.
  8. 2015.08.12 [Elasticsearch] 실행 및 중지 스크립트 테스트용.
  9. 2015.08.06 [Kibana] Kibana 에서 Index Alias 사용하기
  10. 2015.07.29 [Kibana4.x] Value format 설정하기

[Elasticsearch] Part 2.0: The true story behind Elasticsearch storage requirements

Elastic/Elasticsearch 2015. 9. 16. 10:39

원본글)


한 줄 요약)

doc_values 와 index.codec 설정을 사용하면 좋다!!


storage 용량을 압축을 통해서 15 ~ 25% 정도 절약 할 수 있다는 이야기 입니다.

더불어 주의 하셔야 할 점은 decompression 시 penalty 가 있다는 이야기도 있습니다. 

해결 방법(?)도 제시해 주고 있는데요. 

size 파라미터를 이용해서 size=0 으로 해서 사용하시면 됩니다.


압축 옵션의 경우 색인 시에는 성능 저하는 크기 않지만 질의 시에는 성능 저하가 있을 수 있습니다.


:

[Elastic] Elastic 제품들...

Elastic 2015. 9. 9. 10:30

Elasticsearch, Logstash, Kibana 를 주로 사용하고 있다 보니 다른 제품들은 크게 관심있게 보지를 않았습니다.

제가 관심 있게 보는건 저 한테 필요 하거나 오픈소스 이거나 인데요.

당연히 위에 제품들은 모두 제가 사용하고 있는 것들이고 오픈소스 입니다.


Elastic 에서 제공하고 있는 제품들은 아래 링크를 통해서 확인 하시면 되는데요.


제품 소개 링크) https://www.elastic.co/products


최근까지 제가 잘 못 알고 있던 제품이 있었는데 이것도 한번 사용해 보기 위해 elastic 제품들을 각각 한 줄로 정리해 보기로 했습니다.


Elasticsearch - 오픈소스 무료

루씬 기반의 분산 검색 엔진 입니다.


Logstash - 오픈소스 무료

다양한 input/filter/ouput/codec 들을 제공하는 collector 입니다.


Kibana - 오픈소스 무료

elasticsearch를 DB로 사용하는 visualization/dashboard 도구 입니다.


Packet Beat - 오픈소스 무료

OS 또는 Process 등에서 발생 하는 network 모니터링 도구 입니다.


Top Beat - 오픈소스 무료

기본적인 시스템(CPU, MEM, IO, DISK) 모니터링 도구 입니다.


Elasticsearch Hadoop Plugin - 오픈소스 무료

Hadoop component 들과 elasticsearch를 쉽게 연동 할 수 있도록 도와 주는 라이브러리 입니다.


Found - SaaS 형 서비스 유료

Cloud 환경에서 ELK 를 쉽게 구축하고 사용할 수 있도록 해주는 서비스 입니다.


Shield - 유료

ELK를 이용하여 기업에서 사용하기에는 부족했던 인증, 권한 등의 기능을 제공해 주는 제품 입니다.


Watcher - 유료

ELK를 이용하면서 아쉬웠던 alert 이나 notification 에 대한 기능을 제공해 주는 제품 입니다.


Marvel - 유료 (개발자 버전은 무료)

Elasticsearch에 대한 관리 및 모니터링을 제공하는 제품 입니다.


저는 기본적으로 ELK 기반으로 필요한건 다 만들어서 사용을 하고 있는 편입니다.

beats 도 역시 만들어서 사용하고 있었는데요. 

이건 한번 시도를 해봐야 겠내요. :)

:

[Elasticsearch] 2.0.0 beta 테스트를 위한 dependency 설정.

Elastic/Elasticsearch 2015. 8. 28. 12:27

오전에는 못찾았는데... 

지금은 2.0.0-bete1-SNAPSHOT 을 잘 찾내요.


===========================


기능 점검을 하기 위해서 maven dependency 수정을 해야 합니다.

beta 이고 snapshot 버전이다 보니 repository 설정을 제대로 해 놓지 않으면 jar 를 찾지 못하는 오류가 발생을 합니다.

혹시 테스트 해보실 분은 아래와 같이 정보 추가 또는 수정해 주시면 될 것 같습니다.


벌써 beta2 가 올라왔내요.


[pom.xml]

<elasticsearch.version>2.0.0-beta2-SNAPSHOT</elasticsearch.version>


<repositories>

  <repository>

    <id>elasticsearch-releases</id>

    <url>http://maven.elasticsearch.org/releases</url>

    <releases>

      <enabled>true</enabled>

    </releases>

    <snapshots>

      <enabled>false</enabled>

    </snapshots>

  </repository>

  <repository>

    <id>oss-snapshots</id>

    <name>Sonatype OSS Snapshots</name>

    <url>https://oss.sonatype.org/content/repositories/snapshots/</url>

  </repository>

</repositories>


<dependencies>

  <dependency>

    <groupId>org.elasticsearch</groupId>

    <artifactId>elasticsearch</artifactId>

    <version>${elasticsearch.version}</version>

    <type>jar</type>

  </dependency>

</dependencies>


:

[Elasticsearch] _id 와 _routing 이해하기.

Elastic/Elasticsearch 2015. 8. 27. 11:55

Elasticsearch에서 routing 기능은 다양하게 활용이 가능 합니다.

이게 무엇인지는 아래 elastic official document 를 먼저 읽어 보시면 좋을 것 같습니다.


[Reference. _routing]

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-routing-field.html


위 문서의 요약 내용은 아래와 같습니다.

- store set to true

- index set to not_analyzed


여기서 not_analyzed로 설정 하는 이유는 shard routing 을 위한 shard id 를 구하기 위해서 입니다.

즉, 단일 구성의 key로 만들어야 routing 정보가 정해지기 때문입니다.


[Reference. _id]

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-id-field.html

※ _routing 과 동일한 mapping 속성을 갖습니다.


_id와 _routing 의 이해


기본적으로 문서를 색인하기 위해서는 문서의 unique id 가 필요 합니다.

elasticsearch 에서는 _id 라는 필드를 이용해서 문서의 uniqueness 를 보장해 주고 있는데요.

이 값은 hash 알고리즘을 이용해서 색인할 shard id 를 생성 합니다. 

또한, _id 값은 Get API 를 이용해서  문서를 직접 access 할 수 있게 해줍니다.


[Get API]

$ curl -XGET http://localhost:9200/INDEX/TYPE/_id


_routing은 쉽게는 문서에 대한 그룹이나 분류에 활용을 할 수 있는 기능이라고 이해 하시면 좋습니다.

즉, 문서를 색인 할 때 같은 분류에 속하는 문서들을 특정 shard로 색인을 하고 검색 시에도 모든 shard를 대상으로 하지 않기 때문에 성능적인 부분이나 활용에서도 유용합니다.


_routing도 _id 와 동일하게 해당 값을 이용해서 shard id 를 구한다는 점에서 동일하며 mapping 설정도 동일 합니다.

차이점이 있다면 _id 는 문서 자체에 대한 routing 이고, _routing 은 문서 집단 또는 그룹에 대한 routing 이라는 것입니다.

또한 검색 입장에서는 _id 는 문서 하나를 검색해서 가져오지만, _routing 은 지정된 key 값에 의한 shard 들을 대상으로 검색을 하게 됩니다.


아래는 REST API 형태의 예제 입니다.


※ _id 가 1 인 문서 검색

$ curl -XGET http://localhost:9200/INDEX/TYPE/1


※ _routing 을 하나 만 지정한 문서 검색 (routing 값은 sports)

$ curl -XGET http://localhost:9200/_search?routing=sports

sports 에 해당하는 shard id 가 0 이라면 0 번 shard 로만 검색 질의가 실행 됩니다.


※ _routing 을 두 개 지정한 문서 검색 (routing 값은 sports, entertainment)

$ curl -XGET http://localhost:9200/_search?routing=sports,entertainment

sports 에 해당하는 shard id 가 0이고 entertainment 에 해당하는 shard id 가 1 이라면 0과 1번 shard 로만 검색 질의가 실행 됩니다.


:

[Elasticsearch] SearchType.SCAN 사용 시 Aggregation 할 수 있나요?

Elastic/Elasticsearch 2015. 8. 20. 12:40

제가 분석하고 결과를 정리해 두고도 같은 실수를 하게 되내요.

별 내용은 아닙니다.

단순 정보의 보관 및 찾아보기 용으로 기록해 둡니다.


SearchType.SCAN 사용 시 Aggregation 기능은 사용 할 수 없습니다.


다만, 혼동하는 이유는 QueryDSL 작성 시 작성이 가능 하기 때문에 되는 것 처럼 착각을 하게 되는 것이구요.

실제 작성해서 실행 시켜 보면 아래와 같은 에러를 경험하게 됩니다.


[에러내용]

ElasticsearchIllegalArgumentException[aggregations are not supported with search_type=scan]


혹시라도 잘 못 알고 계시는 분들은 저 처럼 실수 하지 마시기 바랍니다. :)

:

[Elasticsearch] Scripting 을 이용한 Field Value 조작하기.

Elastic/Elasticsearch 2015. 8. 17. 14:59

정확하게 조작한다기 보다 저장된 document 의 field value 를 이용한다가 맞을 것 같습니다.

기본 참조 문서는 아래와 같습니다.

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html


문서를 보셨으면 아시겠지만 기본 groovy 를 사용하게 되어 있습니다.

하지만 보안 이슈로 설정이 기본 false 입니다.

아래와 같이 설정을 변경해 주셔야 사용이 가능 합니다.


[Scripting Enable]

script.inline: on

또는

script.groovy.sandbox.enabled: true

※ 관련 설정에 대한 자세한 내용은 문서를 참고 하시면 됩니다.


아래는 문서 내용 snippet 입니다.


ValueDescription

off

scripting is turned off completely, in the context of the setting being set.

on

scripting is turned on, in the context of the setting being set.

sandbox

scripts may be executed only for languages that are sandboxed

그리고 추후 2.0.0 에서는 위 설정에서 groovy sandbox 는 deprecated 예정이니 참고하세요.

(https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html#_groovy_sandboxing)


설정을 해주셨으니 이제 value 에 접근하는 방법에 대해서 알아 보겠습니다.

문서에서는 총 3 가지 방법을 제시해 주고 있습니다.


[Value 접근]

# Document fields

_doc['field_name'].value or values


# Stored fields

_fields['field_name'].value


# Source field

_source['field_name']


※ 여기서 _fields 는 store 옵션을 true 로 하지 않으셨다면 에러가 발생 합니다.


value에 접근 하는 방법을 아셨으니 이 값을 이용한 연산을 어떻게 하는지도 궁금하실 겁니다.

위에서 말씀 드렸듯이 기본적인 language 는 groovy 입니다.

그렇기 때문에 groovy script 를 이용해서 연산 및 처리를 하시면 되겠습니다.


아래는 substring에 대한 커뮤니티의 질문에 대한 예제 코드 입니다.


[script_fields 샘플코드]

GET /test_index/_search

{

    "script_fields": {

        "field1_substring": {

            "script": "_doc['field1'].value"

        }

    }

}


GET /test_index/_search

{

    "script_fields": {

        "field1_substring": {

            "script": "_fields['field1'].value.substring(0, 5)"

        }

    }

}


GET /test_index/_search

{

    "script_fields": {

        "field1_substring": {

            "script": "_source.field1.substring(3, 10)"

        }

    }

}


※ script_fields 를 이용하게 되면 return 시 fields를 통해서 정보가 전달 됩니다. (즉, 필요한 field 가 있다면 추가로 선언해 주셔야 한다는 이야기 입니다.)

※ QueryDSL 을 보시면 아시겠지만 기본 query 구문이 없으면 match_all 로 동작 합니다.

※ 추가적으로 주의 할 점은 field 속성이 not_analyzed 인지 analyzed, store 인지 아닌지 확인 하시고 테스트 하시기 바랍니다.


:

[Elasticsearch] Test Code 작성용 템플릿 Class.

Elastic/Elasticsearch 2015. 8. 12. 10:52

정말 단순히 제가 테스트 할 때 필요해서 기록해 두는 겁니다. ^^;

별로 도움 안될 확율이 높으니 관심있게 보지 마세요.


/**
 * Created by hwjeong
 * 이 템플릿은 Elasticsearch Test Code를 작성하는데 기본으로 사용하기 위해 작성 하였습니다.
 * 사용 방법은 두 가지 입니다.
 * settings.put("cluster.name", "elasticsearch") 를 통해서 기본적으로 구성 및 등록할 클러스터를 생성합니다.
 * settings.put("path.data", "data/index") 정보는 local 테스트 시 색인 데이터를 어디에 저장할지 설정을 하게 됩니다.
 *      client 노드를 구성해서 테스트를 할거라면 생성한 프로젝트 root 경로 아래 data/index 라는 폴더가 생성이 됩니다.
 * nodeBuilder를 통해서 테스트 및 생성할 노드의 특성을 정의 할 수 있습니다.
 *  .data(true) 설정 시 작성하시는 노드는 데이터 노드의 특성을 갖습니다.
 *  .local(true) 설정 시 같은 머신의 jvm 내부 노드간 통신이 이루어 지며 다른 jvm 노드간에는 통신이 되지 않습니다.
 *      false 로 설정 시 네트워크 분리가 되어 있지 않을 경우 운영 서버나 다른 클러스터 군으로 연결 되는 것을 주의 하셔야 합니다.
 *  .client(true)
 *      true 라는 의미는 client node 로 사용하겠다는 의미 이며, 어떠한 data 도 저장 하지 않겠다는 것입니다.
 *      즉, node.data 가 false 로 설정 되는 것과 같습니다.
 */
public class EsTestTemplate {

private static final Logger log = LoggerFactory.getLogger(EsTestTemplate.class);

private ImmutableSettings.Builder settings;
private Node node;
private Client client;

@Before
public void setup() throws Exception {
settings = ImmutableSettings.settingsBuilder();
settings.put("cluster.name", "elasticsearch");
// settings.put("node.name", "testNode");
// settings.put("path.data", "data/index");
// settings.put("gateway.type", "none");

node = NodeBuilder.nodeBuilder()
.settings(settings)
.data(true)
.local(false)
.client(false)
.node(); // included start() method.

client = node.client();
}

@After
public void tearDown() throws Exception {
client.close();
node.close();
}
}


※ 코드는 그냥 단순 nodebuilder 를 이용해서 테스트용 node 를 하나 생성 하거나 client를 생성 하는 내용입니다.


:

[Elasticsearch] 실행 및 중지 스크립트 테스트용.

Elastic/Elasticsearch 2015. 8. 12. 10:27

역시나 또 자꾸 까먹어서.. ^^

elasticsearch 뿐만 아니라 기타 다른 프로그램을 실행 시키고 중지 시킬 때 활용 하시면 됩니다.


[start.sh]

#!/bin/bash


DIR_NAME=`dirname "$0"`

DIR_HOME=`cd $DIR_NAME; cd ..; pwd`


$DIR_HOME/bin/elasticsearch > /dev/null 2>&1 & ES_PID=$!

echo $ES_PID > $DIR_HOME/bin/elasticsearch_daemon.pid


[stop.sh]

#!/bin/bash


DIR_NAME=`dirname "$0"`

DIR_HOME=`cd $DIR_NAME; cd ..; pwd`


ES_PID=`cat $DIR_HOME/bin/elasticsearch_daemon.pid`

kill -9 $ES_PID

echo "Elasticsearch Daemon($ES_PID) is killed"

rm -f $DIR_HOME/bin/elasticsearch_daemon.pid


참고로 위 실행 스크립트는 설정 최적화나 뭐 그런건 없습니다.

단순 테스트 좀 빨리 해보기 위해서 copy & paste 의 시간 절약용 입니다. :)

:

[Kibana] Kibana 에서 Index Alias 사용하기

Elastic/Kibana 2015. 8. 6. 18:38

보통 ELK 조합으로 처음 사용하시는 분들의 경우 index 수가 많아 질 수록 kibana chart 생성이 느려 지거나 shard failed  같은 메시지를 경험 하실수 있을 텐데요.


이유는 아주 가까운 곳에 있습니다.

이미 아시는 분들도 많을 테지만 첨 접하시는 분들에게는 유용할 수 있으니 올려 보겠습니다.


기본적으로 logstash를 사용하면 time based 로 index 가 생성 됩니다.

보통 아래와 같은 패턴으로 정의 됩니다.

logstash-%{+YYYY.MM.dd}


위와 같이 정의가 되어 있기 때문에 kibana 에서는 아래와 같이 설정이 되는데요.

logstash-*

- Settings -> Indices 에 있습니다.


즉, 이렇게 설정이 되기 때문에 생성된 모든 index 를 대상으로 질의를 하게 됩니다.

그럼 어떤 문제들이 발생 할지 예측 가능 하시겠죠.


전체 index를 대상으로 질의를 하기 때문에 search thread 가 생성되어 있는 shard 수 만큼 실행 되게 됩니다.

결국 시스템 리소스는 쭈욱 올라갈거고 이렇게 되다 보면 timeout 등이 발생을 하게 될 겁니다.

결국 shard failed 현상이 나오게 되는 것입니다.


이런 문제를 해결 하기 위해서는 index aliases 기능을 활용 하시면 됩니다.

어차피 보고 싶은 정보는 최신 정보이기 때문에 latest index 에 대해서만 alias 를 생성해 주시고 chart 및 dashboard 생성 시 생성한 alias 를 대상으로 만들어 주시면 됩니다.

하지만 하루가 지나면 alias 를 다시 latest index 를 바라 볼 수 있도록 바꿔 줘야 하기 때문에 이런 부분은 관리 기능을 만들어서 사용하시면 별 문제 없이 지속적으로 사용을 하실 수 있을 것입니다.


[Index Aliases]

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html


:

[Kibana4.x] Value format 설정하기

Elastic/Kibana 2015. 7. 29. 17:46

kibana를 이용하다 보면 화면에 보여지는 값에 대한 format 을 고치고 싶은 욕구가 생깁니다.

이걸 어디서 고쳐줘야 하나 싶은데 역시 매뉴 몇번 눌러 보면 찾을 수 있습니다.

귀찮아 하시는 분들을 위해 공유해 봅니다.


[참고문서]

https://www.elastic.co/blog/kibana-4-1-field-formatters


[매뉴 tree]

## Global 설정

GNB -> Settings -> Advanced


## 특정 인덱스의 field format을 바꾸고 싶을 경우

GNB -> Settings -> Indices -> Select Index Patterns -> controls 컬럼에서 수정하고자 하는 field 클릭


[Advanced 화면]



: