설날 이후 System Engineer 면접이 있어서 ELK 스택에 대해 공부해보려고 한다.
ELK 스택이란
Elasticsearch, Logstash, Kibana의 세 가지 인기 있는 프로젝트로 구성된 스택을 의미하는 약어이다.
실행 환경 : Oracle VM (Ubuntu 20.04)
참고 : https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
해당 문서의 curl 명령어를 사용하면 Docker에서 Elasticsearch와 Kibana를 빠르게 설정한다.
curl -fsSL https://elastic.co/start-local | sh
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
}
}
,
, #생략
,
]
}
수정, 삭제, 동적, 정적 매핑에 관련해서는 다음 포스팅으로 작성하자