
오랜만에 블로그에 글을 쓰는거같은데 입사한지 7개월 만인거같다.. 회사에서도 ELK를 Poc 하면서 간단하게 APM 모니터링이나 인프라 스트럭쳐등 만 사용하고있는데 이렇게만 사용하기에는 아쉽다는 생각이 들어 따로 ElasticSearch를 공부해서 활용하기위해 공부하려한다.
Elasticsearch는 오픈 소스, 분산형 검색 및 분석 엔진으로, 대량의 데이터를 빠르고 효율적으로 검색, 분석 및 시각화할 수 있게 해준다. Elasticsearch는 주로 텍스트 검색, 로그 분석, 실시간 분석 등 다양한 용도로 널리 사용된다. 아래에 Elasticsearch의 주요 특징과 기능을 자세히 설명하겠다.
주요 특징
- 분산형 구조: Elasticsearch는 자연스럽게 분산되어 있어, 데이터를 여러 노드에 걸쳐 저장하고 인덱싱할 수 있다. 이는 데이터 복제와 고가용성을 보장한다.
- 실시간 처리: 거의 실시간(RT)에 가까운 검색과 분석 기능을 제공합니다. 데이터가 인덱싱되면 거의 즉시 검색이 가능하다.
- 유연한 데이터 인덱싱: JSON 형식의 문서를 인덱싱하며, 스키마가 없는 구조로 유연하게 다양한 형식의 데이터를 처리할 수 있다.
- 강력한 검색 기능: 전문(full-text) 검색 기능을 포함하여, 복잡한 쿼리, 집계 기능, 다양한 검색 기능을 제공한다.
- 확장성: 클러스터에 노드를 추가하거나 제거함으로써 쉽게 확장할 수 있다.
주요 용도
- 텍스트 검색 응용 프로그램: 웹사이트, 애플리케이션 등의 내부 검색 엔진으로 사용된다.
- 로그와 이벤트 데이터 분석: 로그스태시(Logstash), 키바나(Kibana)와 함께 ELK 스택의 일부로 널리 사용되어 로그 데이터를 수집, 분석, 시각화한다.
- 실시간 분석: 거의 실시간의 데이터 분석과 집계를 통해 비즈니스 인텔리전스와 같은 분석 작업에 사용된다.
- 대규모 데이터 세트 처리: 대규모 데이터 세트에 대한 검색, 정렬 및 필터링을 신속하게 처리한다.
아키텍처 구성 요소
- 노드와 클러스터: Elasticsearch는 클러스터로 구성되며, 클러스터는 하나 이상의 노드(서버)로 구성되며. 각 노드는 클러스터의 일부이며, 데이터를 저장하고 클러스터의 인덱싱 및 검색 기능을 처리한다.
- 인덱스: 데이터는 '인덱스'라는 구조에 저장됩니다. 인덱스는 유사한 특성을 가진 문서들의 모음이다.
- 문서: Elasticsearch에서 데이터는 '문서'라는 형태로 저장됩니다. 각 문서는 JSON 형식으로 표현된 개별 데이터 항목이다.(doc)
- 샤드와 복제: 데이터는 샤드라고 하는 분할된 단위로 분산 저장된다. 각 인덱스는 여러 샤드로 나눌 수 있으며, 이 샤드들은 클러스터 내의 여러 노드에 분산된다. 또한 데이터의 안정성을 위해 샤드는 복제될 수 있다.
CRUD
ES는 RESTful 원칙을 따르는 API를 제공한다. 이는 HTTP 메소드를 사용해서 리소스에 접근하고 관리할 수 있다.
필자는 터미널에서 진행하지는 않고 키바나의 Dev Tools 에서 콘솔을 통해 쿼리들을 날려보겠다.
test라는 이름의 인덱스에 year doc를 만드는 json 포멧이다

PUT /test
{
"mappings": {
"properties": {
"year": {
"type": "date"
}
}
}
}
test 인덱스의 year에 타입은 date를 지정해서 만들었다면 값을 넣어 보겠다
참고로 _doc 뒤에 _doc/3124324이런식으로 도큐먼트 넘버를 넣을 수있는데 직접 넣는것보다 ES에서 알아서 관리하게 하는게 좋다


POST /test/_doc
{
"genre": ["IMAX", "Sci-Fi"],
"title": "Interstellar",
"year": 2014
}
데이터를 넣었으니 조회 해보겠다. 위에서 데이터를 넣게되면 무작위로 id 값을 만들고 반환하게되는데 해당 id로 조회하면

GET /test/_doc/{id}
위의 응답으로는 아래와 같다

벌크로 데이터 넣기
벌크는 따로따로 수행하는 것보다 속도가 빠르기 때문에 대량의 데이터를 입력할때는 _bulk를 사용해야 오버해드를 줄일 수 있다
작업 종류:
- index: 새 문서를 추가하거나, 기존 문서를 대체한다.
- create: 새 문서만 추가하고. 문서가 이미 존재하면 오류를 반환한다.
- update: 기존 문서를 부분적으로 업데이트한다.
- delete: 문서를 삭제한다.
여기서는 데이터를 새로만들어서 넣을거라 create문으로 실행해서 데이터를 넣어준다

PUT /_bulk
{ "create" : { "_index" : "test", "_id" : "135569" } }
{ "id": "135569", "title" : "Star Trek Beyond", "year":2016 , "genre":["Action", "Adventure", "Sci-Fi"] }
{ "create" : { "_index" : "test", "_id" : "122886" } }
{ "id": "122886", "title" : "Star Wars: Episode VII - The Force Awakens", "year":2015 , "genre":["Action", "Adventure", "Fantasy", "Sci-Fi", "IMAX"] }
{ "create" : { "_index" : "test", "_id" : "109487" } }
{ "id": "109487", "title" : "Interstellar", "year":2014 , "genre":["Sci-Fi", "IMAX"] }
{ "create" : { "_index" : "test", "_id" : "58559" } }
{ "id": "58559", "title" : "Dark Knight, The", "year":2008 , "genre":["Action", "Crime", "Drama", "IMAX"] }
{ "create" : { "_index" : "test", "_id" : "1924" } }
{ "id": "1924", "title" : "Plan 9 from Outer Space", "year":1959 , "genre":["Horror", "Sci-Fi"] }
데이터 업데이트
기본적으로 ES doc는 불변이기 때문에 이미 작성된 문서는 실제로 변경할 수 없다 하지만 ES에서는 문서를 업데이트하기 위해
증가한 _version 번호로 문서의 새 doc을 작성한다. 중요한건 doc의 고유 id와 버전을 함께 사용한다. 그렇기 때문에 지정된 doc에 여러 버전을 가질 수 있으며 따라서 ES 업데이트 요청을 하면 완전히 새로운 doc가 생성되고 새doc는 증가한 버전 번호로 작성되며 이전 문서는 삭제로 표시된다. ES는 나중에 필요할때마다 정리작업을 수행하며 예전 버전은 사라지게된다
위에서 벌크로 넣었던 데이터 중에 id값이 125569인 doc를 수정해보겠다
먼저 해당 값을 조회 해보면 _version 값이 1인걸 확인 할 수있다


year을 2016에서 2019로 수정하기위해 아래와 같은 포멧이 필요하다.
아마 이상함을 느꼇을건데 아래의 방법으로 year값만 수정하기위해서 다른 doc 내용을 다 입력해줘야한다

POST test/_doc/135569
{
"title": "Star Trek Beyond",
"year": 2019,
"genre": ["Action", "Adventure", "Sci-Fi"]
}
수정하게되면 _version의 값이 2로 변경된걸 확인 할수 있다

위에서 수정할려면 전체 doc를 알아야하는 번거로움이 있는데 _update를 사용하면 특정 doc의 필드만 수정할 수 있다
인덱스/_update/도큐먼트id 로 doc 내용의 year만 수정이 가능하다

또 수정하면 _version은 3으로 증가

변경되었는지 확인하면
의도한대로 year만 2024로 변경된걸 확인 할 수 있다

데이터 삭제
데이터를 삭제하기전에 어떤 doc를 삭제할지 알아야하는데 검색쿼리로 Interstellar 영화의 doc id를 찾아서 삭제해보겠다
인덱스/_search?q={검색어} q쿼리를 사용하면 해당 인덱스에 Interstellar가 존재하는 doc를 찾는다

조회하면 아래와같다 우리가 원하는건 _id만 확인하면된다

찾은 id를 갖고 삭재하라면 HTTP 메소드 DELETE를 사용하고 인덱스/_doc/도큐먼트id로 삭제하면된다

삭제하면 result에 deleted를 확인 할 수 있다

'DevOps > ElasticSearch' 카테고리의 다른 글
[ElasticSearch] ElasticSearch Query DSL 검색 (0) | 2024.01.10 |
---|