인식한 상황
IoT 디바이스에서 수집한 데이터를 처리하기 위해 MQTT 프로토콜과 함께 여러 개의 Logstash 인스턴스를 사용했다. 하지만 여러 인스턴스를 동시에 운영하다보니 서버의 리소스가 부족해지는 현상이 있었다…
서버의 리소스가 부족해지는 문제를 해결하기 위해 Filebeat를 도입하여 수집과 필터링을 하는 부분을 나눴다. 하지만 결국 한 개의 Logstash로는 감당하기 힘들어졌고, 이전 보다 적게 스케일 아웃 하였다. 하지만 Filebeat의 Config를 수정해야 한다는 점에서 공주대학교의 연구진이 사용하기 너무 어렵겠다고 피드백 받았다. 왜냐하면 Config 수정 이후 다시 시작하는 작업을 각 Filebeat에서 해야 하니 사용성이 떨어졌다…
(연구원분들께 매뉴얼 드려도 어렵다고 하셨다…)
해결 과정
이러한 확장성 문제를 Kafka를 도입하여 중간 브로커 역할을 하게 되었다. Filebeat는 수집한 데이터를 Kafka로 보내고 Logstash는 Kafka의 Message를 소비하도록 아키텍처를 변경하였다.
변경 전 아키텍처
변경 전에는 Logstash가 1개 더 추가된다면 http로 요청하는 IoT 기기 모두의 config를 수정해야 했다.
변경 전 아키텍처
변경 이후에는 config를 변경할 필요 없이 log를 읽는 filebeat를 iot 기기에 추가만 하면 끝난다.
연구집의 입장에서는?
설치 이전에 Logstash 부분을 설명하니 충분히 크게 만들어달라는 요청이 있었지만, IoT 기기가 새롭게 생길 수 있다는 의견을 받았다. 이를 위해 Logstash는 3개를 만들어두고 Filebeat를 설정하는 shell script를 제공했다. 아래는 shell script이다.
#!/bin/bash
ELASTIC_VERSION="${ELASTIC_VERSION:-8.15.3}"
FILEBEAT_INTERNAL_PASSWORD="${FILEBEAT_INTERNAL_PASSWORD:-}"
BEATS_SYSTEM_PASSWORD="${BEATS_SYSTEM_PASSWORD:-}"
docker build \
--build-arg ELASTIC_VERSION="${ELASTIC_VERSION}" \
-t filebeat-file:${ELASTIC_VERSION} \
./filebeat-file/
docker run -d \
--name filebeat-file \
--user root \
-e ELASTIC_VERSION="${ELASTIC_VERSION}" \
-e FILEBEAT_INTERNAL_PASSWORD="${FILEBEAT_INTERNAL_PASSWORD}" \
-e BEATS_SYSTEM_PASSWORD="${BEATS_SYSTEM_PASSWORD}" \
-v "$(pwd)/config/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro,Z" \
-v /var/lib/docker/containers:/var/lib/docker/containers:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v ./logs:/var/iot/logs
filebeat-file:${ELASTIC_VERSION} \
-e \
--strict.perms=false
결과
이를 통해 연구진 입장에서는 만들어둔 shell script를 통해 보다 쉽게 IoT 기기를 추가할 수 있었고, 서비스의 안정성도 높아졌다.