Elasticsearch

  • 엘라스틱서치는 모든 요청과 응답을 REST API 형태로 제공한다.
  • 키바나 콘솔 사용법
    • Management -> Dev Tools
    • 손쉽게 엘라스틱서치와 REST API로 통신할 수 있음
  • 인덱스 : 도큐먼트를 저장하는 논리적 구분자
    • 특정 도큐먼트 개수에 도달하거나 특정 용량을 넘어서면 인덱스를 분리 ex) 날짜/시간 단위로 인덱스를 분리하면 특정 날짜의 데이터를 쉽게 처리
  • 도큐먼트 : 실제 데이터를 저장하는 단위
  • 클러스터 내부 구조
    • 하나의 프로젝트에서 하나의 클러스터를 생성
    • 클러스터 내부는 여러 개의 인덱스를 생성
    • 인덱스 내부에는 JSON 형태로 된 다수의 도큐먼트가 존재
    • 다수의 도큐먼트는 복수의 필드를 가짐

 

실행 확인

8.0.1 버전부터 자동 보안 설정이 되어 있어서 다음과 같이 curl 명령어를 작성하여야 한다.

curl --cacert /Users/squareyun/Documents/utility/elasticsearch-8.1.0/config/certs/http_ca.crt -u "elastic:password" -X GET https://localhost:9200/

 

도큐먼트 생성

PUT index2/_doc/1
{
	"name": "mike",
	"age": 25,
	"gender": "male",
}
  • 데이터 타입을 실수로 매핑해도 자동으로 데이터 형 변환을 진행함
  • 기존에 있던 필드를 사용하지 않고 새로운 필드도 문제없이 인덱싱 됨
  • 도큐먼트 업데이트를 위한 특별한 API가 존재하지 않음
    • 인덱싱 과정에서 같은 도큐먼트 아이디가 존재하면 덮어쓰기가 됨
    • POST index2/_update/1 과 같이 _update라는 엔드포인트를 추가해 특정 필드 값만 업데이트 가능
    • 도큐먼트 수정 작업은 비용이 많이 들기 때문에 권장하지 않음 (삭제도 동일)
  • 벌크 데이터를 이용하면 한 번에 여러 개의 도큐먼트를 인덱싱 할 수 있음
    • 단, JSON 구조가 아닌 NDJSON 구조이니 주의

 

매핑

  • RDB 스키마 : 테이블을 구성하는 구성요소 간의 논리적인 관계와 정의를 의미
  • 스키마와 비슷한 역할을 하는 것이 바로 매핑. JSON 형태의 데이터를 루씬이 이해할 수 있도록 바꿔줌
  • 다이내믹 매핑, 명시적 매핑

 

SQL

  • 엘라스틱서치는 관계형 데이터베이스가 아님
  • SQL 쿼리로 요청하면 내부적으로 엘라스틱서치의 쿼리 DSL 형태로 변환하고 최적화하는 형태로 동작
  • 기본 형태는 다음과 같음
POST _sql?format=txt
{
  "query": """
    select Dest from kibana_sample_data_flights
    where OriginCountry='US'
    order by DistanceMiles
    desc limit 10
  """
}

 

Logstash

기본 실행 코드: 표준 입력으로 전달받은 메시지를 다시 표준 출력으로 표시

bin/logstash -e "input { stdin { } } output { stdout { } }"

 

파이프라인

  • 데이터를 입력받아 실시간으로 변경하고 이를 다른 시스템에 전달하는 핵심 기능
  • 입력, 필터, 출력으로 이루어짐
  • JSON 형태로 데이터를 출력
  • 작업의 이력 관리를 위해 pipelines.yml 또는 파이프라인 설정 파일을 만드는 것이 좋음
  • 기본 템플릿은 다음과 같음
    • 이미 만들어진 플러그인을 검색하여 템플릿에 추가하면 됨
input {
	{ 입력 플러그인 }
}
filter {
	{ 필터 플러그인 }
}
output {
	{ 출력 플러그인 }
}
  • 필터
    • 비정형 데이터를 정형호하고 데이터 분석을 위한 구조를 잡아줌
    • 정형화된 데이터는 엘라스틱서치나 아마존 S3와 같은 곳에 전송되어 분석 용도로 활용
  • dissect와 grok 플러그인은 패턴을 이용해 구문 분석을 한다는 공통점이 있지만 성능 차이 존재
    • dissect : 로그 형식이 일정하고 패턴이 변하지 않을 때 사용. 속도가 빠름
    • grok : 로그 형태가 일정하다고 장담하기 힘들 때 사용. 예외 처리나 패턴이 자유로움

 

삽질 기록

input

입력 플러그인 중 <file>을 이용해 log 파일을 읽으려고 시도하였는데, 파일이 한 줄만 읽어지는 문제

mode 옵션을 “read”로 설정하면 됨

그런데 이렇게 하면 읽고 나서 파일이 삭제되더라

file_completed_action, file_completed_log_path를 설정하여 삭제되지 않도록 하고, 읽은 위치 log를 해당 경로에 저장하면 됨 (단, 해당 파일이 커질 수 있으므로 주의)

sincedb_path에서 “/dev/null”는 파일 읽기 위치를 저장하는 파일(sincedb)을 생성하지 않겠다는 옵션

input {
	file {
		path => "/Users/squareyun/Documents/utility/logstash-8.1.1/config/filter-example.log"
		start_position => "beginning"
		mode => "read"
		file_completed_action => "log"
		file_completed_log_path => "/Users/squareyun/Documents/utility/logstash-8.1.1/config/test.log"
		sincedb_path => "/dev/null"
	}
}

 

output 플러그인 elasticsearch 사용 시 에러

[에러 메시지] PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

  1. logstash 인증서 만들기 (config 폴더에 생성) echo -n | openssl s_client -connect localhost:9200 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./ca_logstash.cer —> 이렇게 굳이 안 해도 됨! elasticsearch-8.1.0/config/certs/http_ca.crt 파일을 cacert로 포함시키면 됨,,
  2. output 플러그인 다음과 같이 적용
output {
	elasticsearch {
		index => "output"
		hosts => ["https://127.0.0.1:9200"]
		user => "elastic"
		password => "password"
		ssl => true
		cacert => "/Users/squareyun/Documents/utility/logstash-8.1.1/config/ca_logstash.cer"
	}
}

 

모니터링 기능 활성화

로그스태시 통계 데이터를 엘라스틱서치에 전송하고, 키바나 GUI를 이용해 모니터링 정보를 연속적으로 파악할 수 있음

  1. config 폴더의 logstash.yml 파일에서 아래와 같이 설정
  2. 키바나에서 Management > Stack Monitoring에서 확인 가능
# X-Pack Monitoring
# https://www.elastic.co/guide/en/logstash/current/monitoring-logstash.html
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: password
#xpack.monitoring.elasticsearch.proxy: ["http://proxy:port"]
xpack.monitoring.elasticsearch.hosts: ["https://localhost:9200"]
# an alternative to hosts + username/password settings is to use cloud_id/cloud_auth
#xpack.monitoring.elasticsearch.cloud_id: monitoring_cluster_id:xxxxxxxxxx
#xpack.monitoring.elasticsearch.cloud_auth: logstash_system:password
# another authentication alternative is to use an Elasticsearch API key
#xpack.monitoring.elasticsearch.api_key: "id:api_key"
xpack.monitoring.elasticsearch.ssl.certificate_authority: "/Users/squareyun/Documents/utility/elasticsearch-8.1.0/config/certs/http_ca.crt"

 

Beats

비츠 설치

  • 비츠는 가벼운 프로그램을 지향하므로 하나의 목적만을 수행 (언어도 Go Lang으로 가벼움)
  • 비츠에서 수집한 데이터는 엘라스틱서치로 바로 보내거나 로그 스태시를 거쳐 엘라스틱서치로 보냄. 굳이 데이터 발생량이 많지 않거나 복잡한 가공을 수행할 필요 없으면 로그스태시 안 거쳐도 무방
  • 비츠 종류는 매우 다양하며, 엘라스틱서치에서 제공하는 비츠와 사용자가 직접 만든 커스텀 비츠의 설치 방법이 다르다. 다만, 일반적으로 다음과 같이 동작하므로 하나만 알면 크게 어려움이 없을 것이다.
    1. 비트를 다운로드
    2. 비트 설정 파일을 수정
    3. 알라스틱서치와 키바나 대시보드를 사용할 수 있게 설정
    4. 비트를 시작
    5. 키바나 대시보드에서 데이터를 확인

 

파일 비트

  • 파일 비트 구성요소
    • 입력 : 하베스터에 대한 입력 소스
    • 하베스터 : 입력에 명시된 파일을 직접 수집하는 주체. 파일은 하나의 하베스터를 가짐. 하베스터는 파일을 한 줄씩 읽고 내보냄
    • 스풀러 : 하베스터가 수집한 이벤트를 외부로 전달

 

Kibana

인덱스 패턴

  • 키바나에서 시각화를 하기 위해서는 반드시 엘라스틱서치 인덱스에 연결되어야만 함
  • syslog-*라는 인덱스 패턴은 엘라스틱서치의 syslog-xxx 인덱스들과 연결되어 있음
  • 왜 인덱스 패턴? 복수의 인덱스에 대한 매핑을 사전에 병합해두어 쿼리 생성이나 시각화에 활용
squareyun