Fluentd와 BigQuery를 사용한 실시간 로그 분석

김민형·2022년 9월 7일
1

GCP - Data

목록 보기
8/44

Fluentd


Fluentd는 로그(데이터) 수집기(collector)다.
보통 로그를 수집하는 데 사용하지만, 다양한 데이터 소스(HTTP, TCP 등)로부터 데이터를 받아올 수 있다.
Fluentd로 전달된 데이터는 tag, time, record(JSON) 로 구성된 이벤트로 처리되며, 원하는 형태로 가공되어 다양한 목적지(Elasticsearch, S3, HDFS 등)로 전달될 수 있다.

우린 Fluentd로 웹서버의 로그를 실시간으로 받아와서 BigQuery에 적재한 후 분석을 해볼 것이다.
즉, ELT 파이프라인을 만들어 볼 것이다.

VM 및 BigQuery 테이블 생성

우분투 VM을 하나 만들어준다.

이때 ID 및 API 액세스에서 BigQuery를 허용해준다.
방화벽은 HTTP 허용.

NGINX 웹서버 설치

sudo apt-get update && sudo apt-get -y upgrade
sudo apt-get install -y nginx

이제 웹서버에서 로그가 쌓일 테이블을 만들어주자.
빅쿼리에서 데이터 세트와 테이블을 만들어준다.

테이블 생성 시 파티션 및 클러스터 설정에서 time별로 파티션을 나눠서 저장해주자. 실시간으로 계속해서 접속정보가 쌓이므로 파티션을 나눠주는 게 비용효율적이다.

Fluentd 설정

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


이렇게 로그 분석까지 완료하였다.

profile
Solutions Architect (rlaalsgud97@gmail.com)

0개의 댓글