본문 바로가기

윈도우 개발환경

엘라스틱서치(ELK)로 만드는 모니터링 시스템; 1. Elasticsearch, Kibana

엘라스틱서치(ELK)로 만드는 모니터링 시스템

1. Elasticsearch, Kibana

2. Meticbeat - 시스템관리

3. Filebeat - App Log수집

4. Logstash - 통합, 운영

 

0. 엘라스틱서치 (Elasticsearch)

구글이 검색엔진을 발표한 이듬해인 1999년에 Lucene이 최초로 공개되었고, 2001년에 검색엔진을 Java로 재개발된 후, 2005년에 아파치 프로젝트에 합류하게 된다. 하지만, 구글이 큰 성공을 거둔 것과 달리 Lucene 검색엔진은 인기를 끌지 못했다. 생각해 보면, 검색에 대한 개발 요구사항을 맞추기 위해 어려운 Lucene을 설치하고 개발에 적용하기보다, 간단하게 RDB의 비정형 검색기능을 사용하는 방식을 더 선호했기 때문에, Lucene 검색엔진이 인기가 없었던 것 같다.

 

Lucene은 성공하지 못했지만, Lucene검색엔진을 기반으로 만든 Solr은 실시간 인덱싱과 분산처리가 가능한 standalone 검색엔진으로 영미권에서 인기를 얻었고, 웹 검색보다 기업에서 필요로 하는 로그검색, 분석, 시스템 모니터링 부분에 초점을 둔 엘라스틱서치(Elasticsearch)는 이보다 더 큰 성공을 거두었다. Elasticsearch는 한 때 AWS와의 사용료 문제로 인해 오픈 소스 부분을 유료 전환했다가, 다시 2024년 8월부터 오픈 소스의 많은 부분을 무료로 사용할 수 있게 되돌려 놓았다.

 

기업에서 많이 사용하는 Splunk는 빠르고 고성능인 인덱스 엔진이지만 유료로만 사용할 수 있는 고가의 프로그램이고, 인기 많은 Datadog도 적지 않은 돈을 지급해야 하는 구독형 유료 서비스이기 때문에, 직접 설치하면 무료로 사용할 수 있는 ELK는 스타트업에서 사용하기 좋은 매력적인 로그 모니터링 검색엔진일 것이다.

 

그래서, 개발용으로 사용하는 컴퓨터에 ELK (Elastic stack; Elasticseatch, Logstash, Kibana)을 설치한 다음 시스템 모니터링과 로그 모니터링에 적용해 보기로 했다.

1. Docker에서 Elasticsearch와 Kibana실행

ELK 각각의 기능에 대한 이해를 위해 먼저 하나씩 설치해 본 다음, 한 번에 설치할 수 있는 Compose로 사용해 보기로 했다. 설치는 공식 문서를 참고해서 진행했다.

 

Documentation

Elastic documentation

www.elastic.co

a. Docker network 생성

Elasticsearch, Logstash, Kibana가 컨테이너의 name을 사용해서 서로 쉽게 연결될 수 있도록 Docker network을 만든다.

 

docker create network -d bridge elk-net

 

bridge가 기본 네트워크 드라이버이기 때문에 "-d bridge"를 생략해도 상관없다.

b. Elasticsearch 실행

Elasticsearch 현재 버전은 8.15 이지만, 8 버전은 보안 인증을 강화해서 설치하고 테스트할 때 추가적인 인증 절차가 필요하기 때문에 운영환경에서는 좋겠지만, 개발용으로 쓰려면 인증 절차나 정보가 필요 없는 7.17 버전이 더 편리하다.

 

  • 먼저 Docker image를 받는다.

pull로 받지 않고 바로 run해도 Docker image가 없으면 자동으로 내 컴퓨터에 내려 받기 때문에 run을 바로 실행해도 된다.

 

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.23

 

  • Elasticsearch 컨테이너를 만들고 실행한다.

Docker로 엘라스틱서치(Elasticsearch)를 실행하려면 몇 가지 고려해야 할 부분이 있다.

  1. -m옵션: 컨테이너의 메모리를 제한하기 위해 사용하는데, 엘라스틱서치가 돌아가는 java메모리를 이 옵션으로 제한할 수 있다. 일반적으로 4G 정도를 사용하는 것이 보통이다.
  2. -p옵션: 9200번 포트는 Elasticsearch에 접속하기 위해서는 9200 포트를 외부에 열어야 한다. HTTP를 사용하여 데이터를 넣고, 조회하는 모든 기능이 9200번 포트를 통해 일어난다. 9300번 포트는 클러스터 내부의 정보교환을 위해 필요하기 때문에 docker외부와 클러스터를 묶지 않으면 필요가 없다.
  3. -v옵션: Elasticsearch에서 저장하는 DB데이터를 외부에 저장하면, 컨테이너가 종료되어도 데이터는 사라지지 않기 때문에 새로운 컨테이너로 다시 시작하면 데이터를 복구할 수 있다.
  4. discovery.type: Elasticsearch 노드(서버, 컨테이너)의 수가 하나인 경우, 새로 추가되는 노드를 discovery 할 필요가 없으므로, seed_hosts도 없고 "discovery.type=single-node"만 설정한다.
  5. 프로그램처럼 실행하고 log를 console로 보고 싶으면 -it 옵션을, daemon으로 실행하려면 -d 옵션을 사용한다.

내가 만들 Elasticsearch는 노드가 1개이고, 테스트용으로만 사용할 예정이어서 메모리도 1G만 할당하기로 했다.

 

docker run --name elasticsearch --net elk-net -p 9200:9200 -it -m 1GB -v /home/docker/elkdata:/usr/share/elasticsearch/data -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.23

 

실행이 정상적이면 curl로 접속해서 다음과 같은 정보를 얻을 수 있다.

 

c. Kibana 실행

Elasticsearch만 사용할 경우 모든 데이터베이스 처리를 직접 HTTP(S) 요청으로 해야 하므로, 이미 개발된 애플리케이션이 아니면 MySQL Workbench와 같은 편리한 데이터베이스 관리 환경이 더 유용하다. Elastic Stack (ELK) 에서는 Kibana가 MySQL Workbench와 비슷한 기능을 제공한다.

 

  • Docker image를 내려받는다.

ELK를 사용할 때는 동일한 버전의 프로그램을 사용하는 것이 것이 좋다. Elasticsearch를 실행한 후 curl로 확인하면 "minimum_XXXX_compatibility_version"이라는 항목을 볼 수 있는데, 버전이 달라야 할 경우 해당 버전까지 호환이 된다는 의미이다. 실제 이전 회사에서 5.xx버전의 데이터를 6.xx버전의 Elasticsearch에 복사해서 성공적으로 마이그레이션 한 적이 있다.

 

docker pull docker.elastic.co/kibana/kibana:7.17.23

 

  • Kibana 컨테이너를 만들고 실행한다.

Docker로 Kibana를 실행하려면 몇 가지 고려해야 할 부분이 있다.

  1. -p옵션: 5601 포트 번호로 대시보드 웹에 접근하기 때문에 5601 포트를 연다.
  2. --net옵션: 같은 Docker network을 사용하도록 -net 옵션으로 지정하면 앞에서 만든 Elasticsearch를 찾을 수 있다.
  3. -e옵션: 기본 설정파일을 보면 Elasticsearch서버에 http://elasticsearch:9200로 연결하도록 되어 있다. 이 이름으로 서버를 연결할 수 없다고 생각되면 "ELASTICSEARCH_HOSTS=http://... "를 추가한다.

이제, 필요한 옵션만 넣어서 아래 명령으로 실행했다.

 

docker run --name kibana --net elk-net -p 5601:5601 -it docker.elastic.co/kibana/kibana:7.17.23

 

정상적으로 실행되었다면, 브라우저에서 "localhost:5601" 혹은 "<Docker가 설치된 서버의 IP>:5601"로 접속하면 다음과 같은 Kibana 화면을 확인할 수 있다.

 

  • Sample데이터를 이용하면, 실 데이터 없이도 Elasticsearch의 기능을 살펴볼 수 있다.

처음 설치하면 메뉴를 찾지 않아도 아래와 같이 나오는데, 만일 나오지 않는다면, 왼쪽 메뉴 아래쪽 "Management" 섹션으로 가서 "Integration"을 선택하고, 왼쪽에 나열된 메뉴항목에서 "Sample Data"를 선택하고, 오른쪽에 나열된 항목(현재 1개만 있음)에서 다시 "Sample Data"를 선택하면 아래와 같은 화면이 나온다. 관심 있는 데이터를 "Add Data"로 로딩하고 "Dashboard", "Canvas", "Map"을 선택하면 Kibana의 기능을 체험하는 화면을 볼 수 있다.

 

Elasticsearch와 Kibana 기능을 체험했으면, Management > Integration > Sample Data에서 로딩한 데이터를 "Remove"로 지우고, Beats와 Logstash를 사용해서 실제 데이터를 모니터링해 보는 단계로 넘어간다.