ELK Stack install

2023. 1. 20. 02:36Public Cloud/오픈 소스

ELK Stack

1. 개요

·         Elasticsearch    로그 저장 및 검색

·         Logstash           로그 수집 엔진

·         Kibana               로그 시각화 및 관리

Elasticsearch, Logstash, Kibana 세 가지 기술이 합쳐진 로그 수집 기술입니다.

FIlebeat는 본연이 가지고 있는 로그를 그대로 읽어서 뒷단에 보내주는 역할만 합니다. 로그를 파싱을 한다던지, 어그리게이션하는 역할은 logstash에서 담당합니다. Elasticsearch에서 해당 인덱스를 인덱싱하고 저장합니다. 그 이후에 키바나를 통해 클라이언트에게 시각화를 제공합니다.

2. Elastic Search

es master node split brain 현상을 엘라스틱서치 2번 노드에서 r_shard2 p_shard2로 승격하고, 엘라스틱서치 1번 노드에 r_shard2가 생긴다.

이제 이런 동작들을 전부 컨트롤하는 것이 마스터 노드인 것이고, 데이터 노드들은 단순히 이런 데이터들을 저장하는 역할을 한다.방지하기 위해 홀수로 구성합니다. Master node Data node의 역할은 다음과 같습니다. Master Node는 단순히 클러스터에 대한 정보를 저장하게 되고, Data Node의 역할은 Data를 저장하는 역할만 수행합니다.

Master Node

·         index metadata

·         shard location

·         cluster status

Data Node

·         store index data

2-1. Elastic Search가 데이터를 저장하는 방식

Elasticsearch 에서는 단일 데이터 단위는 Document, Document 들을 모아놓은 집합을 index, 실제로 index(=indices)를 통해 데이터를 저장하는 행위를 indexing이라고 명칭합니다. 인덱스는 기본적으로 Shard라는 단위로 분리되고 각 노드에 분산되어 저장됩니다. 인덱스를 설정할 때 별도의 설정을 하지 않으면, 7.0 버전부터는 디폴트로 1개의 샤드로 인덱스가 구성되며, 6.x 이하 버전에서는 5개의 샤드로 구성됩니다. 샤드의 개수는 조정할 수 있습니다.

1.   그림과 같이 복제본 샤드와 원본 샤드를 통해 각 노드에 분산저장합니다. 원본 샤드와 복제본은 동일한 데이터를 담고 있으며 반드시 서로 다른 노드에 저장이 됩니다.

2. 프라이머리 샤드가 유실된다면, 다른 노드에 있던 복제본 샤드가 프라이머리 샤드로 승격하게 되고, 다른 노드에 샤드가 추가적으로 생성합니다.

데이터를 저장하는 일련의 과정들을 전부 컨트롤 하는 것이 마스터 노드의 역할이고, 데이터 노드들은 단순히 이런 데이터들을 저장하는 역할을 수행합니다.

3. Kibana

·         es의 색인된 데이터를 검색하고 시각화 해주는 툴 (discover, dashboard, canvas, lens)

·         KQL (Kibana Query Language)

·         X-pack 기능을 활용해서 es cluster monitoring

4. Beat

·         Data shipper (정보를 단순 Elasticsearch에 쏴주는 역할)

·         기존의 ELK에서 Logstash가 담당했던 역할 분리 (다수의 타켓 서버가 생겼을 때, 그 서버의 데이터를 모두 가져오고 어그리게이션 및 파싱까지 한다면 Logstash가 하는 일이 너무 많아짐.)

4-1. Beat Products

Auditbeat

리눅스의 Audit Message들을 ES에 전달한다.

Filebeat

파일에 있는 정보를 긁어서 ES에 전달한다.

Metricbeat

ES Cluster에 관련된 내용을 수집해서 ES에 전달한다.

Packetbeat

네트워크 패킷을 읽어서 ES에 전달한다.

Heartbeat

TCP Level / HTTP Level 에서 어플리케이션의 상태체크에 관련된 내용을 ES에 전달한다.

Winlogbeat

윈도우와 관련된 로그를 전달한다.

Functionbeat

Serverless 형태로 DataShipping 역할을 수행한다.

5. Logstash

·         데이터 input → filter(변환) → output pipeline 구축을 해주는 데이터 수집 엔진

 

elasticsearch (docker-compose.yml)

version: '3.8'
services:
# master-node의 Docker 서비스입니다.
  esm01:
  # 7버전과 6버전은 옵션이 다른부분이 상당 수 있습니다.
    image: docker.elastic.co/elasticsearch/elasticsearch:7.16.2
    # container_name은 elasticsearch로 쓰는게 편합니다. Kibana에서 기본적으로 호출하는 ES Host 주소가 http://elsaticsearch:9200 이기 때문입니다.
    # 저는 kibana에서도 설정을 바꿀 것이기 때문에 esm01으로 설정하겠습니다.
    container_name: esm01
    ports:
    # kibana에서 본 노드를 호출하기 때문에 외부 9200 포트는 master-node에 연결해줍니다.
      - "9200:9200"
    volumes:
      - data01:/usr/share/elasticsearch/data
    ulimits: # 프로세스의 자원 한도를 설정합니다. ES는 많은 파일디스크립터와 핸들러를 사용하기 때문에 제한 해제가 필요하다.
      memlock: 
        soft: -1 # 새로운 프로그램을 생성하면 기본으로 적용되는 한도 
        hard: -1 # 소프트한도에서 최대로 늘릴 수 있는 한도
        # 예를들어 apache와 같이 웹 서비스를 운영 시 동접자가 많은 경우, 구동되는 apache 프로세스 수와 해당 프로세스가 처리하게 되는 파일 수 또한 증가하게 된다.
    environment:
      ES_SETTING_BOOTSTRAP_MEMORY__LOCK: "true"
      ES_JAVA_OPTS: "-Xmx512m -Xms512m -Xlog:disable" ## Xms : 최소 힙 크기 , Xmx 최대 힙 크기 Xlog:disable : 모든 이전 로깅 구성 끄기
      node.name: esm01
      node.roles: master
      network.host: 0.0.0.0
      ## 127.0.0.1:9200 이렇게 하면 Es를 설치한 PC에서만 호출이 가능하게 되는데, 0.0.0.0 을 주면 모든 네트워크에서 접속이 가능하게 된다.
      ## LISTEN을 잡아보면 다음과 같이 뜨는 것을 알 수 있다. :::9200
      cluster.name: es-cluster
      cluster.initial_master_nodes: esm01
      discovery.seed_hosts: esm01,esd01,esd02 # 클러스터에 속한 호스트들을 기재합니다.
      xpack.security.enabled: "false" # 클러스터를 보호하려면 클러스터의 모든 노드에 X-pack을 설치해야 합니다. 클러스터와 통신하려면 사용자 이름 및 비밀번호를 지정해야 합니다.
      xpack.monitoring.collection.enabled: "false" # 엘라스틱 서치 7.16에서 더 이상 사용하지 않기를 추천합니다. 모니터링 데이터를 수집하고 모니터링 클러스터로 전달하는 데
      # 사용되는 방식은 Metricbeat입니다. 
  esd01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.16.2
    container_name: esd01
    volumes:
      - data02:/usr/share/elasticsearch/data
    ulimits:
      memlock:
        soft: -1
        hard: -1
    environment:
      ES_SETTING_BOOTSTRAP_MEMORY__LOCK: "true"
      ES_JAVA_OPTS: "-Xmx512m -Xms512m -Xlog:disable"
      node.name: esd01
      node.roles: data,ingest
      cluster.name: es-cluster
      cluster.initial_master_nodes: esm01
      discovery.seed_hosts: esm01,esd01,esd02
      xpack.security.enabled: "false"
      xpack.monitoring.collection.enabled: "false"
  esd02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.16.2
    container_name: esd02
    volumes:
      - data03:/usr/share/elasticsearch/data
    ulimits:
      memlock:
        soft: -1
        hard: -1
    environment:
      ES_SETTING_BOOTSTRAP_MEMORY__LOCK: "true"
      ES_JAVA_OPTS: "-Xmx512m -Xms512m -Xlog:disable"
      node.name: esd02
      node.roles: data,ingest
      cluster.name: es-cluster
      cluster.initial_master_nodes: esm01
      discovery.seed_hosts: esm01,esd01,esd02
      xpack.security.enabled: "false"
      xpack.monitoring.collection.enabled: "false"
  metricbeat:
    image: docker.elastic.co/beats/metricbeat:7.16.2
    container_name: metricbeat
    environment:
      ELASTICSEARCH_HOSTS: http://esm01:9200
    volumes:
      - ./config/metricbeat.yml:/usr/share/metricbeat/metricbeat.yml

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks: 
  default:
    external: ## 외부에서 생성된 네트워크 이기 때문에 Docker Compose 애플리케이션을 내릴 때 해당 네트워크가 삭제 되지 않습니다.
      name: logging

 

docker-compose 생성하기

docker-compose up -d

 

‘elasticsearch exited with code 78’ log를 출력할 경우 해결법

elasticsearch 에서 max virtual memory 를 최소한 262144 이상 요구하기에 일어나는 문제입니다.

sudo sysctl -w vm.max_map_count=524288

or

sudo vi /etc/sysctl.conf 
vm.max_map_count=524288 ## 해당 명령어 아래줄에 추가

 

'Public Cloud > 오픈 소스' 카테고리의 다른 글

Docker in Docker  (0) 2023.03.10
Webhook Relay - Jenkins Github Webhook  (1) 2023.01.19
Argo Rollout 설치 / 무중단 배포 방식(Rolling, Blue/Green, Canary)  (0) 2023.01.19
istio  (0) 2023.01.19
ArgoCD  (0) 2023.01.19