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

로그는 오래 전부터 대규모 시스템과 애플리케이션의 성능을 보여 주는 강력한 도구로 이용되어 왔습니다. 하지만 시스템이 확장되고 복잡해지면서 수많은 인프라에 분산되어 있는 여러 개의 로그를 관리하기가 쉽지 않게 되었습니다.

Fluentd는 전 세계 2,000개 이상의 회사에서 사용하고 있는 오픈소스 로그 수집 도구로 많은 데이터 소스와 시스템에서 수집된 로그를 하나의 로깅 레이어로 통합시키는 데 목적을 두고 있습니다. 나중에 어떤 데이터를 분석해야 유용할지를 미리 파악하기란 쉽지 않으므로 데이터를 모두 로깅한 다음 나중에 정리하는 경우가 보편적입니다. 하지만 이러한 모든 데이터를 수집하여 저장하게 되면 관리가 힘들어지고 원하는 데이터를 찾는 것이 어려워지거나 시간이 많이 소요되게 됩니다.

바로 여기서 BigQuery의 강점이 빛을 발합니다. BigQuery는 Google의 뛰어난 확장성을 갖춘 완전 관리형 병렬 쿼리 서비스로 로그 통계와 관련된 엄청난 유용성을 선사합니다. 수십 분에서 몇 시간까지 소요될 수 있는 대규모 MapReduce 작업과는 달리, BigQuery는 테라바이트 단위의 로그에 대한 쿼리를 수십 초 안에 수행할 수 있으므로 시스템 문제를 해결하고 성능을 개선하는 데 필요한 답을 신속하게 얻을 수 있습니다.

기본적으로 사용자는 초당 10,000행의 로그 데이터를 각각의 BigQuery 테이블로 스트리밍할 수 있으며 요청 시에는 한도를 초당 100,000행까지 올릴 수도 있습니다. 데이터 스트림을 여러 개의 BigQuery 테이블로 분할하고 Fluentd-to-BigQuery 플러그인을 사용하여 수천 개의 서버에서 로그를 거의 실시간에 가까운 속도(초당 백만 행 이상)로 BigQuery에 바로 로드할 수 있습니다. 그런 다음 Google 스프레드시트 내에서 1분 또는 1시간 간격으로 새로고침되는 대시보드를 생성하여 데이터를 간편하게 시각화할 수 있습니다.

목표

  • Google Compute Engine 인스턴스에서 nginx 웹 서버를 실행합니다.
  • Fluentd를 사용하여 이 서버에 브라우저 트래픽을 로깅합니다.
  • BigQuery 웹 UI와 Google 스프레드시트의 Google Apps Script를 사용하여 로깅된 데이터를 쿼리합니다.
  • 자동으로 새로고침되는 Google 스프레드시트 내의 차트에서 쿼리 결과를 시각화합니다.

기본 요건

예제 코드 복제

GitHub 저장소를 컴퓨터에 복제하려면 다음 명령어를 실행합니다.

git clone https://github.com/GoogleCloudPlatform/bigquery-fluentd-docker-sample

데이터세트 및 BigQuery 테이블 생성하기

다음 명령어를 실행하여 bq_test라는 데이터세트를 생성합니다.

bq mk bq_test

GitHub 저장소를 복제한 디렉토리로 디렉토리를 변경합니다.

cd bigquery-fluentd-docker-sample

다음 명령어를 실행하여 제공된 스키마 파일 schema.json으로 정의된 데이터 이름과 유형으로 BigQuery 테이블 access_log를 생성합니다.

bq mk -t bq_test.access_log ./schema.json

BigQuery 웹 UI를 열고, 프로젝트 이름을 선택하고, bq_test 데이터세트를 클릭하고, access_log 테이블을 선택합니다. 지정된 스키마가 포함된 테이블이 생성되었는지 확인합니다.

Google Compute Engine 인스턴스 생성하기

다음 명령어를 실행하여 bq-test-instance라는 Google Compute Engine 인스턴스를 생성합니다.

gcloud compute instances create "bq-test-instance" \
  --zone "us-central1-a"  \
  --machine-type "n1-standard-1"  \
  --scopes storage-ro,bigquery \
  --image-family=cos-stable \
  --image-project=cos-cloud

Docker 컨테이너에서 nginx 및 Fluentd 실행하기

방금 생성한 Compute Engine 인스턴스에 로그인합니다.

gcloud compute ssh bq-test-instance --zone=us-central1-a

Compute Engine 인스턴스에서 다음 명령어를 실행하여 <YOUR_PROJECT_ID>를 본인의 프로젝트 ID로 바꿉니다.

sudo docker run -e GCP_PROJECT="<YOUR_PROJECT_ID>" -p 80:80 -t -i -d google/fluentd-bigquery-sample

이 명령어를 실행하면 Docker 이미지 google/fluentd-bigquery-sample의 다운로드가 시작되고, 이어서 nginx 및 Fluentd로 사전 구성된 Docker 컨테이너가 실행됩니다.

다음으로 페이지 조회를 생성해 Fluentd가 데이터를 BigQuery로 전송하고 있는지 확인해 보아야 합니다.

  1. VM 인스턴스 목록에서 bq-test-instance를 찾은 다음 EXTERNAL IP 열에 있는 링크를 클릭합니다. 대화상자에서 HTTP 트래픽 허용을 선택하고 적용을 클릭하여 방화벽 규칙을 추가합니다. ''bq-test-instance'의 인스턴스 태그 업데이트 중'이라는 메시지와 함께 창 오른쪽 하단에 활동 대화상자가 나타납니다. 방화벽 규칙을 인스턴스와 연결하기 위해 태그가 사용되었음을 알 수 있습니다.
  2. 업데이트가 완료되면 외부 IP 링크를 다시 클릭하여 브라우저에서 Compute Engine 인스턴스의 nginx 서버에 액세스합니다. 'nginx에 오신 것을 환영합니다'라는 메시지가 표시된 웹페이지가 나타납니다. 페이지를 몇 번 새로고침하여 브라우저 요청을 생성합니다.

BigQuery 웹 UI를 사용하여 쿼리 실행하기

BigQuery 웹 UI를 열고 쿼리 작성하기를 클릭한 후 다음 쿼리를 실행합니다.

 SELECT * FROM [bq_test.access_log] LIMIT 1000

방금 웹 서버로 전송한 브라우저 요청이 access_log 테이블에 기록된 것을 확인할 수 있습니다. Fluentd에서 보낸 초기 로그 항목을 수신하기까지 몇 분이 소요될 수 있다는 점에 유의하세요.

모든 작업을 마쳤으므로 nginx 액세스 로그 이벤트가 Fluentd에 의해 수집되고 BigQuery로 이를 가져오면 웹 UI에 표시된다는 사실을 방금 확인했습니다. 다음 섹션에서는 Apache Bench 도구를 통해 웹 페이지로 더 많은 트래픽을 전송하여 Fluentd와 BigQuery가 대용량 로그(기본적으로 초당 최대 10,000행까지 가능)를 실시간으로 처리하는 방식을 확인해 보겠습니다.

Google 스프레드시트에서 쿼리 실행하기

BigQuery 웹 UI에서 쿼리를 실행하는 것 외에도, 이 가이드에서 제공하는 스프레드시트 사본을 사용하여 Google 스프레드시트에서 BigQuery로 SQL 구문을 제출할 수도 있습니다. 스프레드시트에는 BigQuery 쿼리를 실행하고, 결과를 저장하고, 결과를 삽입된 차트에 시각화하는 Apps Script가 포함되어 있습니다. 스크립트 및 그 차트는 지정한 간격(예: 1분, 1시간, 1일)마다 자동으로 업데이트되도록 구성할 수 있습니다.

Google 스프레드시트에서 BigQuery API 사용 설정하기

Google 스프레드시트에서 BigQuery로 SQL 구문을 실행할 수 있도록 하려면 다음 안내를 따르세요.

  1. BigQuery와 Google 스프레드시트 통합 예시를 열고 파일 > 사본 만들기...를 선택합니다.
  2. 스프레드시트 사본에서 도구 > 스크립트 편집기...를 선택합니다.
  3. 스크립트 편집기에서 bq_query.gs를 엽니다. 이 스크립트는 BigQuery 쿼리를 실행하고 쿼리 결과를 시트에 저장한 다음 차트를 생성하여 쿼리 결과를 시각화합니다.
  4. 자리표시자 텍스트 <<PUT YOUR SPREADSHEET URL HERE>>를 스프레드시트 사본으로 연결되는 URL로 바꿉니다.
  5. 자리표시자 텍스트 <<PUT YOUR PROJECT ID HERE>>를 프로젝트 ID로 바꿉니다. 파일 > 저장을 선택합니다.
  6. 스크립트 편집기 메뉴에서 리소스 > 고급 Google 서비스...를 선택합니다. BigQuery API가 켜져 있는지 확인합니다.
  7. 고급 Google 서비스 대화상자 하단에서 Google Cloud Platform Console로 연결되는 링크를 클릭합니다. 새 프로젝트 ID를 생성하라는 메시지가 표시됩니다. 이 ID가 스프레드시트와 연결됩니다.
  8. BigQuery API의 API 목록을 둘러보고 상태를 '끄기'에서 '켜기'로 전환합니다. 이제 BigQuery API가 사용 설정된 API 목록 상단에 표시됩니다.
  9. 콘솔을 닫고 고급 Google 서비스 대화상자에서 확인을 클릭합니다.

공개 데이터세트 쿼리하기

이제 다음과 같이 스프레드시트에서 BigQuery 쿼리 샘플을 실행합니다.

  1. 스프레드시트 사본에서 BQ 쿼리 시트를 엽니다. 이 시트에는 이름이 'gsod_temperature_LINE'인 BigQuery 쿼리가 포함되어 있습니다. 이 쿼리는 공개 GSOD 기상 데이터베이스에서 연간 온도 데이터를 수집합니다.

  2. 쿼리를 정의하는 스프레드시트의 행
  3. 대시보드 > 모든 BQ 쿼리 실행을 선택합니다. 처음 BigQuery를 실행하면 '승인 필요'라는 메시지가 표시된 대화상자가 나타납니다. 계속동의를 클릭합니다.
  4. 쿼리 실행이 완료되면 gsod_temperature라는 이름의 새로운 시트가 표시됩니다. 이 시트를 열고 쿼리 결과가 포함되어 있는지 확인합니다.
  5. BigQuery 결과 시각화 시트를 열고 쿼리에 의해 반환된 온도 데이터의 삽입 선 차트가 포함되어 있는지 확인합니다.

  6. 전 세계 평균, 최소 및 최대 온도 데이터가 나와 있는 선 차트

Fluentd 데이터 쿼리하기

이전 단계에서는 공개 데이터세트에서 샘플 쿼리를 실행해 보았습니다. 이 섹션에서는 Fluentd를 통해 수집된 초당 브라우저 요청수(rps) 데이터를 Compute Engine 인스턴스에 쿼리하게 됩니다.

BQ 쿼리 시트를 엽니다. 비어 있는 다음 행에 이름이 'access_log_LINE'인 쿼리를 간격 1로 생성하고 쿼리 셀에는 다음을 입력합니다.

SELECT
  STRFTIME_UTC_USEC(time * 1000000, "%Y-%m-%d %H:%M:%S") as tstamp,
  count(*) as rps
FROM bq_test.access_log
GROUP BY tstamp ORDER BY tstamp DESC;

대시보드 > 모든 BQ 쿼리 실행을 선택합니다. 그러면 쿼리 결과가 access_log라는 새 시트에 저장됩니다. access_log를 열어 쿼리된 로그 데이터를 확인하고 BigQuery 결과 시각화 시트를 열어 해당하는 선 차트를 확인합니다. 선 차트가 표시되지 않으면 BQ 쿼리 시트의 쿼리 이름에 서픽스 '_LINE'이 포함되어 있는지 확인하세요. 아직 Compute Engine 인스턴스에 브라우저 방문 횟수가 많지 않으므로 이 차트에는 많은 데이터가 포함되어 있지 않습니다. 다음 섹션에서는 더 큰 규모의 브라우저 트래픽 부하를 시뮬레이션합니다.

부하 시뮬레이션하기

로컬 터미널을 열고 다음 명령어를 실행하여 Apache Bench 도구를 통해 nginx 서버로 전달되는 트래픽을 시뮬레이션합니다. <YOUR_EXTERNAL_IP>를 Compute Engine 인스턴스의 외부 IP로 바꿉니다.

ab -c 100 -n 1000000 http://<YOUR_EXTERNAL_IP>/

대시보드 > 모든 BQ 쿼리 실행을 다시 선택합니다. access_log 시트를 열면 이제 쿼리 결과에 시뮬레이션된 브라우저 트래픽이 급증한 기록이 포함되었으며, 급증한 기록이 BigQuery 결과 시각화 시트의 선 차트에 표시되어 있음을 확인할 수 있습니다.

자동 쿼리 실행 설정하기

이러한 쿼리를 자동으로 실행하고 차트를 일정한 간격으로 새로고침하려면 다음을 수행합니다.

  1. 도구 > 스크립트 편집기로 이동하여 리소스 > 현재 프로젝트 트리거를 선택합니다. 아직 설정된 트리거가 없음을 확인할 수 있습니다.
  2. 링크를 클릭하여 트리거를 추가합니다.
  3. 실행 메뉴에서 'runQueries'를 선택하고 이벤트에는 시간 기준, 분 단위 타이머, 1분마다를 선택합니다. 저장을 클릭합니다. 그러면 스크립트 bq_query.gs가 분당 한 번만 실행됩니다.
  4. BigQuery 결과 시각화 시트로 돌아오면 'access_log' 그래프가 1분마다 새로고침되는 것을 확인할 수 있습니다.

초당 브라우저 요청수가 나와 있는 선 차트

이것으로 Google 스프레드시트가 Fluentd를 통해 수집한 데이터세트에 대해 BigQuery 쿼리를 자동으로 실행하고, 결과를 실시간으로 시각화하도록 설정하는 단계가 완료되었습니다.

다음 단계

다음은 스프레드시트에 더 많은 쿼리를 추가하려는 경우를 위한 몇 가지 참고사항입니다.

  • Apps Script에서 BigQuery API를 사용하는 방법에 대한 자세한 내용은 BigQuery 서비스를 참조하세요.
  • BQ 쿼리 시트에 새 쿼리를 추가하는 경우 비어 있는 다음 행에 쿼리를 추가합니다. 쿼리 사이에 빈 행을 남겨 두면 안 됩니다.
  • 스프레드시트가 새로운 쿼리 이름으로 쿼리를 실행할 때 쿼리 이름을 제목으로 사용한 새 시트에 쿼리 결과를 저장합니다.
  • 쿼리 이름에 _AREA, _BAR, _COLUMN, _LINE, _SCATTER, _TABLE 서픽스를 추가하여 BigQuery 결과 시각화 시트에 지정된 유형의 새 차트를 생성합니다.
    • _AREA_STACKED, _BAR_STACKED, _COLUMN_STACKED 서픽스를 사용하여 스택 차트를 생성합니다.
  • 스프레드시트는 BARCOLUMN 유형 쿼리의 경우 최대 5개의 결과 행을 저장할 수 있으며, 나머지 모든 유형의 경우에는 최대 100개의 행을 저장할 수 있습니다. 쿼리 끝에 LIMIT 절을 추가하여(예: LIMIT 20) 반환되는 결과 행의 개수를 명시적으로 제한할 수 있습니다.
  • 시간순 차트를 그리려면 쿼리의 첫 번째 입력란을 타임스탬프 또는 날짜 값으로 설정합니다.

BigQuery로 데이터 스트리밍하기에 대해 자세히 알아보려면 다음을 참고하세요.

삭제

  1. 로컬 터미널에서 Ctrl+C 명령을 실행하여 Apache Bench 도구를 사용 중지합니다.

  2. 스크립트 편집기에서 리소스 > 현재 프로젝트 트리거를 선택하고 'runQueries' 트리거를 삭제하여 bq_query.gs 스크립트 자동 실행을 중지합니다.

  3. 데이터세트 삭제: BigQuery 웹 UI에서 프로젝트 이름 아래의 'bq_test' 데이터세트 위에 마우스 커서를 올리고 드롭다운 메뉴에서 데이터세트 삭제를 선택합니다.

  4. 다음 명령어로 Google Compute Engine 인스턴스를 삭제합니다.

    gcloud compute instances delete bq-test-instance --zone=us-central1-a
    
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...