• 탑훈(tophoon)

ELK(Elasticsearch, Logstash, Kibana) Stack 구축기 - Version 7.x.x

ELK Stack을 구축하게 된 이유?

지금까지 우리는 서버(Server)의 로그(Log)를 확인하기 위해서 아래와 같은 절차를 거쳐서 확인해야 했다.

  1. PuTTY와 같은 터미널 에뮬레이터(Terminal emulator)를 이용하여 원격 접속 혹은 서버실로 직접 간다.

  2. Linux 명령어(tail과 같은)를 이용하여 로그파일을 직접 열어서 확인한다.

  3. 1~2번 과정을 서버의 개수 만큼 반복하여 로그를 확인한다.

만약 여러분들이 운영하고 있는 서비스 API 서버를 생각해보자. API 서버가 1대일 경우는 ELK Stack을 구축할 필요가 없다. 왜냐하면 한 번만 위 1~2번 과정을 거쳐서 로그를 확인하면 그만이다.

근데 여러분들의 서비스 규모가 커서 API 서버가 2대 이상일 경우를 생각해보자. 1~2번 과정을 2번 반복하고, 두 개의 독립된 로그파일을 번갈아가며 확인해야 한다. 또, 여러분들의 서비스가 너무 잘되서 API 서버가 10대 이상이라고 생각해보자. 1~2번 과정을 10번 반복하는 것도 힘든데, 실시간으로 10개의 독립된 로그파일을 확인하려면 눈알이 빠질 것이다.


이러한 불편함이 있어, 여러개의 독립된 로그파일을 하나로 합쳐서 실시간으로 로그를 확인 할 수 있는 방법을 찾아봤다. 방법은 여러가지 였으나 보편적으로 사용하는 ELK Stack을 사용하기로 했다. (문제가 발생했을 때, 참고할 자료가 많은 보편적인 것을 사용하는게 좋다고 판단)


ELK(Elasticsearch, Logstash, Kibana)는 무엇인가?


엘라스틱 서치(Elasticsearch)

Elasticsearch는 대규모의 데이터를 손쉽게 저장, 검색, 분석할 수 있게 해준다. (자세한 설명)


로그 스태시(Logstash)

Logstash는 실시간 파이프라인 기능을 가진 오픈소스 데이터 수집 엔진이다. Logstash는 서로 다른 소스의 데이터를 탄력적으로 통합하고 사용자가 선택한 목적지로 데이터를 정규화할 수 있다. 다양한 고급 다운스트림 분석 및 시각화 활용 사례를 위해 모든 데이터를 정리하고 대중화(democratization)한다. (자세한 설명)


키바나(Kibana)

Kibana는 확장형 사용자 인터페이스로서, 데이터를 구체적으로 시각화한다. (자세한 설명)


실생활에 빗대어 설명하면 다음과 같다.

  1. 회식장소를 정하기 위해 설문지를 각 사원들이 작성한 것을 Logstash가 수집한다.

  2. 수집한 설문지 내용을 검색, 분석하기 위해 elasticsearch를 사용한다.

  3. 수집한 설문지 내용을 한 눈에 쉽게 파악할 수 있게 그래프와 같은 방식으로 시각화하기 위해 Kibana를 사용한다.


ELK Stack 서버 구성은 어떻게 가져갈 것인가?

서버 구성은 아래 그림과 같다. API 서버는 1대 이상의 서버로 구성되어 있으며, Logstash 서버 1대, Elasticsearch, Kibana가 같이 설치된 서버 1대로 구성하였다. Logstash, Elasticsearch/Kibana 서버는 각각 4GB의 RAM이 필요했기 때문에 AWS EC2 t2.medium을 사용하였다.

  1. Beats는 서버에서 실시간으로 생성되는 로그파일을 Logstash로 전송하게 된다. 여기서 처음 언급되는 제품 Beats가 있다. Beats는 단일 목적의 데이터 수집기 플랫폼으로 수백 수천 개의 장비와 시스템으로부터 Logstash나 Elasticsearch에 데이터를 전송하는 역할을 한다. 쉽게 설명하면 여러분들의 서버에서 생성된 로그파일을 Logstash에 전송하려면 일련의 프로그래밍을 해야 한다. 그런 수고로움 없이 Beats 제품을 여러분들의 서버에 설치하고 간단한 설정만 하면 Logstash로 쉽게 로그파일을 전송할 수 있게 된다.

  2. 여러 서버의 Beats에서 보낸 로그 데이터를 Logstash가 수집한다. 그런 다음 Elasticsearch에서 쉽게 검색, 분석할 수 있게 데이터를 정규화하고 대중화하여 Elasticsearch로 데이터를 전송하게 된다.

이렇게 구성을 끝마치면 우리는 Kibana에 웹브라우저로 접속하여 GUI 환경에서 손쉽게 로그 데이터를 검색, 분석, 시각화가 가능하게 된다.


ELK Stack 설치하기

이론적인 설명은 이제 마무리하고 실제 여러분들의 운영 서버에 ELK Stack을 설치해보겠다.

앞으로 언급할 설정들은 기본적으로 ELK Stack을 동작하기 위한 설정이니 구체적인 설정들은 따로 심화학습하여 적용하길 바란다.


1. 로그 데이터를 생성하는 각 서버에 Beats 설치하기(참고자료)

$ sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

$ sudo vi /etc/yum.repos.d/elastic.repo

$ sudo yum install -y filebeat

$ sudo systemctl daemon-reload (만약 안되면 $ sudo chkconfig --add filebeat)

$ sudo systemctl enable filebeat.service

$ sudo systemctl start filebeat.service

$ cd /etc/filebeat

$ sudo vi filebeat.yml

$ sudo -i service filebeat stop

$ sudo -i service filebeat start

$ netstat -anpt | grep 5044

(여기서 5044 포트번호는 로그 데이터를 전송할 서버가 Logstash에 연결할 때 사용할 포트번호 예시이다.

똑같은 서버가 여러 대일 경우는 모두 같은 포트번호를 사용하고, 다른 성격의 서버일 경우는 각각 다른 고유한 포트번호를 사용한다.)


2. Beats로 부터 로그 데이터를 수집하는 Logstash 설치하기(참고자료)

인스턴스 유형: t2.medium

AMI: Amazon Linux 2 AMI (HVM), SSD Volume Type


[서버 시간 설정]

$ sudo yum update -y

$ sudo vi /etc/sysconfig/clock

ZONE="Asia/Seoul"

$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

$ date


[Open JDK 11 설치] (참고자료)

$ wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz -O /tmp/openjdk-11.0.2_linux-x64_bin.tar.gz

$ cd /tmp

$ tar -xvzf openjdk-11.0.2_linux-x64_bin.tar.gz

$ sudo mkdir /usr/java

$ sudo mv jdk-11.0.2 /usr/java

$ sudo vi /etc/profile.d/java.sh

$ source /etc/profile.d/java.sh

$ java -version


[Logstash 설치]

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

$ sudo vi /etc/yum.repos.d/logstash.repo

$ sudo yum install -y logstash

$ cd /etc/logstash

$ sudo vi pipelines.yml

$ sudo mkdir linux_conf.d

$ sudo vi /etc/logstash/linux_conf.d/logstash-noname-server.conf

$ sudo su

# cd /etc/logstash/

# vi startup.options

# cd /usr/share/logstash/bin

# ./system-install

# systemctl daemon-reload

# systemctl enable logstash.service

# systemctl start logstash.service

$ netstat -anpt | grep 5044


3. Elasticsearch와 Kibana 서버 한 대에 같이 설치하기 (참고자료1, 참고자료2)

인스턴스 유형: t2.medium

AMI: Amazon Linux 2 AMI (HVM), SSD Volume Type


[서버 시간 설정]

$ sudo yum update -y

$ sudo vi /etc/sysconfig/clock

ZONE="Asia/Seoul"

$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

$ date


[Open JDK 11 설치] (참고자료)

$ wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz -O /tmp/openjdk-11.0.2_linux-x64_bin.tar.gz

$ cd /tmp

$ tar -xvzf openjdk-11.0.2_linux-x64_bin.tar.gz

$ sudo mkdir /usr/java

$ sudo mv jdk-11.0.2 /usr/java

$ sudo vi /etc/profile.d/java.sh

$ source /etc/profile.d/java.sh

$ java -version


[Elasticsearch 설치]

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

$ sudo vi /etc/yum.repos.d/elasticsearch.repo

$ sudo yum install -y elasticsearch

$ sudo su

# cd /etc/elasticsearch

# vi jvm.options

(G1GC Configuration 부분 주석 제거)


# vi elasticsearch.yml

$ sudo systemctl daemon-reload

$ sudo systemctl enable elasticsearch.service

$ sudo systemctl start elasticsearch.service

# netstat -anpt | grep 9200

# netstat -anpt | grep 9300

웹브라우저로 http://여러분의_Elasticsearch_IP주소:9200/_cat/indices?v 접속여부 확인


[Kibana 설치]

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

$ sudo vi /etc/yum.repos.d/kibana.repo

$ sudo yum install -y kibana

$ sudo vi /etc/kibana/kibana.yml

$ sudo systemctl daemon-reload

$ sudo systemctl enable kibana.service

$ sudo systemctl start kibana.service

# netstat -anpt | grep 5601

웹브라우저로 http://여러분의_Elasticsearch_IP주소:5601 접속여부 확인


Indexing한 로그 데이터 삭제하는 방법은?

로그로 인해 Elasticsearch, Logstash 서버 용량이 꽉차는 경우가 생기게 된다.

그럴 때, 아래와 같은 방법으로 해결하면 된다.

  • Elasticsearch

  1. DELETE http://Elasticsearch_IP_주소:9200/_all

  • Logstash

  1. Logstash 서버 콘솔에 접속

  2. `/var/log` 디렉토리의  `messages-` 로 시작하는 파일과 messages 파일 삭제


앞으로 더 해야 할 것은?

  • Kibana를 이용하여 데이터 검색과 시각화를 잘 이용하기 위한 심화학습

  • Elasticsearch 서버에 저장되는 인덱스 파일들을 S3에 저장하도록 변경하는 작업


맺음말

수많은 서버에서 출력되는 로그데이터를 한 눈에 보는 방법이 없을까? 라는 의문점에서 출발해서 보편적으로 사용되는 ELK Stack 구축하는 방법까지 살펴봤다. 이 글을 통해서 많은 서버개발자들이 로그데이터를 분석하는데 많은 도움이 되길 바란다.



탑훈 (Backend Engineering) 오피스 앱 개발하다가 사업하고 싶어서 회사를 나왔다가 좋은 개발자를 양성하고 싶어 강사도 해봤다가 지금은 이전 회사 동기의 추천으로 훌륭한 동료들이 모여있는 W모 스타트업에서 서버개발자로 일하고 있습니다.

(주)웨딩북

주소 서울시 강남구 청담동 36-1

사업자등록번호 220-88-77848

통신판매업신고 제 2014-서울강남-03451호

문의전화 02-6205-4161  ㅣ  팩스 02-6959-9858

icon_facebook.png
icon_instagram.png
icon_youtube.png