메뉴 닫기

Amazon S3에 Apache 로그 저장

안녕하세요 누리클라우드 박상록입니다. 분산된 서버들로 부터 로그 등을 한 곳에서 수집하고 확인해야 하는 경우가 종종 있습니다. 이번 글에서는 Fluentd라는 도구를 이용하여 여러 대의 서버로부터 Amazon S3 버킷으로 로그를 수집하는 간단한 방법을 소개해드리겠습니다.

Fluentd

 Fluentd는 오픈소스 데이터 수집기로, Fluentd를 사용하면 데이터의 수집과 활용을 통합하여 보다 유용하게 사용할 수 있도록 해줍니다. 다양한 소스로부터 생성되는 로그 데이터를 JSON 포맷으로 구조화하여 원하는 목적지로 전달합니다.

 

Fluentd 특징

-. 여러 원본 및 대상 서버로부터 JSON 데이터를 구조화하고, 모든 면의 데이터를 통합할 수 있습니다.

-. 500개 이상의 커뮤니티가 제공하는 플러그인 시스템을 갖추고 있습니다.

-. C언어와 Ruby로 작성되었으며 시스템 리소스가 거의 필요하지 않습니다.

-. 메모리 및 파일 기반 버퍼링을 지원하여 노드 간 데이터 손실을 방지합니다.

패키지 설치 및 구성

  1. td-agent

Ruby로 작성된 fluentd를 사용자가 쉽게 사용할 수 있도록 Treasure Data 사에서 배포/유지보수하고 있는 안정적인 배포 패키지입니다. Ruby Gem 등의 프로그램과 시작 스크립트 등의 편리한 파일을 설치 명령 하나로 제공해줍니다. td-agent는 환경 변수 PATH에 존재하지 않는 디렉토리에 Ruby Gem을 설치 해주기 때문에 전체 시스템에 영향을 주지 않고 사용하는 장점이 있습니다. td-agent와 Fluentd의 차이점은 다음 링크를 참조하세요. https://www.fluentd.org/faqs

  1. td-agent 설치하기

여기서는 RPM 패키지로 설치하겠습니다.

#curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh

위와 같이 명령 실행하면 설치스크립트가 자동으로 새로운 RPM 저장소를 /etc/yum.repos.d/td.repo에 등록하고 td-agent RPM 패키지를 설치합니다.

  1. 데몬 실행하기

td-agent는 systemd, init.d 두가지 방식의 데몬 기동 스크립트를 제공합니다. 이 중 init.d방식으로 데몬을 기동하겠습니다.

#/etc/init.d/td-agent start

  1. 간단한 테스트

td-agent 는 /etc/td-agent/td-agent.conf 에서 기본 설정으로 HTTP에서 로그를 가져와서 로컬파일인 /var/log/td-agent/td-agent.log 로 저장되도록 되어 있습니다. 설정 파일을 수정하기 전에 일단 로그를 한 번 발생시켜 보고 발생된 로그가 지정된 파일로 잘 저장되는지 봅니다.

#curl -X POST -d ‘json={“json”:”message”}’ http://localhost:8888/debug.test

#tail -f /var/log/td-agent/td-agent.log

2018-08-07 15:05:41 +0000 debug.test: {“json”:”message”}

로그가 지정된 경로의 파일에 실시간으로 저장되는 것을 확인할 수 있습니다.

  1. td-agent.conf 수정

이제 아래와 같이 설정파일를 수정합니다.


<match> 지시자 안에 S3 키/버킷/리전/경로 정보를 입력합니다.

<buffer> type은 파일로 저장되도록 file선택합니다. 미지정시 memory로 기본 설정됩니다.

Path는 버퍼링 파일이 저장될 경로입니다.

Timekey_wait는 버퍼링 된 파일을 s3에서 처리할 시기를 결정한다. 일반적으로 fluentd가 지연된 이벤트를 받을 수 있도록 대기시키는 시간입니다.

output 옵션 및 설정에 대해서는 아래 링크를 참조 바랍니다.

https://docs.fluentd.org/v1.0/articles/apache-to-s3

  1. 확인

지정한 S3 버킷에 수집된 로그가 아래와 같이 gzip 형식으로 저장되는 것을 확인할 수 있습니다.


참고

Fluentd 동작에 문제가 발생할 소지를 방지하기 위해 아래 설정들을 사전에 설정할 필요가 있습니다.

1) 파일 디스크립터 설정 변경

#ulimit -n

1024

최대치가 1024 로 보인다면 fluentd 운영하기에 많이 부족하므로 많이 늘려야 합니다. fluentd 의 플러그인과 설정(in_tail 의 파일 수 / in_forward 의 접속 수/ buf_file 의 버퍼 정크수 등)에 따라 다르겠지만 65536 정도가 안전합니다.

#view /etc/security/limits.conf

root soft nofile 65536

root hard nofile 65536

* soft nofile 65536

* hard nofile 65536

2) 네트워크 커널 파라미터 최적화

#view /etc/sysctl.conf

net.core.somaxconn = 1024

net.core.netdev_max_backlog = 5000

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.ipv4.tcp_wmem = 4096 12582912 16777216

net.ipv4.tcp_rmem = 4096 12582912 16777216

net.ipv4. tcp_max_syn_backlog = 8096

net.ipv4.tcp_slow_start_after_idle = 0

net.ipv4.tcp_tw_reuse = 1

net.ipv4.ip_local_port_range = 10240 65535

많은 Fluentd 인스턴스로 구성된 고부하 환경의 경우, 아래 매개 변수를 /etc/sysctl.conf 파일에 추가합니다.

앞에서 Apache로그를 S3버킷에 업로드 하는 설정을 살펴보았습니다. Fluentd는 대량 로그를 전송하는 것을 목적으로 만들어져 있기 때문에 기본 설정은 메모리에 로그를 버퍼링 합니다. 즉 서버에 장애가 발생하면 로그가 손실될 수 있습니다. 잘못된 설계로 운영에 큰 영향을 줄 수 있으니 올바른 사용법으로 분산된 여러 대의 서버의 데이터를 S3 버킷에 통합하여 관리한다면 서비스 운영 관리에 상당한 도움이 될 것입니다.