본문으로 바로가기
반응형

기존에 iLM 을 지정해뒀던 것 같은데 어느날 보니 모든 인덱스에 대해 풀려있었고.. 블로그엔 기록해둔 글이 없어서 작성한다.

logstash 설정

먼저 kibana 를 설정하지 않고 logstash 부터 설정한다.

input {
    kafka {
            consumer_threads => 8
            max_poll_records => "5000"
            decorate_events => true
            auto_commit_interval_ms => 1000
            partition_assignment_strategy => "round_robin"
            bootstrap_servers => "{kafka ip 주소}:9091"
            topics => [""dev-test-log", "prod-test-log"]
            group_id => "test"
            client_id => "logstash-prefix-test"
            codec => plain { charset => "UTF-8" }
    }

    # filebeat 설정
    # beats {
    #         port => 5044 (같은 서버 내 동일 포트 지정 불가능 하니 filebeat 2개를 연결할 땐 포트를 다르게 해줘야한다. 5045 같은.. 물론 filebeat 서버에서도 연결 시 해당 포트로 연결해야하며 inbound 포트도 추가로 개방해야한다)
    # }
}

filter {

    date {
        match => ["timestamp", "YYYY-MM-dd HH:mm:ss"]
        timezone => "Asia/Seoul"
        target => "@timestamp"
    }

    mutate {
        remove_field => ['@version', 'timestamp']
    }

    json {
        source => "message"
    }

}

output {
    elasticsearch {
        hosts => ["{es ip 주소}:9200"]
        ilm_enabled => true
        ilm_rollover_alias => "{alias 편하게 ilm policy 이름과 같이 지정해도 상관없다}"
        ilm_policy => "{kibana 에서 생성한 ilm policy 이름}"
    }
}

# 여러개 지정 시 아래 포멧
# output {
#        # kafka
#        if [@metadata][kafka][topic] == "" {}
#        
#        # filebeat
#        if [fields][index_name] == "test-api-log" {
#                elasticsearch {
#                        hosts => ["{es ip 주소}:9200"]
#                        ilm_enabled => true
#                        ilm_rollover_alias => "test-api-log"
#                        ilm_policy => "test"
#                }
#        } else if [fields][index_name] == "test-api-error-log" {
#                elasticsearch {
#                        hosts => ["{es ip 주소}:9200"]
#                        ilm_enabled => true
#                        ilm_rollover_alias => "test-api-error-log"
#                        ilm_policy => "test"
#                }
#        }
# }

보통 위 같은 형식으로 conf 파일을 생성한다. logstash 를 재시작하지 않고 파일만 저장한다.


kibana 설정 (8.3.3 기준)

kibana 의 전체메뉴에서 Management -> Index Lifecycle Management 로 진입하여 Create policy 를 클릭하고 logstash 에서 지정한 ilm_policy 이름으로 생성한다. 위에서는 test 로 지정했으니 test 로 생성한다고 보면된다.


생성 후 logstash 를 실행한다. 실행 후 kibana 의 Index Templates 탭을 가보면 자동으로 생성이 되어있을 것이다.
만약 생성 안된 템플릿이 있다면 수동으로 설정한다. 수동으로 설정할 때 Index patterns 에 꼭 OOO-* 형태로 아스테리크 표시로 설정하며
Settings 에서는 다음 처럼 지정한다.

{
  "index": {
    "lifecycle": {
      "name": "{ilm_policy 이름}",
      "rollover_alias": "{logstash 에서 지정한 ilm_rollover_alias 이름}"
    },
    "number_of_shards": "1",
    "refresh_interval": "5s"
  }
}

lifecycle policy

정책에 대해 간단히 살펴보면 Hot phase 의 경우 Advanced settings 에서 size 또는 age 를 지정할 수 있는데 여기서 빠르게 테스트를 해보기 위해서는 age 를 10초 정도로 지정하면 된다. rollover 정책으로 인해 logstash 에서 딱히 포멧을 지정하지 않았다면 {now/d}-000001 형태로 계속 생성이 될 것이다. 그리고 우측 위의 무한표시+쓰레기통 에서 쓰레기통을 클릭하면 맨 밑에 Delete phase 가 생성되며 snapshot policy 이 생성되어 있다면 해당 정책이 실행되고 나서 index 가 삭제된다.

프로세스 순서는 다음과 같다.

test-000001 : write (hot age: 10s)
... after 10s
test-000001 : read (delete age: 10s) -> 10s 가 지나면 상태값이 delete 로 변경되며 snapshot 이 지정된 경우 정책 실행 후 삭제됨
test-000002 : write (hot age: 10s)

snapshot policy

kibana 에서는 index 의 snapshot 기능을 제공하며 repository 종류 중에 aws s3 가 있다.
Snapshot and Restore 메뉴로 진입하여 먼저 repository 를 생성한다.

간단하게 이름을 지정한다. 여기서는 test-repository 라고 지정하고 다음으로 넘어간다. (이미지 할 때랑 다르게함..)

위의 이미지처럼 AWS S3 Bucket 이름을 정확하게 써야한다. AWS S3 가서 Bucket 을 생성하고 같은 이름으로 넣자. (권한은 퍼블릭)
그리고 저장한다.


그 다음 옆의 탭인 Policies 에서 새로운 정책을 생성한다.

이름은 간단히 작성하고 형식은 날짜 형태를 그대로 맞췄다. (기본 제공해주는 포멧을 약간 수정)
아까 생성한 repository 를 연결하고 시간은 14:59 로 맞췄다. (GMT 기준 +09:00 이 부분이 여기서는 서버랑 상관없이 수정이 안되는 것 같아서..)
그러면 한국시간 기준으로 23:59 에 실행이 된다. 그리고 다음으로 간다.

여기서 All data streams and indices 부분을 off 하고 필요한 index 만 지정하고 최종 저장한다.

반응형

'DevOps > ELK' 카테고리의 다른 글

Kafka 실습 (4) - Logstash + Elasticsearch + Kibana 시각화  (0) 2021.02.15