빅데이터 로그 수집기, Fluentd 소개

Introducing BigData Log Aggregator, Fluentd

빅데이터를 처리하기 위해서는 각종 로그들의 수집이 필요한데, 이 때 사용하는 것이 로그 수집기(Log Aggregator)이다.  로그 수집 툴은 Scribe, Flume, Fluentd 및 logstash 등이 있는데, 이들 수집기 비교는 다음 글을 참고한다.

1. Fluentd 소개

fluentd는 효율적으로 데이터를 사용하고 이해하기 위한 데이터의 수집과 소비를 통합할 수 있는 오픈 소스 데이터 수집기이다.
다음 그림은 fluentd의 아키텍쳐 그림이다. 입력과 출력을 다양화 할 수 있으며, 입/출력 부분을 사용자가 직접 코드로 작성하여 연결할 수 있는 확장성을 제공한다.




다음 그림은 다양한 형태의 입력을 받을 수 있고, 출력을 형식화 할 수 있는 fluentd의 구조를 보여준다.

Input 단계는 로그를 수집하는 모듈로 사용자화 할 수 있는 플러그인 형태이다. 따라서 다양한 로그 소스를 지원할 수 있다. File, HTTP, TCP 등 기본 플러그인을 비롯하여 확장 플러그인들을 다운로드 받거나 직접 설치할 수 있다.

Buffer는 시스템 또는 네트워크 이상 또는 부하에 따른 재처리를 위해 파일 또는 메모리를 사용하여 데이터를 유지할 수 있고, Output 역시 Input 과 동일하게 사용자화할 수 있는 플러그인 형태로 다양한 포맷으로 데이터를 변경할 수 있다.

Input 단계에서 획득한 모든 정보들이 Output 단계로 보내지는 것은 아니며, Engine에서 필터링하여 항목을 삭제하거나 추가할 수 있다. 그리고 Input 단계 또는 Output 단계는 또 다른 fluentd와 연결이 가능 가능한다.




다음 그림은 문자열 형태의 웹서버 로그들을 Json 형태로 변환하여 저장하는 그림을 보여준다.


다음은 Forward 되는 fluentd 구성을 보여준다. 이 처럼 fluented는 Input과 Output 단계에서 각각 또 다른 fluentd을 둘 수 있다.


자세한 설명은 다음 슬라이드를 참고한다.


2. Fluentd 설치

설치는 다양한 방법으로 할 수 있는데, linux에서 curl을 통해 td-agent을 쉽게 설치하는 방법을 소개한다.  td-agent는 fluentd 사용을 편리하게 만든 래퍼 프로그램이다.

2.1 Linux에 설치


다음은 Debian Jessie 에서 설치하는 명령이고, 다른 OS들에서 설치 명령들은 다음 주소를 참고한다.  http://docs.fluentd.org/articles/install-by-deb
curl -L https://toolbelt.treasuredata.com/sh/install-debian-jessie-td-agent2.sh | sh

설치가 정상적으로 되었다면  /etc/init.d/td-agent 에 설치가 된다. 그리고 다음과 같이 정상 동작을 확인한다.
$ sudo /etc/init.d/td-agent restart
[ ok ] Restarting td-agent (via systemctl): td-agent.service.
$ sudo /etc/init.d/td-agent status
● td-agent.service - LSB: data collector for Treasure Data
   Loaded: loaded (/etc/init.d/td-agent; generated; vendor preset: enabled)
   Active: active (running) since Fri 2016-10-21 08:42:49 UTC; 10s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 4780 ExecStop=/etc/init.d/td-agent stop (code=exited, status=0/SUCCESS)
  Process: 4846 ExecStart=/etc/init.d/td-agent start (code=exited, status=0/SUCCESS)
    Tasks: 9 (limit: 4915)
   Memory: 63.4M
      CPU: 447ms
   CGroup: /system.slice/td-agent.service
           ├─4879 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
           └─4882 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
Oct 21 08:42:49 gather-twitter-data systemd[1]: Starting LSB: data collector for Treasure Data...
Oct 21 08:42:49 gather-twitter-data td-agent[4846]: Starting td-agent:  * td-agent
Oct 21 08:42:49 gather-twitter-data systemd[1]: Started LSB: data collector for Treasure Data.
그리고 다음과 같이 td-agent을 종료할 수 있다.
$ sudo /etc/init.d/td-agent stop

데이터를 수집하기 위해서는 td-agent.conf 파일을 수정해야 한다. td-agent.conf 파일은 다음 경로에 위치한다. 

/etc/td-agent/td-agent.conf

2.2 macOS 설치

macOS에서 td-agent 설치 관련해서는 fluentd 홈페이지을 참고한다.

http://docs.fluentd.org/articles/install-by-dmg

3. HTTP로 샘플 로그들 수집

td-agent.conf 파일을 열어 보면 HTTP로 수집하는 입력 정보는 다음과 같이 정의되어 있다.
# HTTP input# POST http://localhost:8888/?json=# POST http://localhost:8888/td.myapp.login?json={"user"%3A"me"}# @see http://docs.fluentd.org/articles/in_http @type http port 8888

예제로 json 데이터를 HTTP로 보내보자

$ sudo /etc/init.d/td-agent restart
$ curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
이 데이터는 기본 설정에 의해 /var/log/td-agent/td-agent.log 에 저장이 된다. 다음과 같이 데이터를 확인해 보면 샘플 로그가 HTTP을 통해 파일에 저장된 것을 확인할 수 있다.

$ cat /var/log/td-agent/td-agent.log 2016-10-21 08:36:12 +0000 [info]: reading config file path="/etc/td-agent/td-agent.conf"2016-10-21 08:36:12 +0000 [info]: starting fluentd-0.12.26 ....

2016-10-21 08:51:17 +0000 debug.test: {"json":"message"}


4. Google Cloud Platform(GCP)과 연동을 위한 plugin 설치

만일 수집된 데이터들을 GCP을 통해 분석한다면, VM 인스턴스 생성 때 Cloud API 접근 권한을 가능한 'Full API Access'을 주는 것이 좋고, 필요에 따라서는 특정 API를 지정할 수 있다. fluentd을 사용하여 수집된 데이터를 구글의 Pub/Sub로 데이터를 전달하기 위해서는 fluentd pub/sub plugin 을 추가 설치해야 한다. plugin 이름은 'gluent-pugin-gcloud-pubsub' 이며, 다음과 같이 명령을 주면 설치가 가능하다.



$ sudo td-agent-gem install fluent-plugin-gcloud-pubsub

댓글

이 블로그의 인기 게시물

C++로 프로그래밍할 때 인자 또는 리턴 값으로 std::vector 등 STL 데이터 타입 처리하는 좋은 방법

macOS가 갑자기 부팅이 되지 않을 경우 데이터 복구 또는 백업 방법

Git 저장소를 병합하는 방법(How to merge repositories in Git)