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
- 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로 포함시키면 됨,,
- 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를 이용해 모니터링 정보를 연속적으로 파악할 수 있음
- config 폴더의 logstash.yml 파일에서 아래와 같이 설정
- 키바나에서 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으로 가벼움)
- 비츠에서 수집한 데이터는 엘라스틱서치로 바로 보내거나 로그 스태시를 거쳐 엘라스틱서치로 보냄. 굳이 데이터 발생량이 많지 않거나 복잡한 가공을 수행할 필요 없으면 로그스태시 안 거쳐도 무방
- 비츠 종류는 매우 다양하며, 엘라스틱서치에서 제공하는 비츠와 사용자가 직접 만든 커스텀 비츠의 설치 방법이 다르다. 다만, 일반적으로 다음과 같이 동작하므로 하나만 알면 크게 어려움이 없을 것이다.
- 비트를 다운로드
- 비트 설정 파일을 수정
- 알라스틱서치와 키바나 대시보드를 사용할 수 있게 설정
- 비트를 시작
- 키바나 대시보드에서 데이터를 확인
파일 비트
- 파일 비트 구성요소
- 입력 : 하베스터에 대한 입력 소스
- 하베스터 : 입력에 명시된 파일을 직접 수집하는 주체. 파일은 하나의 하베스터를 가짐. 하베스터는 파일을 한 줄씩 읽고 내보냄
- 스풀러 : 하베스터가 수집한 이벤트를 외부로 전달
Kibana
인덱스 패턴
- 키바나에서 시각화를 하기 위해서는 반드시 엘라스틱서치 인덱스에 연결되어야만 함
- syslog-*라는 인덱스 패턴은 엘라스틱서치의 syslog-xxx 인덱스들과 연결되어 있음
- 왜 인덱스 패턴? 복수의 인덱스에 대한 매핑을 사전에 병합해두어 쿼리 생성이나 시각화에 활용
'CS' 카테고리의 다른 글
LRU 알고리즘 파헤치기 (0) | 2024.04.25 |
---|---|
HTTPS, SSL를 쉽게 알아보자 (천천히 읽으면 누구나 이해가능한,) (0) | 2022.05.22 |
influxDB란 (0) | 2021.09.05 |
테스트 주도 개발(TDD) 실전 스킬 웨비나 (라이엇 게임즈) (0) | 2021.07.20 |
Machine Learning Basic (0) | 2021.07.15 |