상세 컨텐츠

본문 제목

[Elastic Stack] Filebeat multiple output 에러

Data Platform/Elastic Stack

by leediz 2022. 3. 16. 22:53

본문

[Elastic Stack] Filebeat multiple output 에러


사건의 발단

외부 사이트에서 빅데이터 프로젝트를 진행하던 중에 웹로그를 Kafka 토픽으로 적재해야 하는 요건이 나왔다. 그런데 이미 Filebeat를 사용해 웹로그를 읽어 Elasticsearch에 적재하고 있다고 한다. 그래서 우리 회사도 기존에 사용하던 Filebeat에 Kafka output만 추가하여 Kafka 토픽을 만드는 것으로 이야기를 마쳤다. 이 때만 해도 이전에 타 프로젝트에서 Logstash를 이용해 ETL 작업을 할 때, output plugin을 여러 개 사용했기 때문에 당연히 Filebeat에서도 Elasticsearch와 Kafka에 동시에 output 설정을 해서 적재를 하겠거니 라는 안일한 생각을 했다. 그런데 이게 웬걸.. 테스트를 위해 output 설정을 하고 시작하자마자 에러가 뜨는 것이 아닌가.. 그때서야 하나의 Filebeat 설정 파일에서는 하나의 output 설정만 가능하다는 사실을 인지했다.

  • 에러 로그
./filebeat -e
Exiting: error unpacking config data: more than one namespace configured accessing 'output' (source:'filebeat.yml')

 

원인 추정

사실 어찌보면 당연한 것 같다. Filebeat는 data 디렉토리에 meta 데이터 등을 관리하며 데이터를 어디까지 읽었는지에 대한 정보를 저장한다. 물론 Logstash처럼 여러 output을 설정했을 때 각각의 output에 대해 소스 데이터를 어디까지 읽었고 어디까지 보냈는지 등을 저장할 수도 있겠지만.. Filebeat은 단일 목적의 경량 수집기이다. 여러 output을 설정하면 무거워질 수도 있고 복잡해질 수 있으니 지원을 하지 않을것이라는 추측을 해볼 뿐이다.

대안 제시

당장 웹로그 서버를 담당하는 분께 Filebeat 설정 가이드를 드려야 하는 상황이고 어떻게 설치가 되어있는지 정보가 없던 상황이라 그냥 Filebeat의 디렉토리를 커스텀하여 설정하지 않았다는 가정 하에 통째로 복사하여 filebeat.yml에 추가해야 하는 output.kafka 부분에 대한 설정과 함께 기존의 output.elasticsearch는 주석 처리하거나 삭제 하라고 가이드를 드렸다.

하지만 이런 상황이 발생한다면 개인적으로 config 파일과 data 디렉토리를 output 기준으로 각각 별도로 분리하는 것이 좋겠다는 생각을 한다. 이럴 경우 filebeat에 대한 binary 파일은 1개만 쓸 수 있다는 장점이 있다.

예를 들면 아래와 같은 디렉토리 구조가 될 수 있겠다.

.
├── elasticsearch-config
│   ├── filebeat.yml
│   └── modules.d
├── elasticsearch-data
├── filebeat-7.16.3-darwin-x86_64
│   ├── LICENSE.txt
│   ├── NOTICE.txt
│   ├── README.md
│   ├── fields.yml
│   ├── filebeat
│   ├── filebeat.reference.yml
│   ├── filebeat.yml
│   ├── kibana
│   ├── module
│   └── modules.d
├── kafka-config
│   ├── filebeat.yml
│   └── modules.d
└── kafka-data

elasticsearch-config 디렉토리에는 filebeat.yml 파일과 modules.d 디렉토리를 복사하여 output.elasticsearch 과 관련한 설정을 하고, 마찬가지로 kafka-config 디렉토리에도 filebeat.yml 파일과 modules.d 디렉토리를 복사하여 output.kafka 와 관련된 설정을 한다.

그리고 개인적으로 log 디렉토리와 data 디렉토리는 분리하는 것이 좋다고 생각하므로 각 output과 관련한 data 디렉토리를 분리했다. 이것은 예제를 보여주는 것이므로 위치는 별도의 디스크 등 알맞은 곳으로 설정하면 된다.

그리고 보통 beats를 리눅스 서버에서 실행할 때에 서비스로 등록하여 데몬으로 실행을 시킨다. 이때 실행 명령어로 아래와 같이 참조하여 실행시키면 된다.

  • 서비스 파일 등록 예시
$ beats-elasticsearch.service 파일 (예시)
ExecStart=/path/filebeat \
    --path.config /path/elasticsearch-config \
    --path.config /path/elasticsearch-data

$ beats-kafka.service 파일 (예시)
ExecStart=/path/filebeat \
    --path.config /path/kafka-config \
    --path.config /path/kafka-data

마무리

역시 IT 분야에서는 돌다리도 두들겨 보고 건너야 한다는 것을 다시 한번 깨달았다. 당연히 Filebeat에서 multiple output이 될 것이라고 생각하고 테스트 없이 가이드만 달랑 보내줬다면.. 작업도 많이 딜레이가 되었을 것이고 우리 회사의 전문성에 대한 의심의 빌미를 제공했을 수도 있는 등의 여러 사이드 이펙트가 발생했을 것이다. 역시 개발계 서버가 괜히 있는게 아니다. 꼭 무조건 개발계 서버에서 최대한 운영계와 비슷하게 테스트를 해보고 검증된 것만 반영을 해야 한다는 진리를 무시하면 안된다.

참고 자료


관련글 더보기

댓글 영역