[Elasticsearch] Elasticsearch Engineer Training -2

  • 본 포스트는 상명대학교 Elasticsearch 엔지니어 트레이닝 과정을 이수하고 작성한 글입니다.
  • 개인이 간단하게 실습을 위해 작성한 포스트이며 Enterprise 급 운용을 위한 글이 아님을 밝힙니다.

복습

  • Elasticsearch는 텍스트, 숫자, 위치 기반 정보, 정형 및 비정형 데이터 등 모든 유형의 데이터를 위한 무료 검색 및 분석 엔진으로 분산형 및 개방형을 특징으로 한다.
  • Elasticsearch는 Apache Lucnene을 기반으로 구축 되었으며 2010년에 현 Elastic으로 출시되었다.

Elasticsearch의 사용

  • 애플리케이션 검색
  • 웹사이트 검색
  • 엔터프라이즈 검색
  • 로깅과 로그 분석
  • 인프라 메트릭과 컨테이너 모니터링
  • 애플리케이션 성능 모니터링
  • 위치 기반 정보 데이터 분석 및 시각화
  • 보안 분석
  • 비즈니스 분석

Elasticsearch의 동작

  • 로그, 시스템 메트릭, 웹 애플리케이션 등의 소스로부터 원시 데이터가 Elasticsearch로 들어간다.
    • 이러한 데이터 수집은 원시 데이터가 Elasticsearch에서 indexing되기 전에 구문 분석, 정규화, 강화 되는 프로세스이다.
    • indexing 후 데이터에 대해 사용자는 복잡한 쿼리를 실행하고 집계를 사용하여 복잡한 요약을 검색할 수 있다.
    • Kibana에서 데이터를 강력하게 시각화하고 대시보드 공유, Elastic Stack을 관리할 수 있다.
  • Kibana는 elasticsearch의 클라이언트 역할을 한다.

Kibana의 사용

  • Kibana는 Elasticsearch를 위한 시각화 및 관리 도구
  • 실시간 히스토그램, 선 그래프, 파이 차트, 지도 등을 제공
  • 사용자가 자신의 데이터를 기반으로 사용자 정의한 동적 인포그래픽을 만들 수 있다. (Canvas)
  • 위치 기반 정보 데이터 시각화 (Elastic Maps)

Elasticsearch의 index 개념

  • Elasticsearch index는 서로 관련된 문서들의 모음이다.
  • JSON 문서로 데이터를 저장
  • 각 문서는 일련의 키와 그에 해당하는 값을 서로 연결
  • Elasticsearch가 문서 저장, 역 인덱스를 구축하여 거의 실시간으로 문서를 검색할 수 있게 한다.

Day02_ Logstash, Beats 실습

환경 세팅

  • elasticsearch.yml 편집

  • network.host : [_site_, _local_] 로 수정

  • vim 에디터로 아래 파일을 열어 가장 아랫줄에 두 line 핸들링 (root 권한 필요)

    1
    2
    3
    4
    sudo vi /etc/sysctl.conf

    vm.max_map_count=262164
    vm.swappiness=1
    1
    2
    3
    4
    sudo vi /etc/security/limits.conf

    [user_id] soft memlock unlimited
    [user_id] hardmemlock unlimited
  • 콘솔 상에 명령어 실행

    1
    sudo shutdown -r now
  • 터미널 전부 종료

  • elasticsearch 및 Kibana 재 실행

  • 가공데이터가 저장된 웹서버 접속해놓기 (Ted님 개인 웹서버)
  • elasticsearch에 암호가 걸려있을 때 IP, ID, Password를 통해 접속하는 명령

    1
    curl -XGET http://외부IP:포트번호 -u elastic:비밀번호

Logstash 설치

1
2
curl -L -O https://artifacts.elastic.co/dow
nloads/logstash/logstash-7.11.1-linux-x86_64.tar.gz

Beats 소개

Elastic에서 제공하는 Beat 솔루션들

  • FileBeat
  • PacketBeat
  • WinlogBeat
  • MetricBeat
  • HeartBeat
  • AuditBeat
  • FunctionBeat
  • JournalBeat

FileBeat 설치

1
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.11.1-linux-x86_64.tar.gz

Logstash, FileBeat 압축해제

1
2
tar -xzvf logstash-7.11.1-linux-x86_64.tar.gz
tar -xzvf filebeat-7.11.1-linux-x86_64.tar.gz

다운로드 받았던 설치파일 관리

1
mv *.gz ./stack

디렉토리 이름 변경

1
2
mv logstash-7.11.1/ ls-711
mv filebeat-7.11.1-linux-x86_64/ fb-711

Logstash의 특징

  • logstash는 3가지 섹터로 이루어지는데, 이것을 통틀어 Pipeline 이라고 한다.

  • 입력 및 출력은 별도의 필터를 사용하지 않고도 파이프라인에 들어가거나 나올 때 데이터를 인코딩하거나 디코딩 할 수 있는 코덱을 지원한다.

    • Input 섹션에서 데이터를 받아들인다.

      • 데이터를 받아들여 이벤트를 생성
      • stdin : 표준 입력
      • file(DB, csv)
      • beats : beats에서 보낸 이벤트 처리
      • etc
    • Filter 섹션에서 데이터 연산

      • 입력 섹션에서 들어온 이벤트를 수정

      • EOF가 될 때까지 데이터를 읽음

      • 중간에 프로세스가 종료될 수 있기 때문에 offset으로 읽었던 지점 저장

      • 읽어들이는 event들은 각각 6개의 파티션으로 구분됨

        • 각 파티션은 commma seperated되어 구분됨
        • JSON 파일 형태로 객체화하여 elasticsearch로 던져준다.
          • JSON 파일도 용도에 따라 자료구조가 다르다 (검색 용도, 분석 용도)
      • 필터 플러그인

        • mutate : 이벤트 필드에 대한 일반적인 변화 수행
    • Output 섹션으로 출력

      • 정제된 이벤트 데이터가 들어가는 섹션
      • 출력 타겟은 multi로 들어갈 수 있음
      • 이벤트 데이터들을 표준 출력(stdout)과 elasticsearch 등으로 보내기가 가능
  • 사용자 IP의 송신, 수신 데이터를 받아들일 수 있는 모듈 파일

Logstash 파이프라인으로 이벤트를 받아 ES에 출력

표준 입력으로 데이터 받기 실습

  1. Logstash 폴더 안에 사용자 정의 파이프라인 configuration을 담기위해 만들고 싶은 디렉토리를 만든다.

    1
    mkdir 디렉토리 명
  2. 사용자 정의 파이프라인 configuration 파일을 만들어 vim 에디터로 아래 코드 작성을 한다.

    1
    vi 파일명.conf

  • 아직 Filter 섹션은 정의하지 않은 상태

    • 필터 섹션은 선택 사항이다.
  • input, output 방식 설정 후 host의 elasticsearch로 데이터 전송하고자 함

    • 입력은 콘솔에 입력하는 표준입력 방식을 사용
  • 다 작성했다면 logstash 폴더로 이동

  • 파이프라인 동작

    1
    ./bin/logstash -f ./디렉토리명/파일명.conf
    1
    >>> 콘솔에 직접 메시지 입력
    1
    2
    3
    4
    5
    6
    {
    "message" => "입력한 내용",
    "host" => "Host 이름",
    "@timestamp" => 2021-02-23T02:52:04.037Z,
    "@version" => "1"
    }

결과

  • 위와 같은 형태 (JSON) 형태로 입력한 메시지가 conf파일의 output(hosts, user, password)정보를 가진 elasticsearch에 전송된 것을 볼 수 있었던 실습이었음.

File 형태로 이벤트 데이터 파이프라이닝 실습

  1. Ted님의 웹서버에서 blogs.csv 파일을 vm에 다운로드 받았다.
  • cat으로 csv 파일을 까본 결과…
  • 어마어마한 문서 양으로 도중에 멈췄다.
  • 그런데 중간에 세미콜론으로 의미가 구분되어 있는 것이 보인다.

  1. 아까 만든 디렉토리에 또다른 conf 파일을 생성하여 이번엔 새로운 파이프라인을 구축한다.

    1
    vi 파일명.conf
  2. 코드 작성

    • 오타가 나지 않도록 주의하자

  1. 코드 분석

    • input 섹션

      • file : file로 받겠다는 의미. csv 파일
      • path : 파일을 읽어올 경로
      • start_position : Logstash를 시작 할 때 file의 어디서부터 읽을 것인지 결정하는 설정.
        • start_positon 값이 beginning인 경우 재 시작하더라도 파일의 처음부터 읽겠다고 명시
      • since_db_path
        • logstash에서 최초 실행 이후 재실행 시, 마지막으로 읽은 파일위치를 since_db에 저장된 offset부터 읽기 시작한다.
        • 따라서 since_db_path는 파일을 마지막으로 읽은 위치를 가져오기 위한 경로를 설정하는 것인데, 위 start_position의 값을 beginning으로 해놓았기 때문에 의미가 없다고 봐야한다. (읽을 때마다 처음부터 다시 읽기 때문에)
        • 그래서 값인 /dev/null은 경로 없음이나 다름없다고 생각해도 된다.
          • 테스트 환경인 경우 since_db 경로 때문에 테스트가 번거롭다고 한다.
    • filter 섹션

      • dissect 필터 : 추출할 필드의 시퀀스와 필드 사이의 구분 문자 지정

        • 이벤트 데이터 전체에 반영된 공통 구조를 그대로 이용하여 원하는 부분을 잘라내는 기능을 한다.
        • mapping
          • message : 이벤트 데이터를 세미콜론 구분자로 형식을 설정하고 나눈 데이터의 이름을 지정한다.
      • date 필터 : 날짜를 구문 분석 후 해당 날짜 또는 타임 스탬프를 이벤트의 logstash 타임 스탬프로 사용하는데 사용

      • 이벤트 데이터의 날짜는 elasticsearch가 이해하도록 변환하는 작업을 거쳐야 한다. 그렇지 않으면 String Type으로 인식하여 날짜 관련 visulization을 진행하지 못할 수 있다.

        • match : value type은 array.
          • dissect 필터에서 가공된 date field를 다음과 같은 format으로 변환
        • target : match에 지정된 형식으로 target된 필드에 타임 스탬프 저장
        • remove_field : date 필터 기능이 수행되면 이벤트 데이터에서 해당 필드를 제거
      • mutate 필터 : 이벤트 데이터에서 필드의 이름에 대한 연산 수행 (수정, 삭제)

        • remove_field : mutate 필터링이 성공했을 때 해당 필드를 제거
    • 필터링 되기 전 필드들은 지워지지 않고 미러링되어 디스크에 쌓이게 된다.

      • 사용하고자 하는 필드가 없다면 꼭 remove_field로 바뀌기 전 필드들을 삭제하라
    • output 섹션

      • stdout : 표준출력, 콘솔에 출력 시 json 형태로 출력한다.
      • elasticsearch : 사용자의 elasticsearch에 이벤트 데이터 출력
        • index : elasticsearch에 전송되어 쿼리될 인덱스 이름 지정
        • host, user, password : elasticsearch의 주소와 암호
  2. 파이프라인 실행

    1
    ./bin/logstash -f ./디렉토리명/파일명.conf
  3. 전송 결과 확인

  • elasticsearch client로 접속

  • Menu -> Management - Dev Tools

    1
    GET blogs/_search
  • 해당 메소드로 쿼리하여 json 포맷 결과 확인

Elasticsearch REST Query

  • 위 blogs.csv 파이프라이닝 실습과 이어짐

  • Console에 아래 명령 입력

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    GET _cat/indices?v&s=index:desc //인덱스 정보 출력


    //method [index_name]/_QUERY 형태
    GET [index_name]/_count

    //좀 더 정확한 검색
    GET [index_name]/_search
    {
    "query": { //항상 query 속성이 먼저 오게 됨.
    "match": {
    "seo_title": "logstash"
    }
    }
    }

  • 인덱스 이름이 blog인 데이터 중에서 seo_titlelogstash가 있거나 released라는 단어가 있는 데이터를 찾는 쿼리 (기본적으로 OR Condition)

  • hits를 봤을 때 총 113건의 데이터가 나온 것을 볼 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
GET blogs/_search
{
"_source": "title",
"size": 100,
"query": {
"match": {
"seo_title": {
"query": "elasticsearch released",
"operator": "and"
}
}
}
}
  • seo_title 필드에 elsasticsearch와 released 단어가 모두 있으며, size가 100인 title을 조회하라

Filebeat 실습

  • filebeat의 module 폴더를 확인하면, 여러 product들의 log format을 볼 수 있다.
    • 아직 잘 모르겠지만 프로덕트마다 로그 포맷이 달라 엄청난 기능이라고 하셨다.
  • 간단하게 Filebeat에 enable만 하면 사용할 수 있게 되어 있음.

1. 샘플 데이터 다운로드 및 환경 설정

  • 따로 설정한 filebeat.yml 파일, 로그 데이터 압축 파일을 Ted님의 웹서버에서 받아 로컬 환경에 맞게 세팅

    • 홈디렉토리에 sample-data 폴더 생성

      • 다운받은 로그 샘플 데이터 압축 해제

      • …server1, server2, server3 폴더들
      • 많은 양의 로그 파일들을 볼 수 있다

    • filebeat.inputspaths : 로그 샘플 데이터가 있는 디렉토리 경로 설정

    • output.elasticsearch : 로그를 뿌려줄 elasticsearch 호스트와 암호 설정

      • 여기서 index 형태도 설정할 수 있다.

2. Filebeat Test Command

filebeat configuration 구성에 이상이 없는지 테스트

1
./filebeat test config

현재 설정을 사용하여 filebeat가 출력에 연결할 수 있는지 테스트

1
./filebeat test output

3. 업로드

1
./filebeat -e 

4. Cilent에서 로그 집계 확인

  • Menu -> Management - Dev Tools

  • Console 명령 입력

    1
    GET logs_server*/_count

  • 총 1752476건의 로그 집계 확인

Author

MoonDoni

Posted on

2021-02-23

Updated on

2021-02-24

Licensed under

댓글