Elasticsearch License 정책변경

ELK|2024. 9. 1. 08:04
728x90

https://www.elastic.co/kr/blog/elasticsearch-is-open-source-again

 

Elasticsearch is Open Source, Again

Elastic is adding AGPL as an open source license option to Elasticsearch alongside ELv2 and SSPL....

www.elastic.co

 

재밋는 뉴스가 나왔다. elasticsearch 라이선스 AGPL이 추가되었다.

 

몇년전 AWS와의 갈등 끝에 elastic, SSPL 라이선스로 변경하고 전통적인 오픈소스 라이선스를 삭제하였다.

 

이후 국내 한정 엘라스틱 포함해서 솔루션을 판매하던 업체들에 날벼락 같은 일이되었고 해당 라이선스에 반발해서 만든 AWS의

 

오픈써치가 생각보다 업데이트도 빠르게 진행하고 라이선스 마져 apache2.0 라이선스여서 꽤 많이 쓰이기 시작한걸로 알고 있다.

 

AGPL이 apache2.0 엄격한 라이선스라 뭐 사실 솔루션 업체들 입장에선 크게 다르진 않을거라 생각 되긴 하지만...

 

여하간 주말간 변경점이 추가되어 내용 작성해본다.

 

자세한 내용은 상단 공식발표 내용을 보면 된다.

 

 

 

 

 

 

근데 주식은 무슨일이냐????

 

 

'ELK' 카테고리의 다른 글

Elasticsearch core 제한  (0) 2024.08.08
Term_vector  (0) 2024.01.23
Elasticsearch에서의 null  (0) 2023.08.19
효율적인 엘라스틱 업데이트는 어떻게 해야 할까?  (0) 2023.06.29
_source field 원본 저장 기능 off  (0) 2023.04.16

댓글()

Elasticsearch core 제한

ELK|2024. 8. 8. 02:50
728x90
 
 

작년 쯔음인가 리눅스 기능으로 CPU 코어 제한을 건적이 있다.

근데? 기능이 있네... 이렇게 하면 깔끔한데... 황당... elasticsearch.yml에 등록해주면 된다.

 

 

레퍼링크 

 

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/modules-threadpool.html#node.processors

'ELK' 카테고리의 다른 글

Elasticsearch License 정책변경  (4) 2024.09.01
Term_vector  (0) 2024.01.23
Elasticsearch에서의 null  (0) 2023.08.19
효율적인 엘라스틱 업데이트는 어떻게 해야 할까?  (0) 2023.06.29
_source field 원본 저장 기능 off  (0) 2023.04.16

댓글()

Term_vector

ELK|2024. 1. 23. 22:18
728x90

아무래도 검색쪽은 약하다 보니 놓친 부분이 있었다.

엘라스틱 필드 옵션에 보면 Term_vector 라는 녀석이 있다. 디버그할때나 쓰는 정도로 생각했었다.

(필드내 텍스트의 위치 정보) 

 

그러다 보니.... 맵핑정보에서 별생각없이 용량만 차지하는 존재 정도로 생각하고 날렷고...

얼마뒤 대참사를 발견하게 되었다.  

 

하이라이팅을 사용하는 몇개의 필드가 있는데 검색질의에 포함시 기존에 잘나오던 검색이 나오지 않는 문제가 발생했다.

처음엔 같이 일하는 개발자가 뭔가 삽질했나? 생각했으나 그럴리 없었고 몇가지 변경점 체크 끝에 아래 내용을 알게 되었다.

Fast vector highlighteredit

The fvh highlighter uses the Lucene Fast Vector highlighter. This highlighter can be used on fields with term_vector set to with_positions_offsets in the mapping. The fast vector highlighter:

  • Can be customized with a boundary_scanner.
  • Requires setting term_vector to with_positions_offsets which increases the size of the index
  • Can combine matches from multiple fields into one result. See matched_fields
  • Can assign different weights to matches at different positions allowing for things like phrase matches being sorted above term matches when highlighting a Boosting Query that boosts phrase matches over term matches

 

해당타입을 하이라이트에서 쓰이는거라곤 생각조차 안해봤다. 루씬으로 찾으니 이해가 빠르게 되었다. 해당 내용은 나중에 정리 하도록 하고, 고속적재 최적화만 생각하다가 간단한걸 놓치게 된거 같다.  

 

 

마지막은 언제나 레퍼넌스 링크

https://www.elastic.co/guide/en/elasticsearch/reference/current/highlighting.html

 

댓글()

Elasticsearch에서의 null

ELK|2023. 8. 19. 00:20
728x90

너무 평범한건 올리지 말자 주의에 의해 (뭐 그렇다고 아예 없는건 아니지만) 갈수록 포스팅이 뜨믄 뜨믄 (바쁘기도 하고) 해지고 있다.

 

간만에 올릴만한게 있어서 올린다. ELK에서 null 처리에 대한 것이다. 

다른 협력사 쪽에서 null은 어떻게 검색 하냐고 문의가 들어와서... 그동안은 null 을 검색한다라는 생각을 크게 안해봐서 잠시 멍때리다가 검색을 해보니 항상 답은 레퍼넌스에 있다.

 

맵핑 선언시 "null_value": "NULL"  해당과 같이 선언을 해주면 쿼리 질의시 "NULL" 로 하면 null이 검색이 된다.

null 자체에 대한 검색 처리가 없어서 해당과 같이 해주는 듯 하다. 다만 필드 타입이 keyword만 가능하다. text로 설정시 에러 배출  해당 참고 해서 사용 하면 된다.  테스트 내용은 아래와 같이 기술

#맵핑 선언
PUT g3g3
{
  "mappings": {
    "properties": {
      "aa": {
        "type":       "keyword",
        "null_value": "NULL" 
      }
    }
  }
}

#가라 데이터 입력
POST g3g3/_doc
{
  "aa": null
}

#검색 질의
GET g3g3/_search
{
  "query": {
    "term": {
      "aa": "NULL" 
    }
  }
}

#결과 출력 가라데이터 3번 입력함
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 0.13353139,
    "hits" : [
      {
        "_index" : "g3g3",
        "_type" : "_doc",
        "_id" : "naMyCYoByJchMRUoxdkC",
        "_score" : 0.13353139,
        "_source" : {
          "aa" : null
        }
      },
      {
        "_index" : "g3g3",
        "_type" : "_doc",
        "_id" : "nqMyCYoByJchMRUo1tlq",
        "_score" : 0.13353139,
        "_source" : {
          "aa" : null
        }
      },
      {
        "_index" : "g3g3",
        "_type" : "_doc",
        "_id" : "n6MyCYoByJchMRUo19lG",
        "_score" : 0.13353139,
        "_source" : {
          "aa" : null
        }
      }
    ]
  }
}

 

언제나 그렇듯 레퍼넌스 링크

들어가 보면 알겠지만 위의 테스트랑 크게 다르지 않다. 

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/null-value.html

'ELK' 카테고리의 다른 글

Elasticsearch core 제한  (0) 2024.08.08
Term_vector  (0) 2024.01.23
효율적인 엘라스틱 업데이트는 어떻게 해야 할까?  (0) 2023.06.29
_source field 원본 저장 기능 off  (0) 2023.04.16
Elastic scrollAPI와 search After API 차이  (0) 2023.04.07

댓글()

효율적인 엘라스틱 업데이트는 어떻게 해야 할까?

ELK|2023. 6. 29. 22:09
728x90

예전에 이전 회사에서 일하던 도중 옆자리 직원이 보여준 링크이다.

https://techblog.woowahan.com/2718/

 

검색을 위한 데이터 다루기 | 우아한형제들 기술블로그

{{item.name}} 안녕하세요. 우아한형제들 검색개발팀 정철입니다. 배달의민족 검색시스템에서 검색에 사용되는 데이터를 적재하면서 경험했던 어려움과 해결했던 방법을 공유하고자 합니다. 검색

techblog.woowahan.com

 

효율적인 업데이트 관련 뭐 그런건데, 당시에는 업데이트도 그닥 많이 안하고 벌크로 데이터 넣던 중이라 뭐 그런갑다. 하고 대충 보고 패스 했었는데 자바 API에서만 지원하는 벌크 프로세싱이 있다. 단건 기준 처리 해논거 넣으면 알아서 벌크로 해주는 기능인데 지금 시점 이 기능이 필요할듯 한데 지금은 nodejs를 쓰고 있다.... 따로 만들던거 해야 할거 같은데

 

가깝게 생각해보면 나이파이로 restful로 받으면 자동으로 모이고 일정시간 마다 putelasticsearchhttp돌리면 되니 얼추 비슷하게 구현이 될려나? 하는 생각이 든다.

 

레퍼넌스는 아래에 남겨 둔다.

https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-bulk-processor.html

'ELK' 카테고리의 다른 글

Term_vector  (0) 2024.01.23
Elasticsearch에서의 null  (0) 2023.08.19
_source field 원본 저장 기능 off  (0) 2023.04.16
Elastic scrollAPI와 search After API 차이  (0) 2023.04.07
검색시 최적화된 샤드 갯수  (0) 2023.01.08

댓글()

_source field 원본 저장 기능 off

ELK|2023. 4. 16. 00:46
728x90

회사 업무 중 고객측에서 역색인만 저장 하고 원본은 저장 안했으면 한다는 이야기를 들었다. 

예전에 루신 라이브러리 테스트할때 검색에는 걸리는데 원본은 없이 연관 Document만 띄우는 기능을 테스트 해본적이 있는데 그때는 그런가보다 하고 신경안썻었다 (주 사용용도가 로그 분석이다 보니 굳이 끌일이 없기에)

 

그러다 보니 약간 제대로 못알아들은 것도 있고 엘라스틱에서 적용 여부와 어떻게 동작이 변경 될지 몰라 다시 논의 하기로 하고 끝냈다.

 

루신 기반이니 어찌보면 당연한데 끄는 기능이 있다. _source 에서 지정필드만 오프 하는것(고객이 다르게 설명해서 _source off 인지 인덱싱 false인지 해깔렷다 -_-....)

 

루신으로 생각해보면 store 영역만 저장하는 (역색인 검색키만 저장) 기능이다.

여하간 이렇게 하면 장점은 메모리 부하나 스토리지 절감(원본을 저장 안하니 당연한) 되게 된다.

 

다만 그동안 굳이 끌일이 없었던 터라... 단점을 찾아보고 테스트 해본결과 무시무시한 단점이 존재 한다.

 

아래와 같은 단점이 있다고 한다. 번역기 돌려보면 사실상 왜 끄냐 식이다. ㅎㅎ....

사용자는 종종 결과를 생각하지 않고 _source 필드를 비활성화했다가 후회하는 경우가 많습니다. source 필드를 사용할 수 없는 경우 여러 기능이 지원되지 않습니다:

 

일단 심각한건 업데이트와 리인덱싱이 안된다는 것이다. 리인덱싱이야 사실 원본이 없으니 당연히 안되고 업데이트 역시 안된다고 한다. 

하이라이팅의 경우도 역시 원본이 없으니 당연히 불가능 하고 버전업이나 원본 데이터 기준 집계기능(원본이 없으니뭐...) 사용 불가능 제약이 엄청 나다.

 

버전업 안되는건 정말 치명적인데 거대한 인덱싱을 요하는 경우 버전업시 정신이 아득해질듯 하다.

 

Think before disabling the _source field

Users often disable the _source field without thinking about the consequences, and then live to regret it. If the _source field isn’t available then a number of features are not supported:

  • The update, update_by_query, and reindex APIs.
  • On the fly highlighting.
  • The ability to reindex from one Elasticsearch index to another, either to change mappings or analysis, or to upgrade an index to a new major version.
  • The ability to debug queries or aggregations by viewing the original document used at index time.
  • Potentially in the future, the ability to repair index corruption automatically.

 

여하간 중요한건 업데이트 역시 안된다는 것이다. 엘라스틱의 기본 업데이트 구조를 생각해봤을때 당연하긴 하다.

업데이트 절차를 보면 위와 같다. 말이 업데이트지 실제는 삭제 > 인서트 이다. 이러다 보니 _id가 변경이 발생할텐데 원본색인 데이터가 없다보니 반영이 불가능 하여 검색이 되지 않는다. 

다행히 최종 미팅에서    "어떻게 동작이 변경 될지 몰라 다시 논의 하기"  로 하여 대참사는 막았으나 영업이나 상위 기술쪽에서 다된다고 이미 해논거 같다. 음........

 

간단히 테스트 해본 자료 남겨 둔다.

(정말 간단한 테스트 이므로 복붙이 필요 없을듯 하여 스샷으로 한다.)

 

1. 맵핑 작업을 통해 _source에 저장 하지 않을 필드를 지정한다. (맵핑 타입은 테스트 목적상 생략했으나 text keyword등 타입은 다양하게 설정 가능 하다)

2. 가라 데이터를 넣는다.

3. 검색을 해본다. _source에서 article_content를 꺼놔서 원본은 보이지 않고 해당 document는 잘나오는걸 볼 수 있다. 

역색인(Inverted Index) 에 대충 아래 표처럼 등록되어 있을 것이다. 

Keyword Document ID
sadf SxmAhYcB1G_oFdaOqIHp, TBmBhYcB1G_oFdaO64ES
asdasd SxmAhYcB1G_oFdaOqIHp, TBmBhYcB1G_oFdaO64ES

4. 문서하나를 업데이트 하고 검색을 해보자. test 필드 값을 변경 한뒤 검색을 진행해봤더니 

"_id : TBmBhYcB1G_oFdaO64ES"  가 검색결과에서 없어졌다.

5. 물론 단순 전체 검색을 하면 동일한 아이디로 아래와 같이 보이게 된다. 하지만 역색인에서 해당 아이디는 빠지게 된다. 왜냐 위의 그림을 재탕 해보면 루씬에서 업데이트는 없다 삭제 > 생성(재생성) 이다.  삭제가 발생 했으니 역색인에서 빠지게 될 것이고 다시 재생성 할 때는 _source에 원본 텍스트가 없으니 역색인 테이블에 반영이 안되는 것이다.

역색인 테이블 활용 간단히 설명 하자면

1) 업데이트  발생시 삭제 마킹 시전 forcemerge가 발생하지 않으면 해당 상태로 둔다

Keyword Document ID
sadf SxmAhYcB1G_oFdaOqIHp, TBmBhYcB1G_oFdaO64ES
asdasd SxmAhYcB1G_oFdaOqIHp, TBmBhYcB1G_oFdaO64ES

2) _source 에 없으므로 forcemerge 후 최종적으로 빠지게 될것이다.

Keyword Document ID
sadf SxmAhYcB1G_oFdaOqIHp
asdasd SxmAhYcB1G_oFdaOqIHp

업데이트시에는 그냥 역색인 살려둔 상태로 하면 되지 않냐 라고 할 수 있지만... (나도 그랬음 좋겠다)

루씬의 대전제가 깨지기도 하고 해당 방법으로 하면 가득이나 느린 업데이트가 더 느릴수도 있을거같다.

비정상적(업데이트 도중 에러 등등) 상황이 나왔을때 무결성(immtable)에 문제가 발생 할수도 있어서 해당과 같은 상황이 나오는거 같다.

 

그동안 대에충 알고 있었는데 검증겸 테스트를 통해 명확하게 알아봤다. 언제나 그렇듯 레퍼넌스 링크는 아래에 남겨둔다. 

 

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

댓글()

Elastic scrollAPI와 search After API 차이

ELK|2023. 4. 7. 13:50
728x90

회사에서 일하다가 용도를 해깔려 하는 사람들이 있길래 내가 만든건 아니고 회사 후배가 주로 작성 했다.

기록용으로 남겨둔다.

 

  Scroll API Search After
사용 일정시간 검색 컨텍스트(Scroll ID)를 유지하며 대량의 검색 결과를 처리 이전 페이지의 가장 마지막 문서를 기준으로 다음 페이지의 결과를 처리
장점 -       Scroll ID를 사용하여 대량의 검색 결과를 페이징 처리할 수 있다.
-       Search After 대비 검색시간이 오래 걸려도 문제가 되지 않는다.
-       Scroll ID를 유지하지 않아 메모리 부하가 적다.
-       검색 중 다른 검색을 수행할 수 있다.
단점 -       Scroll ID를 유지하기 때문에 메모리 부하가 생길 수 있다.
-       Scroll ID를 유지하면서 다른 검색을 수행할 수 없다.
-       메모리 오버헤드는 낮지만, 속도가 상대적으로 느리다.
-       정렬 기준을 바꾸거나, 다른 필드를 사용하여 검색하는 것이 어렵다.
쿼리문 POST /my-index/_search?scroll=1m
{
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}
POST /my-index/_search?size=10
{
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "sort": [
        { "date": "desc" },
        "_doc"
    ],
    "search_after":[1463538857,"654323"]
}
결론 대량의 검색 결과를 처리하고, 검색 결과를 즉시 사용하지 않아도 되는 경우에 적합 ( 검색한 데이터 전체를 저장 하는 용도 등등 ) 대량의 검색 결과를 빠르게 페이징 처리하고, 검색 결과를 즉시 사용해야 하는 경우에 적합
레퍼런스 https://www.elastic.co/guide/en/elasticsearch/reference/current/scroll-api.html https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html
비고   ES 공식 문서에서 스크롤API 대비 Search After API사용 권장

댓글()

검색시 최적화된 샤드 갯수

ELK|2023. 1. 8. 22:47
728x90

예정 데이터 쓰기 관점에서 최적화 갯수에 관한 포스팅을 한적이 있다.

 

검색의 경우 이전회사의 주요 이슈도 아니였고 서버 상태 등등 적재 대비 정밀하게 테스트하기가 어려워 패스한적이 있다.

 

https://www.youtube.com/watch?v=xP1QFpxhYi4&t=810s 

 

예전 부터 알던 영상인데 일본 라인쪽 영상으로 보인다.

이 친구의 테스트 수치를 보면 샤드6개 레플1일때 가장 검색이 빠르게 리스폰이 온다 라고 나온다.

적재와 아주 큰 차이는 아닌듯 하다. 

 

상세한건 해당 영상을 보는걸 추천한다.

'ELK' 카테고리의 다른 글

_source field 원본 저장 기능 off  (0) 2023.04.16
Elastic scrollAPI와 search After API 차이  (0) 2023.04.07
스냅샷 공유파일 방식 방법  (0) 2023.01.04
대량의 데이터 Reindex 시 Task 죽는 현상  (0) 2022.12.25
index alias #2  (0) 2022.12.18

댓글()

스냅샷 공유파일 방식 방법

ELK|2023. 1. 4. 22:55
728x90

오늘의 포스팅은 별다른건 없고 스냅샷 명령어 기록용 즉 불친절한 포스팅이다.

shared file 방식 스냅샷 이다. 뭐 사실 다른 타입이라고 해서 크게 다르진 않다. 

 

일단 사전에 NFS나 NAS 마운트 등이 필요 하지만 이런건 패스 하고 스냅샷 하는 명령어 기준으로 작성.

 

Elasticsearch.yml 에서 mount한 영역으로 repo 설정 한다.

아래와 같이 복수 영역 지정이 가능 하다. 단 모든 노드가 동일영역을 정확하게 바라보고 있어야 된다.

마운트가 정상적으로 안되있을시 repo설정시 에러 발생

 

아래와 같이 사전에 설정이 필요 하다.

Path:
  repo:
    - /hanu
    - /mount/hanu

path.repo:
            -/hanu
            -/mount/hanu

참고 해야 될점은 최초 언급한거 처럼 하나의 타겟을 바라보게 노드를 셋팅 해야 한다.

PUT _snapshot/hanurepo
{
  "type": "fs",        #스냅샷 타입 지정의미 fs(shared file), s3, hdfs 등등 존재
  "settings": {
    "location": "/hanu"
  }
}

일단 위와 같이 repo 저장소 지정 커맨드가 필요 하다.

 

PUT /_snapshot/hanurepo”리포네임”/hanuking”스냅샷이름”?wait_for_completion=false
{
  "indices": "index_1,index_2", # 백업할 인덱스 *아스테리크 형태로 인덱스 지정 가능
  "ignore_unavailable": true,     #그대로 진행
  "include_global_state": false, #그대로 진행
  "metadata": {
    "taken_by": “hanu", #아무말 사용
    "taken_because": “hanu sa ju sae yo“#아무말 사용
  }
}

리포 생성이 정상적으로 되면 해당 명령어를 통해 스냅샷을 생성 한다. 인덱스용량이 미미 하다면 기다려도 되나 굳이 그럴필요 없으니 wait_for_completion=false 으로  셋팅 한다.

 

GET /_snapshot/hanurepo/hanuking 결과확인 명령
DELETE /_snapshot/hanurepo/hanuking  스냅샷삭제

 

생성 후 확인은 위와 같이 하면된다.

 

공홈에 있는 내용 이지만 첨부해본다. 버전별 스냅샷 호환표

 

마지막은 언제나 레퍼넌스 doc 링크로 마무리 

약간은 불친절한 포스팅이지만 실제 설명도 다있고 하니 이만

https://www.elastic.co/guide/en/elasticsearch/reference/7.5/snapshots-register-repository.html

'ELK' 카테고리의 다른 글

Elastic scrollAPI와 search After API 차이  (0) 2023.04.07
검색시 최적화된 샤드 갯수  (0) 2023.01.08
대량의 데이터 Reindex 시 Task 죽는 현상  (0) 2022.12.25
index alias #2  (0) 2022.12.18
index alias #1  (0) 2022.12.14

댓글()

대량의 데이터 Reindex 시 Task 죽는 현상

ELK|2022. 12. 25. 22:24
728x90

회사 업무 도중 모싸이트에서 리인덱싱시 중간에 Task가 죽어서 리인덱싱이 제대로 되지 않는 다는 말을 들었다. 

 

서킷브레이크나 기타 고부하떄문에 죽나 했는데 데이터 사이즈나 이전회사 서버 상태 등등을 감안했을때 그럴거 같지 않

(인덱스 용량이 대략 30기가 정도 였는데 이전회사에서 훨씬큰 인덱스 리인덱싱 몇번 했는데 문제가 있었던 적은 없었다)

 

은 느낌이 들어서 주말에 심심해서 한번 내용을 찾아보았다.

 

역시 따로 이유가 있었다 

자세한 내용은 아래 링크에 있는데 모종의 사유로 특정 doc가 리인덱싱에 실패하면 발생 한다고 한다.

중단 사유중이 물론 부하가 심할시 그럴수도 있다고는 하지만 리인덱싱이 불가능한 doc에서 주로 생기는거 같다.

 

https://www.elastic.co/kr/blog/3-best-practices-for-using-and-troubleshooting-the-reindex-api

 

3 best practices for using and troubleshooting the Reindex API

In this blog post you you will learn about the power of Reindex API and how to use those to run it confidently. We will review potential errors and give you best practice tips and tricks.

www.elastic.co

 

에러가 생기는 문서를 만나도 중단하지 않고 넘기고 계속 진행하는 옵션이다. 기타 자세한건 위의 링크에 너무 상세하게 남아있어 자세하게 남길 필요는 없어 보인다. (저 링크 찾기가 힘들어서 기록용으로 포스팅)

상세한 내용은 링크를 참조 하시라.

POST _reindex
{
  "conflicts": "proceed",
  "source": {
    "index": "<source-index-name>"
  },
  "dest": {
    "index": "<dest-index-name>"
  }
}

 

 

'ELK' 카테고리의 다른 글

검색시 최적화된 샤드 갯수  (0) 2023.01.08
스냅샷 공유파일 방식 방법  (0) 2023.01.04
index alias #2  (0) 2022.12.18
index alias #1  (0) 2022.12.14
Elasticsearch 보안 해제 방법  (0) 2022.11.13

댓글()