태그: Elasticsearch

ElasticStack 사용하기 – (2) Apache Kafka 개요

ElasticSearch, Logstash, Kibana만으로 ElasticStack을 구축할 수는 있지만, 이 구조는 확장성이 부족하다.

ElasticSearch의 부하는 클러스터 구성으로 분산할 수 있지만, Feeder의 역할을 하는 Logstash는 수평적으로 확장하기 힘들다.
또한, 로깅 시스템에는 Fault Tolerant가 필요하다.

Apache Kafka는 이러한 고민거리를  한번에 해결해 준다.

 

ZooKeeper를 기반으로 만들어진 비동기 메시지 프레임워크인 Apache Kafka는 시스템의 가용성과 확장성, 성능을 모두 보장해준다.
그것을 확인하기 위해, Kafka의 아키텍처를 잠시 살펴보자.


Image from http://cloudurable.com/blog/kafka-architecture

Kafka의 아키텍처에서 핵심이 되는 부분은 총 3개이다. Producer, Consumer 그리고 Topic.

Producer는 Record를 생성해 특정 Topic에 발행한다. 이 Record는 Kafka 클러스터 내부에서 자동으로 복제/병렬화되어 저장된다.
Topic을 구독하는 Consumer들은 클러스터에 Record를 요청하여 가져간다. 이 모든 작업이 비동기/분산적으로 이루어진다.

또한 Kafka는 Record를 디스크에 저장하여 영속성을 보장하는데, Disk I/O wait을 줄이기 위하여 적극적으로 페이지 캐시를 사용한다.
이러한 특성 상 Kafka 노드는 쓰기 횟수에 제한이 있는 SSD보다는 RAID 구성의 HDD를 사용하고, 넉넉한 메모리를 확보해야 정상적인 동작을 보장할 수 있다.

Kafka의 분산 처리 매커니즘을 이해하기 위해서는 Partition과 Offset 개념을 알아야 하는데, 이것은 나중에 다시 설명하도록 하겠다.

 

여하튼 Kafka를 브로커로 끼워넣으면, 다음과 같은 시스템이 완성된다.

Telegraf(로그 수집기) -> Kafka(로그 브로커) -> Logstash(로그 가공) -> ElasticSearch(로그 저장/분석) -> Kibana(대시보드)

이 때, Kafka의 입장에서 Telegraf는 Producer, Logstash는 Consumer가 된다.
그리고 Topic에 저장되는 로그의 주인을 식별하기 위해, hostname을 사용할 것이다.

 

이제 데모를 위해 Kafka를 설치하고, 클러스터를 구성한 뒤 Topic을 생성해 볼 것이다.

 

1. Kafka 설치, Zookeeper 설정/실행

Kafka는 구동을 위해 Java를 필요로 한다. Kafka Ver 2.1부터 Java 11을 지원하기 때문에 java11-openjdk를 설치할 것이다.

다음으로 Kafka 다운로드 페이지에서 Kafka의 다운로드 경로를 얻은 뒤 압축을 푼다.

적당한 폴더에 압축을 풀었으면, 먼저 ZooKeeper를 설정한다. Kafka의 실행을 위해서는 ZooKeeper가 실행되어 있어야 하기 때문이다.
여기서는 Kafka에 포함되어 있는 ZooKeeper를 사용한다. 실제 서비스에서는 ZooKeeper를 별도로 유지하는 편이 좋을 것이다.

이제 /bin/zookeeper-server-start.sh <ZooKeeper Config>를 통해 ZooKeeper를 실행할 수 있다.

ZooKeeper의 동작 확인은 다음과 같은 명령어로 가능하다.

서버가 정상적으로 동작한다면, 위와 같은 화면을 볼 수 있을 것이다.

 

2. Kafka 설정/실행

ZooKeeper가 정상 동작하는 것을 확인하였으니, 이제 Kafka를 설정할 차례다.

먼저, Kafka의 config를 수정한다.

Kafka의 설정이 완료되었으면

명령으로 Kafka Server를 실행할 수 있다.

Kafka 클러스터를 실행하였다면 클러스터에 Topic을 추가할 수 있다.
여기서는 ‘test’ 토픽을 추가할 것이다.

이 때, 하나의 노드에서 만들어진 Topic은 전체 클러스터와 동기화되며, 클러스터의 모든 브로커로부터 Pub/Sub가 가능하다.

이와 같이 3번 노드에서 생성한 ‘test’ 토픽을 2번 노드에서 확인할 수 있다.

ElasticStack 사용하기 – (1) CentOS 7에 ElasticSearch 6.5 설치

모니터링/로깅 시스템을 만들기 위해 ElasticStack을 사용하기로 결정하였다. 따라서 가장 먼저 해야 할 일은 ElasticSearch를 설치하는 것이다.

여기서는 Elastic.co의 설치 가이드에 따라 rpm을 이용하여 ElasticSearch를 설정한다.

 

1. yum에 PGP-KEY 등록


2.
ElasticSearch Repo 등록


3.
yum Repo 업데이트


4.
OpenJDK/ElasticSearch 설치


5.
firewalld에 예외 등록 (선택)


6.
ElasticSearch 시작/테스트

 

이렇게 하여 다음과 같은 결과 화면이 나오면 정상적으로 설치가 이루어진 것이다.

 

Filebeat to Logstash에서 임의의 index name 사용하기

 

기본 설정으로 logstash output을 Elasticsearch로 보내면 인덱싱을 위한 접두사로 ‘logstash-‘가 붙게 된다.

이 index name을 원하는 이름으로 바꾸기 위해서, 다음과 같은 방법을 적용할 수 있다.

 

1. logstash 출력 옵션에서 @metadata를 참조하기

기본적으로 @metadata는 다음과 같은 구조를 가진다.

“beat” 필드의 값은 index 필드로 설정할 수 있고, 기본값은’ filebeat’이다.
“type” 필드의 값은 현재 사용되지 않으며, ‘doc’로 고정되어 있다.

즉, index 필드의 값을 변경하는 것으로 logstash에서 [‘@metadata’][‘beat’]를 적용하여 동적으로 인덱스 이름을 적용할 수 있다.

 

즉, 다음과 같은 설정을 적용할 수 있다.

 

2. filebeat에서 field를 설정한 뒤 logstash pipeline를 설정하기

prospector에 따라 다른 종류의 로그를 수집할 수 있으므로, 사용자 정의가 가능한 fields 필드를 사용한다.

 

 

이것으로 한 호스트에서 다양한 정보를 수집할 때, prospector별로 다른 index name을 줄 수 있을 것이다.