설날 이후 System Engineer 면접이 있어서 ELK 스택에 대해 공부해보려고 한다.

 

ELK 스택이란 

Elasticsearch, Logstash, Kibana의 세 가지 인기 있는 프로젝트로 구성된 스택을 의미하는 약어이다.

 

실행 환경 : Oracle VM (Ubuntu 20.04)

참고 : https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html

 

Index and search data using Elasticsearch APIs | Elasticsearch Guide [8.17] | Elastic

Deleting an index permanently deletes its documents, shards, and metadata.

www.elastic.co

 

해당 문서의 curl 명령어를 사용하면 Docker에서 Elasticsearch와 Kibana를 빠르게 설정한다.

curl -fsSL https://elastic.co/start-local | sh

 

 

UserName, Password

 

 

ElasticSearch API가 잘 동작하는지 확인해보기 위해 아래와 같은 get 요청을 보내보자

curl -u elastic:PqCJ0W6N http://localhost:9200

# -u : curl 인증에 사용
# elastic:PqCJ0W6N <사용자 이름 : 패스워드>

 

사용자 이름과 비밀번호를 환경변수로 설정하여 API에 요청을 보낼 때 사용해보자

 

export ES_USER="elastic"
export ES_PASS="PqCJ0W6N"

curl -u $ES_USER:$ES_PASS http://localhost:9200

 

 

아래 요청은 PUT 메서드로 books 인덱스를 생성(Create)하는 명령이다.

#<요청>
master@master:~$ curl -u $ES_USER:$ES_PASS -X PUT "http://localhost:9200/books"

 

#<결과>
{
"acknowledged":true,
"shards_acknowledged":true,
"index":"bookss"
}

 

acknowledged : 요청이 성공적으로 처리되었음을 나타냄

shards_acknowledged : Elasticsearch는 데이터를 여러 샤드(shard) 에 분산 저장함. 모든 샤드가 성공적으로 초기화되었음, 인덱스의 샤드가 정상적으로 설정됨

 

생성된 인덱스에 데이터를 추가해보자

 

curl -u $ES_USER:$ES_PASS -X POST "http://localhost:9200/books/_doc" -H "Content-Type: application/json" -d '
{
   "name":"Snow Crash",
   "author":"Neal Stephenson",
   "release_date":"1992-06-01",
   "page_count":470
}'
{
   "_index":"books",				
   "_id":"eVOknZQBfdxMJEeRCzQv",		
   "_version":1,				
   "result":"created",				
   "_shards":{					
      "total":2,				
      "successful":1,			
      "failed":0				
   },
   "_seq_no":0,
   "_primary_term":1
}

 

index:books : 문서(Document)가 추가된 인덱스 이름

_id:eVOknZQBfdxMJEeRCzQv : 문서의 고유 식별자

_version:1 : 문서의 버전

result:created : 인덱싱 작업의 결과

_shards : 인덱싱 작업이 진행된 샤드에 대한 정보, 0은 실패가 없음을 나타냄

_seq_no : 문서의 시퀀스 번호, 문서 변경 이력을 추정하는데 사용, 새로 생성된 경우 0번

_primary_term : 문서가 속한 주 샤드(Primary Shard)의 버전을 나타냄, 샤드는 재배치 가능함

 

shards 항목에서 total은 2개인데 1개만 성공한 이유는 인덱스의 구조가 2개의 샤드로 구성되어 있지만, 문서를 추가하는(POST)요청이 1개의 샤드에만 적용된 상황인 것 같다. Elasticsearch의 샤드 분산 처리 방식에 따른 것 같다.

 

 

_bulk 엔드포인트는 여러 개의 문서를 한 번에 추가, 수정, 삭제할 수 있는 기능이다. 성능을 향상시키고 네트워크 요청의 수를 줄이는데 도움이 된다.

 

아래와 같이 curl 요청을 보내면 여러 개의 문서를 한 번에 등록할 수 있다.

curl -u $ES_USER:$ES_PASS -X POST "http://localhost:9200/_bulk" -H "Content-Type: application/json" -d '
{ "index" : { "_index" : "books" } }
{"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585}
{ "index" : { "_index" : "books" } }
{"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328}
'
#생략

 

{
   "errors":false,
   "took":0,
   "items":[
      {
         "index":{
            "_index":"books",
            "_id":"elO3nZQBfdxMJEeRNzSC",
            "_version":1,
            "result":"created",
            "_shards":{
               "total":2,
               "successful":1,
               "failed":0
            },
            "_seq_no":1,
            "_primary_term":1,
            "status":201
         }
      },
      {
         "index":{
            "_index":"books",
            "_id":"e1O3nZQBfdxMJEeRNzSC",
            "_version":1,
            "result":"created",
            "_shards":{
               "total":2,
               "successful":1,
               "failed":0
            },
            "_seq_no":2,
            "_primary_term":1,
            "status":201
         }
      }
      ,
      , #생략
      ,
   ]
}

 

수정, 삭제, 동적, 정적 매핑에 관련해서는 다음 포스팅으로 작성하자