Fluentd는 로그(데이터) 수집기(collector)다.
보통 로그를 수집하는 데 사용하지만, 다양한 데이터 소스(HTTP, TCP 등)로부터 데이터를 받아올 수 있다.
Fluentd로 전달된 데이터는 tag, time, record(JSON) 로 구성된 이벤트로 처리되며, 원하는 형태로 가공되어 다양한 목적지(Elasticsearch, S3, HDFS 등)로 전달될 수 있다.
우린 Fluentd로 웹서버의 로그를 실시간으로 받아와서 BigQuery에 적재한 후 분석을 해볼 것이다.
즉, ELT 파이프라인을 만들어 볼 것이다.
우분투 VM을 하나 만들어준다.
이때 ID 및 API 액세스에서 BigQuery를 허용해준다.
방화벽은 HTTP 허용.
NGINX 웹서버 설치
sudo apt-get update && sudo apt-get -y upgrade
sudo apt-get install -y nginx
이제 웹서버에서 로그가 쌓일 테이블을 만들어주자.
빅쿼리에서 데이터 세트와 테이블을 만들어준다.
테이블 생성 시 파티션 및 클러스터 설정에서 time별로 파티션을 나눠서 저장해주자. 실시간으로 계속해서 접속정보가 쌓이므로 파티션을 나눠주는 게 비용효율적이다.
VM에 ssh로 접속해서 fluentd-BigQuery 커넥터를 설치해줄 것이다.
VM을 만들어줄 때 우분투 타입이 있었다. 아마 따로 선택해주지 않았다면 Default로 bullseye타입일 것이다.
이걸 보지 못하고 그냥 만들었다면 콘솔에서도 확인할 수 있고 아래 명령어를 통해서도 확인할 수 있다.
lsb_release -rdc
Debian Fluentd Downloads -> 여기서 자신의 우분투 버전에 맞는 명령어를 가져와서 VM에서 실행.
이 명령어로 인해 td-agent 패키지가 설치됐고, 이제 td-agent 설정파일에서 로그를 받아서 빅쿼리로 보낼 수 있다.
td-agent 사용자 계정을 adm 그룹에 추가
sudo usermod -aG adm td-agent
Fluentd-to-BigQuery 플러그인 설치
sudo /usr/sbin/td-agent-gem install fluent-plugin-bigquery
5분 정도 걸린다.
td-agent 파일 수정
sudo vim /etc/td-agent/td-agent.conf
td-agent.conf
# Fluentd는 입력 플러그인을 사용해 애플리케이션 및 서비스에서 생성한 로그를 수집.
# 이 데이터를 JSON 레코드로 파싱한 다음 구성된 모든 출력 플러그인으로 전달한다.
# nginx 액세스 로그 파서는 access.log 파일을 읽는다.
<source>
@type tail
@id input_tail
<parse>
@type nginx
</parse>
path /var/log/nginx/access.log
pos_file /var/log/td-agent/httpd-access.log.pos
tag nginx.access
</source>
# BigQuery 출력 플러그인 구성.
<match nginx.access>
@type bigquery_insert
# Authenticate with BigQuery using the VM's service account.
auth_method compute_engine
project <프로젝트 ID>
dataset <데이터 세트 이름>
table <테이블 이름>
fetch_schema true
<inject>
# Convert fluentd timestamp into TIMESTAMP string
time_key time
time_type string
time_format %Y-%m-%dT%H:%M:%S.%NZ
</inject>
</match>
설정파일이 적용되도록 Fluentd 재시작
sudo systemctl restart td-agent
VM public ip로 nginx에 접속
이제 접속 로그가 발생했을 것이고, Fluentd가 빅쿼리로 내보냈을 것이다.
성공
ApacheBench(ab)를 사용할 것이다.
ApacheBench란?
웹서버의 성능 테스트를 위해서 접속을 강제로 늘려서 부하를 주는 스트레스 테스트 툴이다.
ab 설치
sudo apt install -y apache2-utils
밑에 명령어를 실행하여 원하는 초 동안 웹서버에 부하를 준다.
난 20초로 해줬다.
ab -t <원하는 시간(초)> -c 1 http://<VM의 IP 주소>/
그러고 빅쿼리에서 로그 데이터를 조회해보면 많은 행이 쌓인 것을 확인할 수 있다.
응답 코드의 초당 요청 수를 계산하는 쿼리 실행
SELECT
time_sec, code, COUNT(*) as count
FROM (
SELECT
TIMESTAMP_TRUNC(time, SECOND)AS time_sec, code
FROM
`<데이터 세트 이름>.<테이블 이름>`)
GROUP BY
time_sec, code
ORDER BY
time_sec DESC
이렇게 로그 분석까지 완료하였다.