elevne's Study Note
Elasticsearch 정리! 본문
Elasticsearch는 검색엔진의 시초라고 불리는 루씬 기반의 오픈소스 검색엔진이다. 다양한 서치엔진이 있지만 Elasticsearch가 현재 각종 검색엔진 분야에서 지배적인 위치에 있다고 한다. NoSQL의 일종으로 분류할 수도 있고 MongoDB처럼 대용량 스토리지로 활용이 가능하긴 하지만 DB자체로 쓰기에는 안정성이 떨어진다고 한다.
많은 데이터를 다루는 어플리케이션을 구상 중이라면 Elastic Stack을 쓰는 것을 고려해볼 수 있다. Elastic Stack은 Beats, Logstash, Elasticsearch, Kibana로 이루어진 세트를 뜻한다. 위 도구들을 활용해서 어떠한 소스로부터도 어떠한 형식으로든 데이터를 불러오고 분석, 시각화 등을 준 실시간으로 진행할 수 있다.
Elasticsearch를 어플리케이션에 적용하면 그 구조는 아래의 이미지와 같을 것이다.
웹사이트 검색창에 유저가 검색 요청을 보내면 요청은 서버로 전송이 될 것이고 이것은 바로 DB로 보내지는 것이 아니라 Elasticsearch로 전송이 될 것이다. 그럼 Elasticsearch에서는 연관된 검색 결과를 다시 서버로, 빠른 속도로 전송하게 되고 서버에서는 그 정보를 다시 한 번 가공하여 Client 창에 올릴 수 있게 되는 것이다. 또, Kibana를 사용하여 Elasticsearch 내에 저장된 정보들을 더욱 간편하게, 편리한 인터페이스를 이용하며 다룰 수 있다. 그 뿐만 아니라 데이터 시각화, 삽입 등 매우 다양한 기능을 제공하고 있다.
Elasticsearch를 설치하고 이를 컴퓨터에서 실행하게 되면 Elasticsearch의 Instance를 하나 갖게되는 것이다. 이 Elasticsearch Instance는 Node라고 불린다. 각각의 Node는 각각 다른 아이디와 이름을 갖고 Node는 하나의 Cluster에 속하게 된다. 그래서, 컴퓨터에서 Elasticsearch, 즉 Node를 실행하게 되면 Cluster은 자동적으로 생성이 되고(따로 지정해줄 수도 있음) 그 Cluster 안에 여러 개의 Node를 갖게하는 것도 가능하다. 그리고 이 Node들은 각기 다른 컴퓨터에 분산되어 있는 것이다. 각기 다른 컴퓨터에서 다른 Node들이 실행되고 있는 것이지만 모두 하나의 Cluster에 속하여 하나의 Task를 위해 작동되고 있는 것이다.
정리하자면 Cluster이라는 것은 물리적인 Node Instance들의 모임이라고 볼 수 있는 것이다. Clsuter은 모든 Node 검색과 Indexing 작업을 관장하는 논리적인 개념이다. RDBMS에서는 모든 요청을 서버 하나에서 처리해서 결과를 제공하지만 Elasticsearch의 경우에는 이처럼 다수의 서버로 분산해서 처리하는 것이 가능하기 때문에 대용량 데이터를 빠른 속도로 처리할 수가 있게 되는 것이다.
그럼 Elasticsearch에서는 데이터를 어떻게 보관하는 것인지에 대해 알아보자. 데이터는 전부 Document라는 이름으로 저장이되고 어떠한 데이터는 JSON형식으로, Unique한 ID를 갖게되면 Elasticsearch 내부에 저장이 된다. 그리고 이 Document는 하나의 Index라는 곳에 속하게 된다. RDBMS에 비유해보자면 Index는 하나의 Table이고 Document는 하나의 행이라고 생각하면 될 것이다.
아래의 코드를 통해서 Docker를 통해 손쉽게 Elasticsearch, Kibana를 이용해볼 수 있다.
우선 Docker Pull로 elasticsearch와 kibana를 가져온다. 버전은 7.0.0으로 지정해두었다.
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.0.0
docker pull docker.elastic.co/kibana/kibana:7.0.0
그 후, Elasticsearch와 Kibana가 서로 연동될 수 있도록 network를 등록해주어야한다.
docker network create elastic
여기까지 잘 진행이 되었다면 Elasticsearch와 Kibana를 둘 다 실행시켜주면 되겠다.
docker run -d --network=elastic --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.0.0
docker run -d --network=elastic --name kibana -p 5601:5601 docker.elastic.co/kibana/kibana:7.0.0
위 방식으로 간단하게 Docker로 Elasticsearch와 Kibana를 가져와 사용할 수 있다.
아래에 Kibana Console에서 간단하게 Elasticsearch CRUD 실습을 해볼 수 있는 Query들을 정리해두었다.
Create
<Index 생성명령>
PUT Index명
<Document 생성명령: POST>
POST Index명/_doc
{
"field": "value"
}
<Document 생성명령: PUT(1)>
PUT Index명/_doc/DocumentId지정
{
"field": "value"
}
<Document 생성명령: PUT(2)> => _create는 기존과 겹치는 ID의 Document는 생성하지 않도록 함
PUT Index명/_create/DocumentId지정
{
"field": "value"
}
READ
<Document ID로 Read>
GET Index명/_doc/DocumentId
UPDATE
<Document ID로 Update>
POST Index명/_update/documentId
{
"doc": {
"field1": "value",
"field2": "value",
...
}
}
DELETE
<Document ID로 Delete>
DELETE Index명/_doc/DocumentId
위 쿼리들을 Kibana Console에서 입력하며 curl을 사용하는 것보다는 훨씬 간편하게 CRUD를 진행할 수 있지만 실제 웹 애플리케이션에서 쿼리들을 직접 찍어내는 것은 힘들 것이다. 다음 글에서는 Java, Spring 프레임워크에서 Elasticsearch를 이용하는 법에 대해 알아볼 예정이다.
'ETC > Elasticsearch' 카테고리의 다른 글
Logstash 활용 (0) | 2022.12.23 |
---|---|
Elasticsearch on Java Spring (2) (0) | 2022.10.27 |
Elasticsearch on Java Spring + (Search Queries...) (0) | 2022.10.26 |