时序数据是一项非常宝贵的资产,可用于趋势、监控和机器学习等各种应用。您可以基于服务器基础架构、应用代码和其他来源生成时间序列数据。OpenTSDB 可收集和保留大量具有高粒度级的时间序列数据。
本指南介绍如何使用 GKE 为时序数据创建可扩缩的集合层。此外还展示了如何使用 Bigtable 处理收集的数据。本指南假定您熟悉 Kubernetes 和 Bigtable。
下图显示了本指南的高级架构:
上图显示了使用 GKE 上部署的 OpenTSDB 存储在 Bigtable 中的多个时间序列数据(例如物联网事件和系统指标)。
目标
- 通过 Cloud Build 构建本指南中使用的容器映像。
- 使用 Artifact Registry 管理这些容器映像。
- 创建 Bigtable 实例。
- 创建 GKE 集群。
- 将 OpenTSDB 部署到 GKE 集群。
- 将时间序列指标发送到 OpenTSDB。
- 使用 OpenTSDB 和 Grafana 来直观显示指标。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
启用 Bigtable, Bigtable Admin, GKE, Compute Engine, Cloud Build, and Artifact Registry API。
在 Google Cloud 控制台中,转到欢迎页面。
记下项目 ID,因为后续步骤中会用到。
-
在 Google Cloud 控制台中,激活 Cloud Shell。
创建 Bigtable 实例
本指南使用 Bigtable 来存储您收集的时序数据,因此您必须创建 Bigtable 实例。
Bigtable 是一种键/宽列存储,适用于时间序列数据。Bigtable 支持 HBase API,因此您可以使用旨在处理 Apache HBase 的软件(例如 OpenTSDB)。如需详细了解 OpenTSDB 使用的 HBase 架构,请参阅 HBase 架构。
OpenTSDB 的一个关键组件是 AsyncHBase 客户端,它允许您以完全异步、非阻塞、线程安全的方式批量写入 HBase。当您结合使用 OpenTSDB 和 Bigtable 时,AsyncHBase 将以 AsyncBigtable 客户端的形式实现。
本指南使用具有单节点集群的 Bigtable 实例。迁移到生产环境时,请考虑将 Bigtable 实例用于大型集群。如需详细了解如何选择集群大小,请参阅了解 Bigtable 性能。
在 Cloud Shell 中,为您的 Google Cloud 可用区设置环境变量,您将在该可用区中创建 Bigtable 集群和 GKE 集群以及 Bigtable 集群的实例标识符:
export BIGTABLE_INSTANCE_ID=BIGTABLE_INSTANCE_ID export ZONE=ZONE
替换以下内容:
BIGTABLE_INSTANCE_ID
:Bigtable 实例的标识符。ZONE
:将在其中创建 Bigtable 集群和 GKE 集群的可用区。
该命令应类似于以下示例:
export BIGTABLE_INSTANCE_ID=bt-opentsdb export ZONE=us-central1-f
创建 Bigtable 实例:
gcloud bigtable instances create ${BIGTABLE_INSTANCE_ID} \ --cluster-config=id=${BIGTABLE_INSTANCE_ID}-${ZONE},zone=${ZONE},nodes=1 \ --display-name=OpenTSDB
创建用于部署和测试 OpenTSDB 的映像
为了部署和演示使用 Bigtable 存储后端的 OpenTSDB,本指南会使用一系列部署到 GKE 的 Docker 容器映像。您可以使用 Cloud Build 附带的 GitHub 代码库中的代码构建多个此类映像。将基础架构部署到 GKE 时,系统会使用容器代码库。在本指南中,您将使用 Artifact Registry 来管理这些容器映像。
在 Cloud Shell 中,为要在其中创建 Artifact Registry 代码库的 Google Cloud 可用区设置环境变量:
export PROJECT_ID=PROJECT_ID export REGION=REGION export AR_REPO=AR_REPO
替换以下内容:
PROJECT_ID
:您的项目 IDREGION
:将在其中创建 Artifact Registry 代码库的区域AR_REPO
:您的 Artifact Registry 代码库的名称
该命令应类似于以下示例:
export PROJECT_ID=bt-opentsdb-project-id export REGION=us-central1 export AR_REPO=opentsdb-bt-repo
创建 Artifact Registry 代码库:
gcloud artifacts repositories create ${AR_REPO} \ --repository-format=docker \ --location=${REGION} \ --description="OpenTSDB on bigtable container images"
创建和管理用于部署和演示 OpenTSDB 的映像
本指南使用两个 Docker 容器映像。第一个映像用于两个用途:为 OpenTSDB 执行一次性 Bigtable 数据库设置,以及为 OpenTSDB 部署部署读取和写入服务容器。第二个映像用于生成示例指标数据,以演示 OpenTSDB 部署。
将容器映像构建作业提交到 Cloud Build 时,您可以标记映像,以便在构建后存储在 Artifact Registry 中。
在 Cloud Shell 中,克隆包含附带代码的 GitHub 代码库:
git clone https://github.com/GoogleCloudPlatform/opentsdb-bigtable.git
转到示例代码目录:
cd opentsdb-bigtable
为使用 Bigtable 作为存储后端的 OpenTSDB 服务器映像设置环境变量:
export SERVER_IMAGE_NAME=opentsdb-server-bigtable export SERVER_IMAGE_TAG=2.4.1
使用 Cloud Build 构建映像:
gcloud builds submit \ --tag ${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO}/${SERVER_IMAGE_NAME}:${SERVER_IMAGE_TAG} \ build
由于您正确标记了映像,因此构建完成后,映像将由 Artifact Registry 代码库管理。
为演示时序数据生成映像设置环境变量:
export GEN_IMAGE_NAME=opentsdb-timeseries-generate export GEN_IMAGE_TAG=0.1
使用 Cloud Build 构建映像:
cd generate-ts ./build-cloud.sh cd ..
创建 GKE 集群
GKE 提供代管式 Kubernetes 环境。创建 GKE 集群后,您可以将 Kubernetes Pods 部署到该集群。本指南使用 GKE 和 Kubernetes Pod 来运行 OpenTSDB。
OpenTSDB 将其存储空间与应用层分开,因此可跨多个实例同时部署。通过并行运行,OpenTSDB 可以处理大量时间序列数据。
在 Cloud Shell 中,为要在其中创建 Bigtable 集群和 GKE 集群的 Google Cloud 可用区设置环境变量,并为 GKE 集群设置名称、节点类型和版本:
export GKE_CLUSTER_NAME=GKE_CLUSTER_NAME export GKE_VERSION=1.20 export GKE_NODE_TYPE=n1-standard-4
将
GKE_CLUSTER_NAME
替换为 GKE 集群的名称。该命令应类似于以下示例:
export GKE_CLUSTER_NAME=gke-opentsdb export GKE_VERSION=1.20 export GKE_NODE_TYPE=n1-standard-4
创建 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"
此操作可能需要几分钟才能完成。 通过将范围添加到 GKE 集群,您的 OpenTSDB 容器可以与 Bigtable 和 Container Registry 进行交互。
本指南的其余部分使用您刚刚构建的容器,这些容器由 Artifact Registry 管理。用于构建容器的 Dockerfile 和
entrypoint
脚本位于以下指南代码库的build
文件夹中。获取凭据,以便您可以连接到 GKE 集群:
gcloud container clusters get-credentials ${GKE_CLUSTER_NAME} --zone ${ZONE}
创建具有配置详情的 ConfigMap
Kubernetes 使用 ConfigMap 将配置详细信息与容器映像分离,以使应用更具可移植性。OpenTSDB 的配置在 opentsdb.conf
文件中指定。包含 opentsdb.conf
文件的 ConfigMap 随附在示例代码中。
在此步骤中和后续步骤中,您将使用 GNU envsubst
实用程序将 YAML 模板文件中的环境变量占位符替换为各自的部署值。
通过更新后的
opentsdb-config.yaml
文件创建 ConfigMap:envsubst < configmaps/opentsdb-config.yaml.tpl | kubectl create -f -
在 Bigtable 中创建 OpenTSDB 表
您需要在 Bigtable 中创建表来存储该数据,然后才能使用 OpenTSDB 读取或写入数据。 要创建表,您需要创建一项 Kubernetes 作业。
在 Cloud Shell 中,启动作业:
envsubst < jobs/opentsdb-init.yaml.tpl | kubectl create -f -
该作业可能需要 1 分钟或更长时间才能完成。验证作业是否成功完成:
kubectl describe jobs
输出显示
Pods Statuses
显示1 Succeeded
时,表示一个作业已成功完成。检查表创建作业日志:
OPENTSDB_INIT_POD=$(kubectl get pods --selector=job-name=opentsdb-init \ --output=jsonpath={.items..metadata.name}) kubectl logs $OPENTSDB_INIT_POD
输出内容类似如下:
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
输出列出了所创建的每个表。此作业运行多个表创建命令,每个命令均使用
create TABLE_NAME
格式。当您以0 row(s) in TIME seconds
格式输出时,已成功创建表。TABLE_NAME
:作业创建的表的名称TIME
:创建表的时间
数据模型
您创建的表来自 OpenTSDB 的数据点。在稍后的步骤中,您会将时间序列数据写入这些表中。时间序列数据点按如下形式进行整理和存储:
字段 | 必填 | 说明 | 示例 |
---|---|---|---|
metric
|
必需 | 要测量的项—默认键 |
sys.cpu.user
|
timestamp
|
必需 | 测量的 Unix 纪元时间 | 1497561091 |
tags
|
至少需要输入一个标记 | 允许出于查询目的进行测量 |
hostname=www
cpu=0
env=prod
|
value
|
必需 | 测量值 | 89.3 |
来自行键的指标、时间戳和标记(标记键和标记值)。时间戳会被归一化为一小时,以确保某一行包含的数据点数量不会过多。如需了解详情,请参阅 HBase 架构。
部署 OpenTSDB
下图展示了 OpenTSDB 部署架构,其服务在 GKE 上运行,并使用 Bigtable 作为存储后端:(译注:原英文 OpenTSTB 可能是 OpenTSDB 的笔误)
本指南使用两个 OpenTSDB Kubernetes 部署:一个部署向 Bigtable 发送指标,另一个部署从中读取指标。使用两个部署可防止长时间运行的读取和写入相互阻塞。每个部署中的 pod 都使用相同的映像。OpenTSDB 提供了一个名为 tsd
的守护进程,它在每个容器中运行。单个 tsd
进程每秒都可处理高吞吐量的事件。为分配负载,本指南中的每个部署都会创建三个读写 Pod 副本。
在 Cloud Shell 中,创建一个用于写入指标的部署:
envsubst < deployments/opentsdb-write.yaml.tpl | kubectl create -f -
写入部署的配置信息位于指南代码库的
deployments
文件夹的opentsdb-write.yaml.tpl
文件中。创建用于读取指标的部署:
envsubst < deployments/opentsdb-read.yaml.tpl | kubectl create -f -
读取器部署的配置信息位于指南代码库的
deployments
文件夹的opentsdb-read.yaml.tpl
文件中。
在生产部署中,您可以通过手动方式或在 Kubernetes 中使用自动扩缩功能以增加正在运行的 tsd
Pod 数量。同样地,您也可以手动或使用集群自动扩缩器增加 GKE 集群中的实例数。
创建 OpenTSDB 服务
为了向这些部署提供一致的网络连接,您需要创建两个 Kubernetes 服务:一个服务将指标写入 OpenTSDB,另一个读取操作。
在 Cloud Shell 中,创建用于写入指标的服务:
kubectl create -f services/opentsdb-write.yaml
指标写入服务的配置信息包含在指南代码库的
services
文件夹的opentsdb-write.yaml
文件中。此服务在您的 Kubernetes 集群内创建,可供集群中运行的其他服务访问。创建用于读取指标的服务:
kubectl create -f services/opentsdb-read.yaml
指标读取服务的配置信息包含在指南代码库的
services
文件夹的opentsdb-read.yaml
文件中。
将时序数据写入 OpenTSDB
您可以通过多种机制将数据写入 OpenTSDB。在定义服务端点后,您可以指示进程开始向这些端点写入数据。本指南部署一项 Python 服务,该服务发出两个指标的演示时序数据:集群内存利用率 (memory_usage_gauge
) 和集群 CPU 利用率 (cpu_node_utilization_gauge
)。
在 Cloud Shell 中,将时序指标生成器部署到您的集群:
envsubst < deployments/generate.yaml.tpl | kubectl create -f -
使用 OpenTSDB 检查示例时序数据
您可以使用本指南前面部署的 opentsdb-read
服务端点来查询时序指标。您可以通过多种方式使用数据。常见的一种方式是直观显示它。OpenTSDB 附带一个基本界面,用于直观显示其收集到的指标。本指南使用的是 Grafana,它是一种直观显示指标的常用替代方案,同时还提供其他功能。
在集群中运行 Grafana,需要一个与设置 OpenTSDB 类似的过程。除了创建 ConfigMap 和部署之外,您还需要配置端口转发,以便当 Grafana 在 Kubernetes 集群中运行时对其进行访问。
在 Cloud Shell 中,使用指南代码库的
configmaps
文件夹的grafana.yaml
文件中的配置信息创建 Grafana ConfigMap:kubectl create -f configmaps/grafana.yaml
使用指南代码库的
deployments
文件夹的grafana.yaml
文件中的配置信息创建 Grafana 部署:kubectl create -f deployments/grafana.yaml
获取集群中 Grafana pod 的名称,并用它来设置端口转发。
GRAFANA_PODS=$(kubectl get pods --selector=app=grafana \ --output=jsonpath={.items..metadata.name}) kubectl port-forward $GRAFANA_PODS 8080:3000
验证转发是否成功。输出内容类似如下:
Forwarding from 127.0.0.1:8080 -> 3000
如需连接到 Grafana 网页界面,请在 Cloud Shell 中点击网页预览,然后选择在端口 8080 上预览。
如需了解详情,请参阅使用网页预览。
随即打开新的浏览器标签页并连接到 Grafana 网页界面。稍等片刻之后,浏览器会显示如下图形:
Grafana 的该项部署已针对本指南进行了自定义。
configmaps/grafana.yaml
和deployments/grafana.yaml
文件配置了 Grafana,使其连接到opentsdb-read
服务、允许匿名身份验证和显示一些基本集群指标。要在生产环境中部署 Grafana,我们建议您实施适当的身份验证机制并使用更丰富的时间序列图。
清除数据
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
逐个删除资源
删除 Kubernetes 集群以删除您创建的所有工件:
gcloud container clusters delete GKE_CLUSTER_NAME
要删除 Kubernetes 集群,请输入
Y
进行确认。如需删除 Bigtable 实例,请执行以下操作:
在 Google Cloud 控制台中,转到 Bigtable。
选择您之前创建的实例,然后点击删除实例。
删除项目
- 在 Google Cloud 控制台中,进入管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
后续步骤
- 要了解如何提高 OpenTSDB 的使用性能。请参阅 Bigtable 时间序列数据架构设计。
- 如需了解如何从 HBase 迁移到 Bigtable,请参阅将数据从 HBase 迁移到 Bigtable。
- Google Cloud Next 17 中的 Bigtable 实际应用视频介绍了现场提升,这是一项重要的性能提升。
- 如需详细了解 GKE 集群的默认范围,请参阅集群范围。
- 探索有关 Google Cloud 的参考架构、图表和最佳做法。查看我们的 Cloud Architecture Center。