프로젝트에서 검색엔진으로 ElasticSearch, 로그 수집을 위한 ELK를 도입하기로 하였다.
EC2 ubuntu 서버에 ElasticSearch와 이를 시각화 하여 보여주는 Kibana, 로그를 수집, 가공, 전송하는 Logstash를 Docker 컨테이너로 띄우는 방법을 알아보자.
1. 우분투 시스템 패키지 설치
$ sudo apt-get update
2. apt 패키지 설치
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
3. GPG 키 인증
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4. 리포지터리 설정
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
(lsb_release -cs) \
stable"
5. 도커 설치
$ sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io
6. 도커 실행
$ sudo systemctl enable docker
$ sudo service docker start
7. 실행 확인
$ service docker status
1. 이미지 pull
$ sudo docker pull docker.elastic.co/elasticsearch/elasticsearch:7.9.1
2. 영구 볼륨 생성
$ sudo docker volume create elasticsearch-volume
3. 컨테이너 실행
$ sudo docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:7.9.1
4. 컨테이너 확인
$ sudo docker ps
설치 완료 후
9200 포트로 접속해보면
다음과 같은 화면이 뜨면 성공이다.
1. 이미지 pull
$ docker pull docker.elastic.co/kibana/kibana:7.9.1
2. 컨테이너 실행
$ docker run -d --link elasticsearch:elasticsearch -p 5601:5601 --name kibana docker.elastic.co/kibana/kibana:7.9.1
3. 컨테이너 확인
$ docker ps
5601 포트로 접속해보면
키바나 화면을 볼 수 있다.
우리는 Elasticsearch를 검색엔진으로도 사용할 것이기 때문에 한글을 형태소 단위로 분석하여 검색을 할 수 있게 지원해주는 Nori tokenizer도 추가로 설치해보자.
형태소 단위로 분석한다는 건 간단하게 말하면 닭볶음탕을 저장할때 닭, 볶음, 탕 으로 형태소 단위로 나누어 저장을 하기 때문에 닭으로 검색해도 닭볶음탕이 조회가 되도록 하는 것이다.
우리는 아무래도 식당을 검색하는데에 사용하기 때문에 이러한 분석기가 필수적이다.
1. elasticsearch bash 진입
$ docker exec -it elasticsearch bash
2. nori 설치
$ cd /bin/elasticsearch-plugin install analysis-nori
3. 적용 및 확인
키바나 에서 analyzer를 인덱스로 추가하고 확인해보면 다음과 같이 형태소가 잘 분석되어있는걸 알 수 있다.
PUT korean_analyzer
{
"settings": {
"analysis": {
"tokenizer": {
"korean_nori_tokenizer":{
"type":"nori_tokenizer",
"decompound_mode":"mixed"
}
},
"analyzer": {
"nori_analyzer":{
"type":"custom",
"tokenizer":"korean_nori_tokenizer",
"filter":["nori_posfilter"]
}
},
"filter": {
"nori_posfilter":{
"type":"nori_part_of_speech",
"stoptags":[
"E","IC","J","MAG","MM","NA","NR","SC","SE","SF","SH","SL","SN","SP","SSC","SSO","SY","UNA","UNKNOWN","VA","VCN","VCP","VSV","VV","VX","XPN","XR","XSA","XSN","XSV"
]
}
}
}
}
}
1. 이미지 pull
$ sudo docker pull docker.elastic.co/logstash/logstash:7.6.2
2. 영구 볼륨 생성
$ sudo docker volume create logstash
3. 컨테이너 실행
$ sudo docker run -p 5000:5000 -d -v logstash:/usr/share/logstash --name logstash docker.elastic.co/logstash/logstash:7.6.2
$ sudo su
$ cd /var/lib/docker/volumes/logstash/_data
config/logstash.yml
## Default Logstash configuration from Logstash base image.
## https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml
#
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
## X-Pack security credentials
#
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: 비밀번호
pipeline/logstash.conf
input {
tcp {
port => 5000
}
}
## Add your filters / logstash plugins configuration here
output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "elastic"
password => "비밀번호"
index => "store_app-%{+YYYY.MM.dd}"
}
}
port 에 docker 컨테이너 매핑 포트랑 동일한 포트를 적어주어야 하고
index 에는 index 이름+ %{+YYYY.MM.dd} 을 적어 로그가 생성된 날짜마다 인덱스가 구분되어 저장된다.