결론부터 말하자면 데이터 수집은 Fluentd를 이용하여 진행하였다.
해당 단계에서는 이벤트 서버에서 데이터를 수집하여 별다른 정제 작업 없이 바로 Data Lake에 저장한다.
위 단계의 진행 과정은 아래와 같다.
데이터 수집
로그 수집기를 이용하여 데이터를 수집하는 과정이다.
본 프로젝트에서는 fluentd를 이용하여 로그가 생성되면 바로 수집되게 된다.
데이터 적재
수집된 로그를 데이터 레이크에 저장하는 과정이다. 별다른 처리 없이 수집된 json 파일 그대로 object storage에 저장된다.
원래부터 로그 수집기를 이용하려던건 아니였다. 데이터를 수집할 방법은 여러가지 있었고 그 중 로그 수집기를 이용하는 방법을 선택하게 되었다. 아래는 다른 방법들이다.
Event server에서 로그가 생성되면 그 파일을 Data Lake에 전송될 수 있게 소스 코드를 수정한다.
하지만, 외부에서 작동하는 서버일 경우 직접 서버를 고쳐 로그를 자동으로 Data Lake에 전송할 수 있게 만들수 있을리가 없으니 Pass.
AWS에서 제공하는 boto3 라이브러리를 이용해 특정 폴더의 파일들을 지정된 시간에 전송하도록 직접 구현하는 방법이다. 4가지 event data가 모두 json 파일이고, 같은 요일에 생성된건 같은 폴더에 저장되니 적합해 보일 수 있다.
하지만, 로그 별로 저장된 위치가 다르다거나, 가지고 있는 포맷이 다르다던가 등등 이런 경우에 맞게 종류 별로 스크립트를 구현하다보면 복잡해져서 나중에는 비효율적일 수 있다.
이런거 저런거 추가하다 이렇게 되버리면...ㅎㅎㅎ
2번의 그림과 같은 상황은 피해야 하기에 멘토님께 물어보니, Fluentd라는 오픈 소스 로그 수집기를 제안해 주셨다. 다양한 데이터 형식 및 프로토콜을 지원해 서로 다른 데이터를 한 곳으로 수집해 출력 시스템(Data Lake)에 맞게 일관성 있게 수정 가능해 2안에서 발생할 수 있는 문제점 또한 해결할 수 있을 것 같았다.
또한, 프로그램 내 버퍼 기능이 있었는데, 대용량 데이터를 전송해야 하는 본 프로젝트 특성 상 한 번에 전송 할 데이터의 양, 속도 조절이 필요하다고 생각하기에 2안에 비해 적절한 선택지라 생각하였다.
따라서 Fluentd를 이용해 매일 같은 시간에 로그데이터가 생성되면 이를 바로 인식하여 수집하고 전송할 수 있도록 구성을 진행하였다.
구성 진행사항은 다음과 같다.
Fluentd를 이용해 각 이벤트들에 대한 수집을 진행하는 과정이다.
데이터를 배치 작업으로 매일 지정된 시간에 한꺼번에 처리를 수행하게 하였다.
생성된 이벤트 로그는 우선 이벤트 서버의 폴더에 저장되며, 로그 수집기에서는 폴더에 새로운 로그가 저장된 것을 감지하는 것으로 수집을 시작한다.
<source>
@type tail
@id auth_events
<parse>
@type json
</parse>
path "path_to_data"/*/auth_events
tag event.auth
read_from_head true
</source>
@type tail
: tail input plugin을 이용하여 로그 파일을 읽어들임을 지정한다.@id auth_events
: 해당 설정의 id를 auth_events로 지정한다.@type json
: 읽어들일 데이터의 포맷을 지정한다.path "path to data"
: 읽어들일 데이터의 위치를 지정한다.tag event.auth
: 이벤트를 어디로 보낼지 결정하기 위한 구분값을 지정한다.read_from_head true
: 로그를 처음부터 생성된 순서대로 읽어들인다. 현재는 배치 작업으로 전날의 로그를 한꺼번에 읽어들여 처리를 하는 구조이므로, 해당 옵션을 지정하였다.데이터를 한꺼번에 수집하여 일괄 전송 및 적재할 수 있도록 구성한다.
<match event.*>
@type s3
aws_key_id "{key_id}"
aws_sec_key "{sec_key}"
s3_bucket "{bucket_name}"
s3_region "{region}"
s3_endpoint "{endpoint}"
path ${tag[1]}/%Y-%m-%d/${tag[1]}_event
s3_object_key_format %{path}.%{file_extension}
store_as json
<buffer tag,time>
@type file
path /var/log/td-agent/s3
timekey_wait 10m
chunk_limit_size 256m
</buffer>
<format>
@type json
</format>
</match>
@type s3
: s3 output plugin을 이용해 데이터를 object storage에 전달할 것임을 지정한다.store_as
: 저장될 데이터의 포맷을 지정한다.@type file
: Buffer data는 파일 형태로 저장한다.timekey_wait 10m
: Buffer에 저장된 데이터는 최대 10분까지 버퍼에 머무를 수 있으며 그 후 Object Storage로 일괄 전송된다.chunk_limit_size 256m
: 10분이 지나지 않았더라도 Buffer에 저장된 데이터 크기가 256m이 넘는다면 Object Storage로 일괄 전송된다.@type json
: 전송할 데이터의 type을 json으로 지정한다.