728x90
반응형

기존에 사용 중이던 ElasticSearch 서버가 근래에 자주 다운됐었다.

 

그래서 새로운 방식으로 로그를 수집해보려고 했었다.

 

Hadoop에 JSON으로 저장해서 Zeppelin에서 보려고 하니 불편 사항이 많았다.

 

다른 것들이 더 있을까 하고 찾아봤지만 ElasticSearch와 Kibana 만큼 로그를 검색하고 조회하는 도구가 없었다.

 

결국 두 개를 사용하기로 하고 Logstash 만 다른 걸 이용해보려고 하다가 Apache Flume이 생각나서 적용해보려고 했다.

 

구조는 Source -> Channel -> Sink 로 돼있고 설정이 어려워 보이지 않아 시도해보았다.

 

하지만 java.lang.NoClassDefFoundError: org/elasticsearch/common/io/BytesStream

 

에러가 발생하면서 종료됐다.

 

찾아보니 ElasticSearch jar 파일을 별도로 추가해야한다고 해서 추가했는데도 되지 않았다.

 

무엇인가 이상하여 찾아보니 Flume에서 제공하는 라이브러리에서

 

org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder를 임포트하여 사용하는데

 

해당 패키지는 ElasticSearch 6.x 이상에서는 없어진 패키지였다.

 

Flume을 굳이 사용하고자 한다면 sink 를 직접 만들어서 사용해야 해서 Logstash로 선회했다.

 

(물론 fluentd를 사용해도 되지만 다른 곳에서 사용하여 다른 것을 써보고 싶었다)

참고 문헌

  1. https://github.com/apache/flume/blob/trunk/flume-ng-sinks/flume-ng-elasticsearch-sink/src/main/java/org/apache/flume/sink/elasticsearch/ElasticSearchLogStashEventSerializer.java
  2. https://github.com/elastic/elasticsearch/tree/5.6/core/src/main/java/org/elasticsearch/common/xcontent
반응형

'Log' 카테고리의 다른 글

[Log] Logstash k8s로 이전하기  (0) 2023.01.26
[Log] Logstash 메모리 문제  (0) 2022.08.25
[Log] Grafana 이전 하기  (0) 2021.01.28
[Log] Kubernetes에 ElasticSearch 올리기  (0) 2021.01.14
[Log] Logstash 메모리 누수?  (0) 2020.12.03
728x90
반응형

개발용으로 ElasticSearch를 설치할 필요가 있었다.

 

예전에 서버 몇대에 직접 설치를 했었는데 이번에는 kubernets를 활용하여 설치해보았다.

 

helm 버전은 3 으로 진행했으며 처음 해보는 거라 다음과 같이 저장소를 추가하고 설치해보았다.

$ helm repo add elastic https://helm.elastic.co
$ helm install elasticsearch elastic/elasticsearch

위와 같이 하면 기본 구성으로 ElasticSearch가 설치되어 올라간 것을 확인할 수 있었다.

 

하지만 Ingress 연동은 설정으로 추가할 수 없어 해당 저장소를 클론한 다음 elasticsearch/values.yaml 을 수정해야 했다.

# Enabling this will publically expose your Elasticsearch instance.
# Only enable this if you have security enabled on your cluster
ingress:
  enabled: true
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - example.com
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

ingress에 enabled가 false로 돼있는데 이것을 true로 변경하고 hosts에 연결할 도메인 주소를 넣으면 된다.

$ helm install elasticsearch --version version ./elasticsearch/

위와 같이 배포한 뒤 Ingress까지 잘 연동되는 것을 확인할 수 있었다.

 

끝으로 Kibana와 Logstash를 연동할 때 Ingress에 설정한 도메인만 넣으면 기본적으로 9200 포트로 설정된다.

 

하지만 80으로 접속을 해야하기 때문에 http://example.com:80 으로 포트를 명시하여 설정하면 잘 동작한다. 

 

참고 문헌

  1. https://github.com/elastic/helm-charts

반응형

'Log' 카테고리의 다른 글

[Log] Apache Flume  (1) 2022.04.07
[Log] Grafana 이전 하기  (0) 2021.01.28
[Log] Logstash 메모리 누수?  (0) 2020.12.03
[Log] Elastic Search 특정 필드 업데이트  (0) 2020.11.26
[Log] Spark 현재 날짜 조회 및 형변환  (0) 2020.09.10
728x90
반응형

Logstash 부하로 인하여 Elastic Search에 업데이트가 안되고 있었다.

 

그래서 부랴부랴 특정 토픽들을 제외하여 급한 로그들을 처리했다.

 

그런데 일부 로그들을 파싱하는 과정에서 시간 정보를 현재 시간으로 쓰는 경우가 있었다.

 

시간 정보를 따로 갖고는 있었는데 해당 필드로 처리하고 있지 않고 있었다.

 

이것을 해결하기 위한 방법을 찾아보니 _update_by_query 를 사용하면 된다고 하여 시도해보았다.

 

처음엔 인덱스 전부를 업데이트해보았으나 너무 오래 걸렸다.

 

그래서 특정 시간대의 로그만 처리하기로 했고 다음과 같이 데이터를 보내 해결할 수 있었다.

{
  "script": {
    "lang": "painless",
    "source": "ctx._source['@timestamp'] = ctx._source.time"
  },
  "query": {
    "bool": {
        "must": [
            {
                "exists": {
                    "field": "time"
                }
            },
            {
                "range": {
                    "@timestamp": {
                        "time_zone": "+09:00",        
                        "gte": "2020-11-20T21:25:00", 
                        "lte": "2020-11-20T21:30:00"                  
                    }
                }
            }
        ]
    }
  }
}

 

참고 문헌

  1. https://stackoverflow.com/questions/55570214/how-do-i-overwrite-the-timestamp-field-with-another-field-in-elasticsearch

  2. https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html

  3. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html

  4. https://www.elastic.co/guide/en/elasticsearch/reference/current/compound-queries.html

반응형
728x90
반응형

ElasticSearch에서 다음과 같은 로그가 발생했었다.

[WARN ][o.e.d.i.m.MapperService  ] [_default_] mapping is deprecated since it is not useful anymore now that indexes cannot have more than one type

이 로그는 _default_ mapping을 사용해서 발생하는 문제로

 

6.0.0 부터 Deprecated 되어 실제 적용된 매핑 타입으로 적용하면 된다.

 

그러나 "실제 적용된 매핑 타입으로 적용"을 어떻게 해야하는지 찾을 수 없었다.

 

mapping api로 되는지도 해봤지만 전혀 되지 않았고 Kibana 설정으로도 변경을 할 수 없었다.

 

인덱스를 새로 만들어서 복사해보라는 것도 있어 이를 해봤지만 이것 역시 _default_가 생겼다.

 

그러다가 다른 인덱스에서는 발생을 안하는데 logstash 로 시작하는 인덱스에서만 _default_가 있어

 

인덱스 이름에 logstash 를 다른 이름으로 변경하여 저장해보니 _default_가 만들어지지 않았다.

 

정확한 이유는 모르겠지만 logstash로 시작되는 인덱스의 경우에는 _default_가 생성되는 것으로 보여진다.

 

참고 문헌

  1. https://www.elastic.co/guide/en/elasticsearch/reference/6.4/default-mapping.html

 

반응형

'Log' 카테고리의 다른 글

[Log] Spark 현재 날짜 조회 및 형변환  (0) 2020.09.10
[Log] Zeppelin 크론 설정하기  (0) 2020.08.27
[Log] HDFS Web UI Permission denied  (0) 2020.04.02
[Log] librdkafka 빌드하기  (0) 2020.03.26
[Log] Logstash 403 에러 해결  (0) 2020.03.19

+ Recent posts