💻 개발 이야기/ELK Stack

[ELK] Elasticsearch, Logstash, Kibana를 설치+실행하고 간단하게 알아보자

Jinseong Hwang 2023. 7. 23. 02:18

 

안녕하세요. 황진성입니다.

 

어쩌다 보니 갓 인싸 개발자 큰돌님과 함께 ELK 스터디를 진행하게 될 기회가 생겼는데,

스터디하면서 알게 된 내용, 실습한 내용, 삽질한 내용을 기록해보려 합니다.

 

ELK란?

https://www.elastic.co/kr/blog/heya-elastic-stack-and-x-pack

Elasticsearch, Logstash, Kibana를 묶어서 ELK 혹은 ELK Stack이라고 부릅니다. 하지만 5 버전부터 Beats가 포함되며 Elastic Stack이라고 불립니다. 하지만 저는 ELK가 조금 더 직관적인 것 같아서 ELK라고 부르는 편입니다.

 

그렇다면 Elasticsearch, Logstash, Kibana, Beats가 뭐하는 서비스인지 궁금해집니다.

(이미 너무 유명하니까) 하나씩 간단히만 알아봅시다.

 

Elasticsearch

Apache Lucene 기반의 Full-text 검색 기능을 강화한 오픈소스 검색 엔진입니다. 혹자는 NoSQL DB라고 표현도 하지만 이도 맞는 말입니다. Elasticsearch는 다양한 기능을 제공하고, Elastic 플랫폼에서 강력한 통합 기능을 제공하기 때문에 단순한 검색 엔진, NoSQL DB라고 부르기엔 아쉬운 느낌이 있습니다. REST API를 이용해 명령할 수 있고, 대량의 데이터를 빠르게 저장, 검색, 분석이 가능하다는 특징이 있습니다. Java로 개발되어 있습니다.

 

Logstash

파이프라인을 생성해서 데이터를 수집(input), 필터링(filter) 후 Elasticsearch로 전송(output)하는 역할을 수행하는 도구입니다. 그 외에도 다양한 기능을 제공하며, 썩 가벼운 서비스는 아닙니다. 동작과 관련해서는 아래에서 함께 살펴볼 Logstash 실행 관련해서 input과 output 설정을 함께 진행해 보면 좋겠습니다. JRuby로 개발되어 있습니다.

 

Kibana

Elasticsearch에 저장된 데이터를 시각화하고 모니터링 해주는 도구입니다. Discover, Visualize, Dashboard 외에도 여러 기능이 있으며, 플러그인을 설치해서 기능을 추가하고 커스텀할 수 있습니다. Node.js 런타임에서 동작하며 Typescript로 개발되어 있습니다.

 

Beats

생성된 데이터 혹은 로그를 Logstash or Elasticsearch로 전송해 주는 가볍고 빠른 로그 수집 도구입니다. 일반적으로 각 인스턴스, 컨테이너 별로 설치해서 사용합니다. Go로 개발되어 있습니다.

 

ELK Stack 아키텍처 예시

https://umbum.dev/1144

 

 

ELK 설치하기 (feat. 버전 이야기)

Elasticsearch, Logstash, Kibana는 각각 다른 솔루션이었습니다. 그래서 각 솔루션마다 버전도 달랐었는데, 2015년 10월 ELK Stack으로 통합하게 되면서 버전을 통일했습니다. 따라서 솔루션을 통합해서 사용할 때 버전만 일치하면 호환성 보장이 되어서 굉장히 편리하게 사용할 수 있도록 개선됐습니다.

 

https://www.elastic.co/kr/downloads/elasticsearch

글을 작성하는 2023년 7월 23일 기준으로 8.8.2 버전이 최신 버전입니다. 마지막 릴리즈 날짜가 2023년 6월 30일이네요.

 

메이저 버전 8이 최신이지만, 저는 7버전을 설치해서 실습할 예정입니다. 그 이유는 다음과 같습니다.

  1. 현재까지 계속 업데이트가 되고 있습니다. 작성일 기준으로 마지막 릴리즈 날짜가 8 버전과 동일한 2023년 6월 30일입니다. 그리고 현재 많이 사용하고 있는 JDK 11 버전을 지원합니다. Support matrix에서 버전별 지원 내용을 확인할 수 있습니다.
  2. 7버전과 8 버전을 비교했을 때 Main feature에는 변화가 없습니다. 여기를 봤을 때는 속도, 보안 측면에서 개선이 되었고 유료 버전에서 사용할 수 있는 고급 기능이 추가된 것 같습니다.
  3. 처음 학습하는 제 관점에서 7 버전 기준으로 작성된 양질의 자료가 많아 보였습니다. 큰 차이가 없다면 7 버전으로 선택하는 것이 학습에 유리할 것 같다는 생각이 들었습니다.

 

구구절절 개인적인 얘기를 떠들어봤는데, 설치해봅시다. 저는 로컬에 설치했습니다.

(참고) 로컬 환경은 MacOS 13.4(Ventura), M2 입니다.

 

Download ELK v7.17.11 | 본인 운영체제에 맞게 선택해서 다운로드 받은 후 압축 해제 해주세요!

 

Elasticsearch 실행하기

다운받은 디렉토리로 이동해서 아래 명령어로 elasticsearch를 실행할 수 있습니다.

$ cd elasticsearch-7-17-11/
$ ./bin/elasticsearch

실행 화면

실행을 하면 굉장히 많은 로그가 찍히는데, 자세히 보면 9200 포트에서 실행되었다는 문구를 볼 수 있습니다.

Elasticsearch의 기본 포트는 9200 입니다.

 

Elasticsearch는 기본적으로 REST API 방식으로 명령 가능합니다. GET 요청을 날려봅시다.

$ curl -X GET "http://localhost:9200"

실행 결과

위 처럼 나오면 성공입니다! (축하합니다!)

루씬 엔진 기반으로 만들어졌다고 하던데, 루씬 버전도 나오는 것을 보니 진짜인가보네요 (의심)

 

ELK의 심장이라고 볼 수 있는 Elasticsearch의 설치와 실행을 마쳤습니다.

 

Kibana 실행하기

다운받은 디렉토리로 이동해서 아래 명령어로 kibana를 실행할 수 있습니다.

$ cd kibana-7-17-11/
$ ./bin/kibana

실행 결과

실행을 하면 굉장히 많은 로그가 찍히는데, 자세히 보면 5601 포트에서 실행되었다는 문구를 볼 수 있습니다.

Kibana의 기본 포트는 5601 입니다.

 

그리고 몇가지 warning이 나오는데, 특정 기능들이 deprecated 됐거나 보안 개선으로 인해 업데이트 or 추가 설치를 권장하는 내용이었습니다. 하지만 저는 운영 환경에서 사용하지 않고 학습용이므로 가볍게 생각하고 진행하겠습니다.

 

브라우저 주소창에 http://localhost:5601 을 입력하고 접속해봅시다. 아래와 같이 예쁜 화면이 나오면 성공! 입니다.

Kibana 홈 화면

 

Kibana에서 제공해주는 일부 기능들을 살펴봅시다. Kibana에는 다양한 기능이 있지만, 왼쪽 햄버거 버튼 > Management > Dev Tools에 들어가면 Elasticsearch에 명령을 직접 날릴 수 있는 Playground스러운 화면이 나옵니다. 이걸 사용해봅시다.

여기서 아래 명령어를 입력해서 Elasticsearch에 추가된 인덱스 목록을 확인할 수 있습니다. (실행은 초록 삼각형)

GET _cat/indices?v

각 인덱스의 상태와 이름 등 여러 정보를 볼 수 있습니다. ?v 를 추가한 이유는 컬럼명도 함께 출력하기 위함입니다.

처음 설정하면 없는 인덱스가 8번 라인에 하나 있는데, 이는 제가 임의로 추가한 인덱스입니다.

 

인덱스 무관하게 모든 값을 보고 싶다면 아래 명령어를 입력해봅시다.

GET _search
{
  "query": {
    "match_all": {}
  }
}

대략 4700줄의 결과가 나오는데, 무슨 의미인지는 아직 하나도 모르겠습니다. 차근차근 알아보도록 합시다.

 

Logstash 실행하기

다운받은 디렉토리로 이동해서 아래 명령어로 logstash를 실행할 수 없습니다.

$ cd logstash-7-17-11/
$ ./bin/logstash

 

저는 아래와 같이 오류가 나며 실행되지 않았습니다.

에러 로그를 읽어보니 config/pipelines.yml 파일을 읽을 수 없어서 발생한 문제라고 합니다.

그래서 저는 pipelines.yml 파일을 주구장창 수정해가며 실행해보려 했지만, 해결할 수 없었습니다. (아직 애송이라...)

 

문제를 해결하기 위해 여러 자료를 찾아보던 중, 실행 시점에 -f 옵션으로 설정 파일을 수동으로 설정하는 방법을 발견했습니다.

저는 config/logstash.conf 파일을 생성했고 아래와 같이 작성했습니다.

input {
  file {
    path => "/Users/hy3d670wn2/elk-stack/test.log"
    start_position => "beginning"
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "first-index-%{+YYYY.MM.dd}"
  }
}

input과 output을 설정해줘야 합니다.

  • 저는 input은 file로부터 읽어오는 방식으로 하고 싶었습니다.
    • path에는 테스트용 로그 파일을 생성하고 그 파일의 절대경로를 작성했습니다.
    • start_position으로 로그를 읽어올 위치를 결정하는데 "beginning" 이라고 작성했습니다. 기본값은 "end"인데, "end"일 경우에는 데이터 유실이 발생할 수 있습니다. 이 부분은 애송이라 이해하기 힘들었습니다... (참고)
  • output은 elasticsearch로 들어가서 저장되길 원했습니다.
    • hosts에 불러온 로그를 전달할 destination을 작성해줍니다. 로컬에 elasticsearch를 띄웠으므로 localhost:9200 이라고 작성했습니다.
    • index는 input log를 어떤 인덱스에 저장할 것인지 작성합니다. index 그룹핑을 하는 방식이 여러 방식이 있는데, 스키마와 무관하게 날짜로 그룹핑 하는 방식을 쓰는 경우 위 예시처럼 작성하는 것이 적절합니다.

 

파일 생성 + 작성이 끝났다면 실행해봅시다.

$ ./bin/logstash -f config/logstash.conf

실행 결과

자, 드디어 ELK 3개 시스템을 모두 실행 완료했습니다.

위에서 만들었던 test.log 파일에 임의의 데이터를 밀어 넣어 봅시다.

 

그리고 나서 해당 인덱스로 전체 검색을 해보겠습니다.

GET first-index-2023.07.22/_search
{
  "query": {
    "match_all": {}
  }
}

결과가 아래와 같이 나옵니다.

#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.17/security-minimal-setup.html to enable security.
{
  "took" : 390,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "first-index-2023.07.22",
        "_type" : "_doc",
        "_id" : "5thsfokB2A8bppE-lPEz",
        "_score" : 1.0,
        "_source" : {
          "@version" : "1",
          "@timestamp" : "2023-07-22T16:26:31.988Z",
          "message" : "test-log-울랄라",
          "host" : "HY3D670WN2ui-MacBookPro.local",
          "path" : "/Users/hy3d670wn2/elk-stack/test.log"
        }
      },
      {
        "_index" : "first-index-2023.07.22",
        "_type" : "_doc",
        "_id" : "59hzfokB2A8bppE-PfFO",
        "_score" : 1.0,
        "_source" : {
          "@version" : "1",
          "@timestamp" : "2023-07-22T16:33:48.741Z",
          "message" : "test-log-울랄라22222",
          "host" : "HY3D670WN2ui-MacBookPro.local",
          "path" : "/Users/hy3d670wn2/elk-stack/test.log"
        }
      }
    ]
  }
}

검색 결과로 2건이 hit되었고, message 필드를 보니 작성한 테스트 로그가 들어간 것을 확인할 수 있습니다.

 

 

맺음말

일단 설치하고 동작하는 거 보고 차근차근 공부하는 게 재밌더라구요. 열심히 공부해서 갓 개발자가 되어봅시다 ^~^

 

언제든 칭찬, 지적 환영합니다.

긴 글 읽어주셔서 감사합니다.

 

 

References