티스토리 뷰

ELK Stack이란?

ElasticSearch를 처음 알게 된 건 7~8년 전쯤 세미나에서 알게 되었습니다.

검색엔진 정도로만 알고 당시에는 자료를 찾기 어려워 깊이 있게 알지 못하였었는데요.

지금부터 자세히 알아가 보도록 하겠습니다.


ELK Stack은 Elasticsearch, Logstash, Kibana의 세 가지 프로젝트로 구성된 Stack을 의미하는 약어입니다.

사용자에게 모든 시스템과 애플리케이션에서 로그를 집계하고 이를 분석하며 애플리케이션과 인프라 모니터링 시각화를 생성하고, 빠르게 문제를 해결하며 보안 분석할 수 있는 능력을 제공합니다.

Elasticsearch는 Apache Lucene에 구축되어 배포된 검색 및 분석 엔진입니다. 

고성능에 다양한 언어를 지원하고 스키마가 없는 JSON 문서로 Elasticsearch는 다양한 로그 분석과 검색 사용 사례에 최고의 선택이 되었습니다.

Logstash는 다양한 소스로부터 데이터를 수집하고 전환하여 원하는 대상에 전송할 수 있도록 하는 오픈 소스 데이터 수집 도구입니다. 사전 구축된 필터와 200개가 넘는 플러그인에 대한 지원으로 Logstash는 사용자가 데이터 원본이나 유형에 관계없이 데이터를 쉽게 수집할 수 있도록 도와줍니다.


Kibana는 로그 및 이벤트 검토에 사용하는 데이터 시각화 및 탐색 도구입니다. Kibana는 사용하기 쉽고 대화형 차트와 사전 구축된 집계 및 필터, 지리 공간적 지원을 제공하고 이를 사용해 Elasticsearch에 저장된 데이터를 시각화할 때 원하는 선택을 할 수 있습니다.

인프라와 서버 로그, 애플리케이션 로그, 클릭스트림 프로세스를 모니터링하기 위해 로그 관리와 분석 솔루션이 필요합니다. ELK Stack은 개발자와 DevOps 엔지니어가 오류 진단, 애플리케이션 성능, 인프라 모니터링으로부터 적은 비용으로 단순하면서도 강력한 로그 분석 솔루션을 제공합니다.

 

Beats란?

Beats는 단일 목적의 데이터 수집기 무료 오픈 소스 플랫폼입니다. 수백수천 개의 장비와 시스템으로부터 Logstash나 Elasticsearch에 데이터를 전송합니다.

 

Beats 종류

  • Filebeat : 파일 로그
  • Metricbeat : 메트릭
  • Packetbeat : 네트워크 데이터
  • Winlogbeat : Windows 이벤트 로그
  • Auditbeat : 감사 데이터
  • Heartbeat : 가동 시간 모니터링
  • Functionbeat : 서버를 사용하지 않는 수집기

 

ElasticSearch 특징
  1. 분산 / 확장 / 병렬 처리
    Elasticsearch 구성 시 보통 3개 이상 홀수의 노드를 클러스터로 구성하며, 데이터를 샤드(shard)로 저장 시 클러스터 내 다른 호스트에 복사본(replica)을 저장해 놓기 때문에 하나의 노드가 죽거나 샤드가 깨져도 복제되어 있는 다른 샤드를 활용하기 때문에 데이터의 안정성을 보장합니다. 
    또한 데이터의 분산과 병렬 처리가 되므로 실시간 검색 및 분석을 할 수 있고, 노드를 수평적으로 늘릴 수 있게 설계되어 있기 때문에 더 많은 용량이 필요한 경우 노드를 클러스터에 추가할 수 있습니다. 
  2. 고가용성
    Elasticsearch는 동작중에 죽은 노드를 감지하고 삭제하며 사용자의 데이터를 안전하고 접근 가능하도록 유지하기 때문에, 동작중에 일부 노드에 문제가 생기더라도 문제없이 서비스를 제공합니다.

  3. 멀티 테넌시
    클러스터는 여러 개의 인덱스들을 저장하고 관리하며, 하나의 쿼리나 그룹 쿼리로 여러 인덱스의 데이터를 검색할 수 있습니다. 

  4. 문서(Document) 중심 & 스키마(Schema) 없음
    복잡한 현실 세계의 요소들을 구조화된 JSON 문서 형식으로 저장합니다.
    모든 필드는 기본적으로 인덱싱 되며, 모든 인덱스들은 단일 쿼리로 빠르게 검색 및 활용할 수 있습니다. 
    또한 RDBMS와 같은 스키마 개념이 없으며, 사용자의 데이터가 어떻게 인덱싱 될 것인지를 사용자가 커스터마이징 할 수 있습니다. 

  5. 플러그인 형태로 구현
    검색엔진을 직접 수행하지 않고, 필요한 기능에 대한 플러그인을 적용하여 기능을 확장할 수 있습니다.
    예를 들어 외부에서 제공하는 형태소 분석기나 REST API를 구현하여 적용할 수 있습니다.

 

Elasticsearch 논리적 구조
  1. 도큐먼트(Document)
    Elasticsearch 데이터 최소 단위(RDBMS의 Row?)로 하나의 JSON 오브젝트입니다.
    하나의 Document는 다양한 필드로 구성되어 있으며, 이 필드에는 데이터 필드에 해당하는 데이터 타입이 들어갑니다.

  2. 타입(Type)
    여러 개의 Document가 모여서 한 개의 Type(RDBMS의 Table?)을 이루게 됩니다.
    하지만 Elasticsearch 6.0부터 Type이 완전히 사라졌습니다. (_doc으로 고정)

  3. 필드(Field)
    Document에 들어가는 데이터 타입으로 RDBMS의 열(Column)과 비슷 하지만 Elasticsearch의 필드는 RDBMS보다 동적입니다. RDBMS에서는 하나의 열(Column)이 하나의 데이터 타입만 가질 수 있지만, Elasticsearch에서는 하나의 필드(Field)가 여러 개의 데이터 타입을 가질 수 있습니다. (권장하지는 않습니다.)

  4. 매핑(Mapping)
    매핑(Mapping)은 필드와 필드의 속성을 정의하고 색인 방법을 정의하며, 매핑 정보에 여러 가지 데이터 타입 지정이 가능하지만 필드명 자체는 중복이 불가능합니다.

  5. 인덱스(Index)
    여러 개의 Type이 모여 한 개의 Index가(RDBMS의 Database?) 되며, Elasticsearch 6.0부터는 하나의 Index는 하나의 Type만 가질 수 있습니다.
    Elasticsearch는 멀티 테넌시가 가능하므로 Index명에 "*"를 붙여 한 번의 조회로 여러 개의 Index검색이 가능합니다. 클러스터로 구성한 경우 Index는 여러 노드에 분산 저장/관리됩니다.
    기본 설정으로 5개의 프라이머리 샤드(Prmiary Shard)와 1개의 레플리카 샤드(Replica Shard)를 생성합니다.

 

Elasticsearch 물리적 구조
  1. 노드(Node)
    노드(Node)는 Elasticsearch 클러스터에 포함된 단일 서버로서 데이터를 저장하고 클러스터의 색인화 및 검색 기능에 참여합니다. 노드는 클러스터처럼 이름으로 식별되며, 원한다면 특정 노드 이름으로 정의할 수 있으며 관리의 목적에 맞게 정의할 수 있습니다. 
    ElasticSearch 확장이 필요할 때 노드를 추가시켜 확장시킬 수 있습니다. 
    Elasticsearch는 기본적으로 싱글 노드에서 모든 역할을 수행할 수 있게 설정이 가능하지만 운영환경에서는 대부분 다수의 노드를 클러스터링 해서 구성하기 때문에 각각의 목적에 맞는 노드를 적절히 설정해 운영하는 것이 좋습니다.
     
        ● 마스터 노드(Master Node)
           클러스터를 관리하는 노드로서 노드 추가/제거, 인덱스 생성/삭제 등 클러스터의 전반적 관리 담당합니다.
    여러 개의 마스터 노드를 설정하면 하나의 마스터 노드로 작동됩니다.
        ● 데이터 노드(Data Node)
           데이터(Document)가 저장되는 노드로서 데이터가 분산 저장되는 물리적인 공간인 샤드가 배치되는 노드입니다. 색인/검색/통계 등 데이터 작업 수행하게 됩니다.
        ● 코디네이팅 노드(Coordinating Node)
           사용자의 요청을 받고 라운드 로빈(Round Robin) 방식으로 분산시켜주는 노드로서 클러스터에 관련된 것은 마스터 노드로 넘기고 데이터 관련된 것은 데이터 노드로 넘겨줍니다.
        ● 인제스트 노드(Ingest Node)
           문서 전처리 작업 수행을 하며, 인덱스 생성 전 문서의 형식 변경을 다양하게 할 수 있습니다.
     
  2. 샤드(Shard)
    ElasticSearch는 인덱스를 조각내서 "샤드 (shard)"라는 조각난 데이터로 만듭니다.
    인덱스를 여러 샤드로 나누어 저장하기 때문에 콘텐츠 볼륨의 수평 분할/확장이 가능하며, 작업을 여러 샤드에서 수행하기 때문에(병렬화) 성능/처리량을 늘릴 수 있습니다. 
    샤드는 프라이머리 샤드(Primary Shard)와 레플리카 샤드(Replica Shard)로 구분됩니다. 
     
        ● 프라이머리 샤드(Primary Shard)
           데이터의 원본으로 ElasticSearch에서 요청을 하게 되면 프라이머리 샤드에 요청을 하게 되고 해당 내용은 레플리카에 복제됩니다.
        ● 레플리카 샤드(Replica Shard)
           프라이머리 샤드의 복제본으로 기존 원본 데이터가 무너졌을 때 복제본으로 장애 극복 역할을 수행합니다. 원본인 프라이머리 샤드와 다른 노드에 배정됩니다. 
     
  3. 세그먼트(Segment)
        ● ElasticSearch에서 문서의 빠른 검색을 위해 설계된 자료구조
        ● 각 샤드(Shard)는 다수의 세그먼트(Segment)로 구성
        ● ElasticSearch에서 데이터(Document)를 저장하면, ElasticSearch는 메모리에 모아 두고 새로운 세그먼트
            (Segment)를 디스크에 기록하여 검색을 리프레쉬(refresh)

    샤드에서 검색 시, 각 세그먼트를 검색하여 결과를 조합한 후 최종 결과를 해당 샤드의 결과로 리턴하게 됩니다.
    세그먼트는 불변의 성질을 가지고 있기 때문에 데이터가 업데이트되면 실제로는 삭제되었다고 마크만 하고 새로운 데이터를 가리킵니다.
    삭제되었다고 마크된 데이터는 디스크에 남아있다가 백그라운드에서 주기적으로 또는 특정 임계치를 넘기면 데이터들을 정리하고 새로운 세그먼트로 병합한 후 세그먼트를 삭제하며 이때 비로소 디스크에서 완전히 삭제되는데 이를 세그먼트 병합(Segment Merge)라고 합니다.
    세그먼트 병합 시에는 새로운 세그먼트를 만들 공간이 있어야 하기 때문에 디스크가 꽉 찬 상태에서는 수행할 수 없으며, 세그먼트 병합은 시스템 자원을 많이 쓰는 부담스러운 작업이므로 시스템 자원이 여유로울 때 시스템에 영향을 주지 않는 선에서 진행해야 합니다. 

 

참고

https://twofootdog.tistory.com/53

 

Elasticsearch 개념 및 구조

이번 글에서는 그동안 사용해왔던 Elasticsearch의 개념 및 구조에 대한 정리를 해보고자 한다. 1. Elasticsearch 개념 1-1. 소개 Elasticsearch란 아파치 루씬(Lucene) 기반의 오픈소스 실시간 분산 검색 엔진으

twofootdog.tistory.com

 

댓글
최근에 올라온 글
TAG
more
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31