OpenTSDB를 사용하여 시계열 데이터 모니터링

이 가이드에서는 GKE(Google Kubernetes Engine)Cloud Bigtable에서 실행되는 OpenTSDB를 사용하여 GCP(Google Cloud Platform)에서 시계열 데이터를 수집, 기록, 모니터링하는 방법을 설명합니다.

시계열 데이터는 추세 분석, 모니터링, 머신러닝을 비롯한 여러 앱에 사용할 수 있는 매우 중요한 애셋입니다. 시계열 데이터는 서버 인프라, 앱 코드, 기타 소스로부터 생성할 수 있습니다. OpenTSDB는 높은 세분성 수준으로 대량의 시계열 데이터를 수집하고 유지할 수 있습니다.

이 가이드에서는 GKE를 사용해서 확장 가능한 데이터 수집 계층을 만들고 Cloud Bigtable을 사용해서 수집된 데이터를 활용하는 방법을 설명합니다. 다음 다이어그램은 이 솔루션의 아키텍처를 개략적으로 보여줍니다.

GCP에서 TSDB를 사용하기 위한 이 가이드 솔루션의 개략적인 아키텍처 다이어그램

목표

  • 새로운 Cloud Bigtable 인스턴스를 만듭니다.
  • 새로운 GKE 클러스터를 만듭니다.
  • GKE 클러스터에 OpenTSDB를 배포합니다.
  • 시계열 측정항목을 OpenTSDB에 전송합니다.
  • OpenTSDB 및 Grafana를 사용하여 측정항목을 시각화합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 GCP 구성요소를 사용합니다.

  • Compute Engine
  • GKE
  • Cloud Bigtable
  • Cloud Storage

가격 계산기를 사용하면 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다.

새 GCP 사용자는 무료 평가판을 사용할 수 있습니다.

시작하기 전에

  1. Google 계정에 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Select or create a Google Cloud Platform project.

    Go to the Manage resources page

  3. 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

  4. Cloud Bigtable, Cloud Bigtable Admin, Compute Engine, Google Kubernetes Engine APIs를 사용 설정합니다.

    APIs 사용 설정

나중에 사용할 수 있도록 프로젝트 ID를 기록해두세요.

환경 준비

이 가이드에서는 Cloud Shell을 사용하여 명령어를 입력합니다. Cloud Shell은 GCP 콘솔의 명령줄에 대한 액세스를 제공하며 GCP 개발에 필요한 Cloud SDK 및 기타 도구를 포함합니다. Cloud Shell은 GCP 콘솔 아래에 창으로 표시됩니다. 초기화되는 데 몇 분 정도 걸릴 수 있지만 창은 즉시 표시됩니다.

  1. Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

  2. Cloud Bigtable 클러스터를 만들려는 영역을 기본 Compute Engine 영역으로 설정합니다(예: us-central1-f).

    gcloud config set compute/zone us-central1-f
    
  3. 샘플 코드가 포함된 git 저장소를 복제합니다.

    git clone https://github.com/GoogleCloudPlatform/opentsdb-bigtable.git
    
  4. 샘플 코드 디렉토리로 이동합니다.

    cd opentsdb-bigtable
    

Cloud Bigtable 인스턴스 만들기

이 가이드에서는 Cloud Bigtable을 사용하여 개발자가 수집하는 시계열 데이터를 저장합니다. 이렇게 하려면 Cloud Bigtable 인스턴스를 만들어야 합니다.

Cloud Bigtable은 시계열 데이터를 위한 Cloud Bigtable 스키마 디자인에 설명된 대로 특히 시계열 데이터에 효과적인 키/와이드 칼럼 저장소입니다. Cloud Bigtable은 OpenTSDB와 같이 Apache HBase에서 작동하도록 디자인된 소프트웨어를 쉽게 사용할 수 있게 해주는 HBase API를 지원합니다. OpenTSDB 문서에서 OpenTSDB에서 사용되는 HBase 스키마에 대해 알아볼 수 있습니다.

OpenTSDB의 핵심 구성요소는 완전 비동기, 비차단, 스레드에 안전한 방식으로 HBase에 대한 대량 쓰기를 사용 설정하는 AsyncHBase 클라이언트입니다. Cloud Bigtable에서 OpenTSDB를 사용할 때 AsyncHBase는 AsyncBigtable 클라이언트로 구현됩니다.

Cloud Bigtable의 핵심 기능은 요구에 맞게 쉽게 확장할 수 있는 능력입니다. 이 가이드에서는 이 작업에 충분하고 경제적인 단일 노드 개발 클러스터가 사용됩니다. 개발 클러스터에서 프로젝트를 시작하고 프로덕션 데이터를 작업할 준비가 되었으면 더 큰 프로덕션 클러스터로 이전합니다. Cloud Bigtable 문서에는 작업에 맞춰 클러스터 크기를 선택할 수 있게 해주는 성능 및 확장 관련 정보가 포함되어 있습니다.

Cloud Bigtable 인스턴스를 만들려면 다음 단계를 따르세요.

  1. GCP 콘솔에서 인스턴스 만들기 페이지로 이동합니다.

    인스턴스 만들기 페이지로 이동

  2. 인스턴스 이름 상자에 인스턴스 이름을 입력합니다. OpenTSDB instance 또는 원하는 다른 이름을 사용할 수 있습니다. 인스턴스 이름을 입력한 후 페이지에서 인스턴스 ID클러스터 ID가 자동으로 설정됩니다.

  3. 인스턴스 유형개발로 설정합니다.

  4. 영역에서 us-central1-f를 선택하거나 OpenTSDB를 실행하려는 영역을 선택합니다.

  5. 만들기를 클릭하여 인스턴스를 만듭니다.

인스턴스 ID영역 값을 기록해두세요. 이 값은 나중에 필요합니다.

GKE 클러스터 만들기

GKE는 관리형 Kubernetes 환경을 제공합니다. GKE 클러스터를 만든 후에는 여기에 Kubernetes 포드를 배포할 수 있습니다. 이 가이드에서는 GKE와 Kubernetes 포드를 사용하여 OpenTSDB를 실행합니다.

OpenTSDB는 애플리케이션 계층에서 저장소를 분리하여, 여러 인스턴스 간에 동시에 배포할 수 있게 해줍니다. 병렬로 실행하면 대량의 시계열 데이터를 처리할 수 있습니다. OpenTSDB를 Docker 컨테이너에 패키징하면 GKE를 사용해서 대규모로 쉽게 배포할 수 있습니다.

다음 명령어를 실행하여 Kubernetes 클러스터를 만듭니다. 이 작업은 완료하는 데 몇 분 정도 걸릴 수 있습니다.

gcloud container clusters create opentsdb-cluster --scopes \
"https://www.googleapis.com/auth/bigtable.admin",\
"https://www.googleapis.com/auth/bigtable.data"

GKE 클러스터에 2개의 범위를 추가하면 OpenTSDB 컨테이너가 Cloud Bigtable과 상호작용할 수 있습니다. 클러스터가 기본적으로 Cloud Storage를 읽을 수 있기 때문에 Cloud Storage에 대한 범위를 추가하지 않고도 Google Container Registry에서 이미지를 가져올 수 있습니다. 다른 배포에서는 추가 범위가 필요할 수 있습니다.

이 가이드의 나머지에서는 Container Registry에 있는 사전 빌드된 컨테이너인 gcr.io/cloud-solutions-images/opentsdb-bigtable:v1이 사용됩니다. 컨테이너 빌드를 위해 사용된 DockerfileENTRYPOINT 스크립트는 가이드 저장소의 build 폴더에 있습니다.

구성 세부정보로 ConfigMap 만들기

Kubernetes는 앱의 이식성을 높이기 위해 컨테이너 이미지에서 구성 세부정보를 분리하는 ConfigMap이라는 메커니즘을 제공합니다. OpenTSDB 구성은 opentsdb.conf에 지정됩니다. opentsdb.conf가 있는 ConfigMap은 샘플 코드에 포함되어 있습니다. 인스턴스 세부정보를 반영하도록 이를 편집해야 합니다.

ConfigMap 만들기

인스턴스를 만들 때 사용한 프로젝트 이름, 인스턴스 식별자, 영역을 사용하도록 OpenTSDB 구성을 편집합니다.

  1. Cloud Shell에 내장된 코드 편집기를 열기 위해 Cloud Shell 창 위에 있는 도구 모음에서 연필 아이콘을 클릭합니다.

  2. opentsdb/configmaps 아래의 opentsdb-config.yaml을 선택하여 편집기에서 엽니다.

  3. 자리표시자 텍스트를 이 가이드의 초반부에 설정한 프로젝트 이름, 인스턴스 식별자, 영역으로 바꿉니다.

  4. Cloud Shell 프롬프트에서 업데이트된 opentsdb-config.yaml로부터 ConfigMap을 만듭니다.

    kubectl create -f configmaps/opentsdb-config.yaml
    

Cloud Bigtable에서 OpenTSDB 테이블 만들기

OpenTSDB를 사용하여 데이터를 읽거나 쓰려면 먼저 데이터를 저장하기 위해 Cloud Bigtable에서 필요한 테이블을 만들어야 합니다. 다음 단계에 따라 테이블을 만드는 Kubernetes 작업을 만듭니다.

  1. 작업을 시작합니다.

    kubectl create -f jobs/opentsdb-init.yaml
    
  2. 작업이 완료되려면 1분 이상 걸릴 수 있습니다. 다음 명령어를 주기적으로 실행하여 작업이 성공적으로 완료되었는지 확인합니다.

    kubectl describe jobs
    

    출력에는 Pods Statuses 제목 아래에 하나의 작업이 성공한 것으로 나타납니다.

  3. 다음 명령어를 실행하여 테이블 만들기 작업 로그를 가져옵니다.

    pods=$(kubectl get pods  --show-all --selector=job-name=opentsdb-init \
    --output=jsonpath={.items..metadata.name})
    
    kubectl logs $pods
    

로그를 가져올 때는 생성된 각 테이블을 나타내는 출력 하단을 조사합니다. 이 작업은 여러 개의 테이블 만들기 명령어를 실행하며, 이러한 각 명령에는 create 'TABLE_NAME' 형식이 사용됩니다. 0 row(s) in 0.0000 seconds 형식의 줄을 찾습니다. 여기에는 0.0000 대신 실제 명령어 기간이 나열됩니다.

출력에는 다음과 비슷한 섹션이 포함됩니다.

create 'tsdb-uid',
  {NAME => 'id', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'},
  {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 1.3680 seconds

Hbase::Table - tsdb-uid

create 'tsdb',
  {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 0.6570 seconds

Hbase::Table - tsdb

create 'tsdb-tree',
  {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 0.2670 seconds

Hbase::Table - tsdb-tree

create 'tsdb-meta',
  {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 0.5850 seconds

Hbase::Table - tsdb-meta

이 작업은 한 번만 실행하면 됩니다. 테이블이 존재할 경우 오류 메시지가 반환됩니다. 테이블이 있으면 기존 테이블을 사용해서 가이드를 계속할 수 있습니다.

데이터 모델

바로 전에 만든 테이블에는 OpenTSDB의 데이터 포인트가 저장됩니다. 나중에 이 테이블에 시계열 데이터를 기록하게 됩니다. 시계열 데이터 포인트는 다음과 같이 구성되고 저장됩니다.

필드 필수 설명
metric 필수 측정되는 항목 - 기본 키 sys.cpu.user
timestamp 필수 측정의 에포크 시간 1497561091
value 필수 측정 값 89.3
태그 하나 이상의 태그가 필요함 쿼리 목적에 맞게 측정을 제한합니다.

hostname=www

cpu=0

env=prod

OpenTSDB 배포

이 가이드의 나머지에서는 샘플 시나리오 작업을 위한 안내를 제공합니다. 다음 다이어그램은 여기에서 사용되는 아키텍처를 보여줍니다.

시계열 데이터를 쓰고, 읽고, 시각화하기 위해 이 가이드에서 사용된 아키텍처 다이어그램

이 가이드에서는 2개의 Kubernetes 배포가 사용됩니다. 하나의 배포는 OpenTSDB에 측정항목을 전송하고 다른 배포는 이를 읽습니다. 2개의 배포를 사용하면 장기적으로 실행되는 읽기 및 쓰기로 인해 서로가 차단되지 않도록 방지합니다. 각 배포의 포드는 동일한 컨테이너를 사용합니다. OpenTSDB는 각 컨테이너에서 실행되는 tsd라는 데몬을 제공합니다.

단일 tsd 프로세스는 초당 이벤트 처리량이 높습니다. 부하 분산을 위해 이 가이드의 각 배포는 읽기 및 쓰기 포드의 복제본을 3개 만듭니다.

측정항목 쓰기를 위한 배포 만들기

작성자 배포를 위한 구성 정보는 가이드 저장소의 deployments 폴더에 있는 opentsdb-write.yaml에 있습니다. 다음 명령어를 사용하여 만드세요.

kubectl create -f deployments/opentsdb-write.yaml

측정항목 읽기를 위한 배포 만들기

판독자 배포를 위한 구성 정보는 가이드 저장소의 deployments 폴더에 있는 opentsdb-read.yaml에 있습니다. 다음 명령어를 사용하여 만드세요.

kubectl create -f deployments/opentsdb-read.yaml

프로덕션 배포에서는 수동으로 또는 Kubernetes의 자동 확장을 사용해서 실행되는 tsd 포드 수를 늘릴 수 있습니다. 이와 비슷하게, GKE 클러스터에서 수동으로 또는 클러스터 자동 확장 처리를 사용하여 인스턴스 수를 늘릴 수 있습니다.

OpenTSDB 서비스 만들기

배포에 일관적인 네트워크 연결 기능을 제공하기 위해 2개의 Kubernetes 서비스를 만듭니다. 한 서비스는 OpenTSDB에 측정항목을 쓰고, 다른 하나는 이를 읽습니다.

측정항목 쓰기를 위한 서비스 만들기

측정항목 쓰기 서비스를 위한 구성 정보는 가이드 저장소의 services 폴더에 있는 opentsdb-write.yaml에 포함되어 있습니다. 다음 명령어를 사용하여 서비스를 만듭니다.

kubectl create -f services/opentsdb-write.yaml

이 서비스는 GKE 클러스터 내에 생성되며, 클러스터에서 실행 중인 다른 서비스에서 액세스할 수 있습니다. 이 가이드의 다음 섹션에서는 이 서비스에 측정항목을 기록합니다.

측정항목 읽기를 위한 서비스 만들기

측정항목 읽기 서비스를 위한 구성 정보는 가이드 저장소의 services 폴더에 있는 opentsdb-read.yaml에 포함되어 있습니다. 다음 명령어를 사용하여 서비스를 만듭니다.

kubectl create -f services/opentsdb-read.yaml

OpenTSDB에 시계열 데이터 쓰기

OpenTSDB에 데이터를 쓰기 위한 메커니즘은 여러 가지가 있습니다. 서비스 엔드포인트를 정의한 후에는 프로세스가 데이터 쓰기를 시작하도록 지시할 수 있습니다. 이 가이드에서는 Heapster를 사용하여 데이터 쓰기를 보여줍니다. Heapster 배포는 GKE에 대한 데이터를 수집하고 OpenTSDB를 실행 중인 GKE 클러스터에서 측정항목을 게시합니다.

다음 명령어를 사용하여 클러스터에 Heapster를 배포하세요.

kubectl create -f deployments/heapster.yaml

OpenTSDB에서 시계열 데이터 검사

이 가이드의 앞부분에서 배포한 opentsdb-read 서비스 엔드포인트를 사용하여 시계열 측정항목을 쿼리할 수 있습니다. 이 데이터는 다양한 방법으로 사용할 수 있습니다. 한 가지 일반적인 옵션은 이를 시각화하는 것입니다. OpenTSDB에는 수집하는 측정항목을 시각화하기 위한 기본 인터페이스가 포함되어 있습니다. 이 가이드에서는 측정항목을 시각화하기 위한 일반적인 대안이며 추가 기능을 제공하는 Grafana를 사용합니다.

Grafana 설정

클러스터에서 Grafana를 실행하기 위해서는 OpenTSDB를 설정할 때와 비슷한 프로세스가 필요합니다. ConfigMap과 배포를 만드는 것 외에도 GKE 클러스터에서 실행되는 동안 Grafana에 액세스할 수 있도록 포트 전달을 구성해야 합니다.

다음 단계에 따라 Grafana를 설정합니다.

  1. 가이드 저장소의 configmaps 폴더에 있는 grafana.yaml의 구성 정보를 사용해서 Grafana ConfigMap을 만듭니다.

    kubectl create -f configmaps/grafana.yaml
    
  2. 가이드 저장소의 deployments 폴더에 있는 grafana.yaml의 구성 정보를 사용해서 Grafana 배포를 만듭니다.

    kubectl create -f deployments/grafana.yaml
    
  3. 클러스터에서 Grafana 포드 이름을 가져오고 이를 사용해서 포트 전달을 설정합니다.

    grafana=$(kubectl get pods --show-all --selector=app=grafana \
      --output=jsonpath={.items..metadata.name})
    
    kubectl port-forward $grafana 8080:3000
    
  4. 전달이 성공했는지 확인합니다. 출력은 다음과 일치해야 합니다.

    Forwarding from 127.0.0.1:8080 -> 3000
    Forwarding from [::1]:8080 -> 3000
    

Grafana 웹 인터페이스에 연결

Cloud Shell에서 웹 미리보기를 클릭한 후 포트 8080에서 미리보기를 선택합니다.

새 브라우저 탭이 열리고 Grafana 웹 인터페이스에 연결됩니다. 잠시 후 브라우저에 다음과 비슷한 그래프가 표시됩니다.

Grafana 시각화 예

이 Grafana 배포는 이 가이드에 맞게 맞춤설정되어 있습니다. configmaps/grafana.yamldeployments/grafana.yaml 파일은 opentsdb-read 서비스에 연결하고, 익명 인증을 허용하고, 일부 기본 클러스터 측정항목을 표시하도록 Grafana를 구성합니다. 프로덕션에서 Grafana 배포는 적절한 인증 메커니즘을 구현하고 더 다양한 시계열 그래프를 사용합니다.

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

  1. kubectl create 명령어를 사용해서 이전에 만든 모든 아티팩트를 종료하도록 GKE 클러스터를 삭제합니다.

    gcloud container clusters delete opentsdb-cluster

    GKE 클러스터를 삭제하기 위해 Y를 입력하거나 Enter를 눌러서 확인합니다.

  2. Cloud Bigtable 클러스터를 삭제하기 위해 Google Cloud Platform 콘솔에서 제품 및 서비스를 클릭합니다. Bigtable을 클릭하고 이전에 만든 클러스터를 선택하고 삭제를 클릭합니다.

다음 단계

  • OpenTSDB 사용 성능을 향상시키기 위해 시계열 데이터를 위한 Cloud Bigtable 스키마 디자인을 참조합니다.

  • Google Cloud Next 17에서 제작한 동영상 Cloud Bigtable in Action에서 필드 프로모션 및 기타 성능 고려 사항을 확인합니다.

  • GKE 클러스터를 위한 클러스터 범위에 대한 문서에서 Cloud Storage와 같은 기본 범위 및 다른 Google 서비스에 추가할 수 있는 범위 관련 설명을 확인합니다.

  • 다른 Google Cloud Platform 기능을 직접 사용해 봅니다. 가이드를 참조하세요.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

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