Os dados de série temporal são um recurso altamente valioso usado em diversos aplicativos, incluindo tendências, monitoramento e aprendizado de máquina. Você gera esses dados a partir da infraestrutura do servidor, código do aplicativo e outras origens. O OpenTSDB coleta e retém grandes quantidades de dados de série temporal com um alto grau de granularidade.
Neste guia, mostramos aos engenheiros de software e arquitetos como criar uma camada de coleção escalonável para dados de série temporal usando o GKE. Também mostramos como trabalhar com os dados coletados usando o Bigtable. Neste guia, presumimos que você tenha familiaridade com o Kubernetes e o Bigtable.
O diagrama a seguir mostra a arquitetura geral deste guia:
O diagrama anterior mostra várias fontes de dados de série temporal, como eventos de IoT e métricas do sistema, que são armazenadas no Bigtable usando o OpenTSDB implantado no GKE.
Objetivos
- Crie imagens de contêiner usadas neste guia usando o Cloud Build.
- Gerencie essas imagens de contêiner usando o Artifact Registry.
- Criar uma instância do Bigtable.
- Crie um cluster do GKE.
- Implantar o OpenTSDB no cluster do GKE.
- Enviar métricas de série temporal para o OpenTSDB.
- Visualizar métricas usando o OpenTSDB e o Grafana.
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.
Antes de começar
-
No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
-
Ative as APIs Bigtable, Bigtable Admin, GKE, Compute Engine, Cloud Build, and Artifact Registry.
No console do Google Cloud, acesse a página de Boas-vindas.
Acessar a página de boas-vindas
Anote o ID do projeto porque ele será usado posteriormente.
-
No Console do Google Cloud, ative o Cloud Shell.
Criar uma instância do Bigtable
Neste guia, o Bigtable é usado para armazenar os dados de série temporal coletados. Portanto, é necessário criar uma instância do Bigtable.
O Bigtable é um armazenamento de chave/coluna larga que funciona bem para dados de série temporal. O Bigtable aceita a API HBase, por isso é possível usar um software projetado para funcionar com o Apache HBase, como o OpenTSDB. Para mais informações sobre o esquema do HBase usado pelo OpenTSDB, consulte o Esquema do HBase.
O principal componente do OpenTSDB é o cliente AsyncHBase, que permite gravar em massa para HBase de maneira totalmente assíncrona, sem bloqueios e thread-safe. Quando você usa o OpenTSDB com o Bigtable, o AsyncHBase é implementado como cliente AsyncBigtable.
Neste guia, usamos uma instância do Bigtable com um cluster de nó único. Ao mudar para um ambiente de produção, use instâncias do Bigtable com clusters maiores. Para mais informações sobre como escolher um tamanho de cluster, consulte Noções básicas sobre o desempenho do Bigtable.
No Cloud Shell, defina as variáveis de ambiente para a zona do Google Cloud em que você criará o cluster do Bigtable e o cluster do GKE e o identificador de instância do cluster do Bigtable:
export BIGTABLE_INSTANCE_ID=BIGTABLE_INSTANCE_ID export ZONE=ZONE
Substitua:
BIGTABLE_INSTANCE_ID
: o identificador da instância do Bigtable.ZONE
: a zona em que o cluster do Bigtable e o do GKE serão criados;
O comando será semelhante ao seguinte exemplo:
export BIGTABLE_INSTANCE_ID=bt-opentsdb export ZONE=us-central1-f
Crie a instância do Bigtable:
gcloud bigtable instances create ${BIGTABLE_INSTANCE_ID} \ --cluster-config=id=${BIGTABLE_INSTANCE_ID}-${ZONE},zone=${ZONE},nodes=1 \ --display-name=OpenTSDB
Criar as imagens usadas para implantar e testar o OpenTSDB
Para implantar e demonstrar o OpenTSDB com um back-end de armazenamento do Bigtable, este guia usa uma série de imagens de contêiner do Docker implantadas no GKE. Você cria várias dessas imagens usando código de um repositório GitHub correspondente com o Cloud Build. Ao implantar a infraestrutura no GKE, é usado um repositório de contêineres. Neste guia, você usa o Artifact Registry para gerenciar essas imagens de contêiner.
No Cloud Shell, defina as variáveis de ambiente para a zona do Google Cloud em que você criará o repositório do Artifact Registry:
export PROJECT_ID=PROJECT_ID export REGION=REGION export AR_REPO=AR_REPO
Substitua:
PROJECT_ID
: o ID do projetoREGION
: a região em que o repositório do Artifact Registry será criadoAR_REPO
: o nome do repositório do Artifact Registry
O comando será semelhante ao seguinte exemplo:
export PROJECT_ID=bt-opentsdb-project-id export REGION=us-central1 export AR_REPO=opentsdb-bt-repo
Crie um repositório do Artifact Registry:
gcloud artifacts repositories create ${AR_REPO} \ --repository-format=docker \ --location=${REGION} \ --description="OpenTSDB on bigtable container images"
Criar e gerenciar as imagens usadas para implantar e demonstrar o OpenTSDB
São usadas duas imagens de contêiner do Docker neste guia. A primeira imagem é usada para dois objetivos: executar a configuração única de banco de dados do Bigtable para o OpenTSDB e implantar contêineres de serviço de leitura e gravação para a implantação do OpenTSDB. A segunda imagem é usada para gerar dados de métrica de amostra para demonstrar sua implantação do OpenTSDB.
Ao enviar o job de compilação de imagens de contêiner para o Cloud Build, você marca as imagens para que elas sejam armazenadas no Artifact Registry depois de serem criadas.
No Cloud Shell, clone o repositório do GitHub que contém o código de acompanhamento:
git clone https://github.com/GoogleCloudPlatform/opentsdb-bigtable.git
Acesse o diretório do código de amostra:
cd opentsdb-bigtable
Defina as variáveis de ambiente para a imagem do servidor OpenTSDB que usa o Bigtable como back-end de armazenamento:
export SERVER_IMAGE_NAME=opentsdb-server-bigtable export SERVER_IMAGE_TAG=2.4.1
Crie a imagem usando o Cloud Build:
gcloud builds submit \ --tag ${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO}/${SERVER_IMAGE_NAME}:${SERVER_IMAGE_TAG} \ build
Como a imagem foi marcada corretamente, quando a versão for concluída, ela será gerenciada pelo repositório do Artifact Registry.
Defina as variáveis de ambiente para a imagem de geração de dados da série temporal de demonstração:
export GEN_IMAGE_NAME=opentsdb-timeseries-generate export GEN_IMAGE_TAG=0.1
Crie a imagem usando o Cloud Build:
cd generate-ts ./build-cloud.sh cd ..
Crie um cluster do GKE
O GKE contém um ambiente gerenciado do Kubernetes. Depois de criar um cluster do GKE, é possível implantar os pods do Kubernetes nele. Neste guia, usamos o GKE e os pods do Kubernetes para executar o OpenTSDB.
O OpenTSDB separa o armazenamento dele da camada de aplicativo, permitindo a implantação simultânea em várias instâncias. Durante a execução em paralelo, uma grande quantidade de dados de série temporal é processada pelo OpenTSDB.
No Cloud Shell, defina as variáveis de ambiente para a zona do Google Cloud em que você vai criar o cluster do Bigtable e o cluster do GKE, sendo que, para este último, você precisa também dar um nome e especificar o tipo de nó e a versão:
export GKE_CLUSTER_NAME=GKE_CLUSTER_NAME export GKE_VERSION=1.20 export GKE_NODE_TYPE=n1-standard-4
Substitua
GKE_CLUSTER_NAME
pelo nome do cluster do GKE.O comando será semelhante ao seguinte exemplo:
export GKE_CLUSTER_NAME=gke-opentsdb export GKE_VERSION=1.20 export GKE_NODE_TYPE=n1-standard-4
Crie um cluster do GKE:
gcloud container clusters create ${GKE_CLUSTER_NAME} \ --zone=${ZONE} \ --cluster-version=${GKE_VERSION} \ --machine-type ${GKE_NODE_TYPE} \ --scopes "https://www.googleapis.com/auth/cloud-platform"
Esta operação leva alguns minutos para ser concluída. A adição de escopos ao cluster do GKE permite que o contêiner do OpenTSDB interaja com o Bigtable e o Container Registry.
O restante deste guia usa os contêineres que você acabou de criar e são gerenciados pelo Artifact Registry. Os scripts Dockerfile e
entrypoint
usados para criar o contêiner estão localizados na pastabuild
do arquivo guia.Receba as credenciais para se conectar ao cluster do GKE:
gcloud container clusters get-credentials ${GKE_CLUSTER_NAME} --zone ${ZONE}
Criar um ConfigMap com detalhes de configuração
O Kubernetes usa
ConfigMap
para separar os detalhes de configuração da imagem do contêiner para tornar
os aplicativos mais portáteis. A configuração do OpenTSDB é especificada no
arquivo opentsdb.conf
. Um ConfigMap que contém o arquivo opentsdb.conf
está
incluído no código de amostra.
Nestas e nas próximas etapas, você usará o utilitário GNU envsubst
para substituir
marcadores de variáveis de ambiente nos arquivos de modelo YAML pelos respectivos
valores para a implantação.
Crie um ConfigMap do arquivo
opentsdb-config.yaml
atualizado:envsubst < configmaps/opentsdb-config.yaml.tpl | kubectl create -f -
Criar tabelas do OpenTSDB no Bigtable
Antes de ler ou gravar dados com o OpenTSDB, é preciso criar tabelas no Bigtable para armazenar esses dados. Para criar as tabelas, crie um job do Kubernetes.
No Cloud Shell, inicie o job:
envsubst < jobs/opentsdb-init.yaml.tpl | kubectl create -f -
Este job leva alguns minutos para ser concluído. Verifique se o job foi concluído com sucesso:
kubectl describe jobs
A saída mostra que um job foi concluído quando
Pods Statuses
mostra1 Succeeded
.Examine os registros do job de criação de tabela:
OPENTSDB_INIT_POD=$(kubectl get pods --selector=job-name=opentsdb-init \ --output=jsonpath={.items..metadata.name}) kubectl logs $OPENTSDB_INIT_POD
A resposta será semelhante a:
create 'tsdb-uid', {NAME => 'id', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}, {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'} 0 row(s) in 3.2730 seconds create 'tsdb', {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'} 0 row(s) in 1.8440 seconds create 'tsdb-tree', {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'} 0 row(s) in 1.5420 seconds create 'tsdb-meta', {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'} 0 row(s) in 1.9910 seconds
A resposta lista cada tabela que foi criada. Este job executa vários comandos de criação de tabela, cada um usando o formato
create TABLE_NAME
. As tabelas são criadas com sucesso quando você tem saída na forma de0 row(s) in TIME seconds
.TABLE_NAME
: o nome da tabela criada pelo job.TIME
: o tempo necessário para criar a tabela
Modelo de dados
As tabelas que você criou armazenam pontos de dados do OpenTSDB. Em uma etapa posterior, você gravará dados de série temporal nessas tabelas. Os pontos de dados de série temporal são organizados e armazenados da seguinte forma:
Campo | Obrigatório | Descrição | Exemplo |
---|---|---|---|
metric
|
Obrigatório | Item a ser avaliado - a chave padrão |
sys.cpu.user
|
timestamp
|
Obrigatório | Tempo Unix epoch da medição | 1497561091 |
tags
|
Adicione pelo menos uma tag | Qualifica a avaliação para fins de consulta |
hostname=www
cpu=0
env=prod
|
value
|
Obrigatório | Valor de avaliação | 89,3 |
A métrica, o carimbo de data/hora e as tags (chave de tag e valor da tag) formam a chave de linha. O carimbo de data/hora é normalizado em uma hora para garantir que uma linha não contenha muitos pontos de dados. Para mais informações, consulte Esquema do HBase.
Implantar o OpenTSDB
O diagrama a seguir mostra a arquitetura de implantação do OpenTSTB com os serviços em execução no GKE e com o Bigtable como back-end de armazenamento:
Neste guia, usamos duas implantações
do OpenTSDB do Kubernetes:
uma implantação envia métricas para o Bigtable e a outra faz a leitura da
implantação. O uso de duas implantações evita que as leituras e gravações longas
bloqueiem uma à outra. A mesma imagem do contêiner é usado pelos pods em cada implantação.
O OpenTSDB fornece um daemon
chamado tsd
que é executado em cada contêiner. Um único processo tsd
pode processar uma alta capacidade
de eventos a cada segundo. Para distribuir a carga, cada implantação neste guia
cria três réplicas dos pods de leitura e gravação.
No Cloud Shell, crie uma implantação para gravar métricas:
envsubst < deployments/opentsdb-write.yaml.tpl | kubectl create -f -
As informações de configuração para implantação de gravação estão no arquivo
opentsdb-write.yaml.tpl
na pastadeployments
do repositório do guia.Criar uma implantação para métricas de leitura:
envsubst < deployments/opentsdb-read.yaml.tpl | kubectl create -f -
As informações de configuração para implantação do leitor estão no arquivo
opentsdb-read.yaml.tpl
na pastadeployments
do repositório do guia.
Em uma implantação de produção, é possível aumentar o número de pods tsd
em execução,
seja manualmente ou usando
o escalonamento automático
no Kubernetes. Da mesma forma, é possível aumentar o número de instâncias no cluster
do GKE manualmente ou usando
o Escalonador automático de cluster.
Criar os serviços do OpenTSDB
Para fornecer conectividade de rede consistente às implantações, crie dois serviços do Kubernetes: um serviço grava métricas no OpenTSDB e o outro faz leituras.
No Cloud Shell, crie o serviço para gravar métricas:
kubectl create -f services/opentsdb-write.yaml
As informações de configuração para o serviço de gravação de métricas estão contidas no arquivo
opentsdb-write.yaml
na pastaservices
do repositório do guia. Esse serviço é criado dentro do cluster do Kubernetes e pode ser acessado por outros serviços em execução no cluster.Criar o serviço para ler métricas:
kubectl create -f services/opentsdb-read.yaml
As informações de configuração para o serviço de leitura de métricas estão contidas no arquivo
opentsdb-read.yaml
na pastaservices
do repositório do guia.
Gravar dados de série temporal no OpenTSDB
Há vários mecanismos para gravar dados no OpenTSDB. Depois de definir os pontos de extremidade do serviço, você pode direcionar os processos para começar a gravar dados neles. Este guia implanta um serviço Python que emite dados demonstrativos de séries temporais para duas métricas: Cluster Memory Utilization (memory_usage_gauge
) e Cluster CPU Utilization
(cpu_node_utilization_gauge
).
No Cloud Shell, implante o gerador de métricas de série temporal no cluster:
envsubst < deployments/generate.yaml.tpl | kubectl create -f -
Examinar os dados de exemplo de série temporal com o OpenTSDB
É possível consultar métricas de série temporal usando o ponto de extremidade do serviço opentsdb-read
implantado anteriormente no guia. É possível usar os dados de várias maneiras.
Uma opção comum é visualizar. O OpenTSDB inclui uma interface básica para
visualizar as métricas coletadas. Neste guia, você aprende a usar o Grafana, uma alternativa conhecida para visualização de métricas que inclui funcionalidades complementares.
A execução do Grafana no cluster requer um processo semelhante usado para configurar o OpenTSDB. Além de criar um ConfigMap e uma implantação, você precisa configurar o encaminhamento de portas para poder acessar o Grafana enquanto ele estiver em execução no seu cluster do Kubernetes.
No Cloud Shell, crie o ConfigMap do Grafana usando as informações de configuração no arquivo
grafana.yaml
na pastaconfigmaps
do repositório do guia:kubectl create -f configmaps/grafana.yaml
Crie a implantação do Grafana usando as informações de configuração no arquivo
grafana.yaml
na pastadeployments
do repositório do guia:kubectl create -f deployments/grafana.yaml
Receba o nome do pod do Grafana no cluster e use-o para configurar o encaminhamento de portas.
GRAFANA_PODS=$(kubectl get pods --selector=app=grafana \ --output=jsonpath={.items..metadata.name}) kubectl port-forward $GRAFANA_PODS 8080:3000
Verifique se o encaminhamento foi bem-sucedido. A resposta será semelhante a:
Forwarding from 127.0.0.1:8080 -> 3000
Para se conectar à interface da Web do Grafana, no Cloud Shell, clique em Visualização na Web e selecione Visualizar na porta 8080.
Para mais informações, consulte Como usar a visualização da Web.
Uma nova guia do navegador é aberta e conectada à interface da Web do Grafana. Depois de alguns instantes, o navegador exibe gráficos semelhantes a este:
Esta implantação do Grafana foi personalizada para este guia. Os arquivos
configmaps/grafana.yaml
edeployments/grafana.yaml
configuram o Grafana para se conectar ao serviçoopentsdb-read
, permitir autenticação anônima e exibir algumas métricas básicas do cluster. Para a implantação do Grafana em um ambiente de produção, implemente os mecanismos de autenticação adequados e use gráficos de série temporal mais avançados.
Limpeza
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.
Excluir recursos individuais
Exclua o cluster do Kubernetes para excluir todos os artefatos criados:
gcloud container clusters delete GKE_CLUSTER_NAME
Para excluir o cluster do Kubernetes, confirme digitando
Y
.Para excluir a instância do Bigtable, faça o seguinte:
No Console do Google Cloud, acesse o Bigtable.
Selecione a instância que você criou anteriormente e clique em Excluir instância.
Exclua o projeto
- No Console do Google Cloud, acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
A seguir
- Para saber como melhorar o desempenho de uso do OpenTSDB, consulte o Design do esquema do Bigtable para dados de série temporal.
- Para saber como migrar do HBase para o Bigtable, consulte Como migrar dados do HBase para o Bigtable.
- No vídeo Bigtable em ação do Google Cloud Next 17, descrevemos a promoção de campo, uma importante melhoria de desempenho.
- Para saber mais sobre escopos padrão para clusters do GKE, consulte escopos do cluster.
- Confira arquiteturas de referência, diagramas e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.