玩转 Timestream For influxDB 实现时序数据存储和分析

本教程主要包含以下几个部分:Timestream for InfluxDB 创建、连接、数据插入,如何采用 influxDB UI 连接和管理 Timestream for influxDB;以及我们将以 devops 运维数据为示例场景,介绍如何采用 Timesteram for influxDB 来高效插入、存储时序数据;以及如何采用和集成 grafana,实现时序数据丰富和高效的查询、分析和展现。

Amazon Timestream
数据库
分析
教程
亚马逊云科技
Olawale Olaleye
难度
100 - 初级
时间
30 分钟
前提条件

海外区域: 注册 / 登录 亚马逊云科技

上次更新时间
2024 年 4 月 24 日

部署架构图

其中架构主要分成四大部分:

  • 实时时序数据采集:通过安装部署在 EC2 堡垒机的 Python 模拟实现 Devops 运维数据,将数据实时采集数据到 Timestream for influxDB。
  • 时序数据存储:通过 Amazon Timestream for influxDB 时序数据库实现时序数据高效存储。
  • 实时时序数据分析:通过安装部署在 EC2 堡垒机的 Grafana (内置 influxDB 插件)实时访问 Timestream for influxDB 数据,通过 Grafana 丰富的分析图表形式,结合 Amazon Timestream for InfluxDB 内置的时间序列分析函数,可以实现近乎实时地识别 devops 运维实时数据的趋势和模式。
  • 通过 EC2 堡垒机 SSH tunnel, 采用 influxDB UI 访问同一 VPC 内部署的 Timestream for influxDB,实现图像化管理运维工作,例如创建 bucket(database)、创建 Flux Task 和进行实时数据探索(data explorer)。

安装 Timestream for InfluxDB

创建数据库

访问 Timestream for influxDB console(区域选择 us-east-1):https://us-east-1.console.aws.amazon.com/timestream/home?region=us-east-1#influxdb-instances/create-influxdb-instance

输入创建 influxDB 数据库参数:

DB instance name: managed-influxdb-1
Initial username: masteruser
Initial organization name: workshop
Initial bucket name: sampledb
Password: Password1

Instance configuration(保持缺省设置)
DB instance class:db.influx.large
Storage configuration(保持缺省设置)
Storage type:influx IO included(3k)
Allocated storage:400
Availability settings:选择 Single-AZ(生产环境建议选择 Multi-AZ)

Connectivity configuration(保持缺省配置)
Public access:选择 Not publicly accessible

其它配置:Parameter/Log/Tags 均保持缺省配置

点击创建数据库

创建 EC2 堡垒机

访问 EC2 console 区域选择 us-east-1:https://us-east-1.console.aws.amazon.com/ec2/home?region=us-east-1#LaunchInstances:

操作系统:选择 Amazon Linux
版本:选择 Amazon Linux 2
Instance type:选择 C5.large
密钥对:创建访问 EC2 堡垒机的密钥对,并将密钥保存到本地
其它选项:均选择缺省配置

等 EC2 堡垒机创建成功,增加一个安全组 default(前面创建的 Managed influxDB 所对应的 default 安全组)

在 EC2 堡垒机上安装相应软件

设置时区

TZ='Asia/Shanghai'; export TZ

Install python3

sudo yum install -y python3

Install python3 pip

sudo yum install -y python3-pip

pip3 install boto3

sudo pip3 install boto3

pip3 install numpy

sudo pip3 install numpy

install git

sudo yum install -y git

安装 influxDB 对应的 python 模块

pip3 install influxdb
pip3 install urllib3==1.26.15

通过 Influx 客户端连接到 Managed InfluxDB

在 EC2 (amazon Linux) 上安装 influxDB 客户端

首先确认 EC2 和 InfluxDB 数据库在同一个安全组:default(安全组)安全组内支持任意 TCP/IP 访问

下载 influxDB client(version 2.7)

wget https://repos.influxdata.com/centos/7/x86_64/stable/influxdb2-client-2.7.3.x86\_64.rpm

sudo yum localinstall influxdb2-client-2.7.3.x86_64.rpm

连接到数据库

创建 influx config(config name 为 workshop)

influx config create --config-name workshop  \
    --host-url https://managed-influxdb-1-5bc2krpa3h3ehv.us-east-1.timestream-influxdb.amazonaws.com:8086 \
   --org workshop  \
   --username-password masteruser \
   --active

创建可以进行任何访问的 token

influx auth create --org workshop --all-access

生成的 token 如上图,保持 token 为后续使用

创建新的 influx config workshop-new,并使其成为 active config

   influx config create --config-name workshop-new  \
    --host-url https://managed-influxdb-1-5bc2krpa3h3ehv.us-east-1.timestream-influxdb.amazonaws.com:8086 \
   --org workshop  \
   --token  "gFN88WQ48L8ZzSRdsfXlGxDiupyuQ4kChVFt-PEiuWZm55K9LyBq7e_q******CCovp4lB88gouQKjig==" \
   --active

测试新创建 influx config workshop-new 是否正确:
执行 create bucket 命令,创建 bucket:test(bucket 相当于 database 概念)

influx bucket create --name test

装载本地文件到数据库

装载本地文件到 sampledbMeasure: mem
Tag: host
Field: used_percent

vi sample_host.csv
#datatype measurement,tag,double,dateTime:RFC3339
m,host,used_percent,time
mem,host1,64.23,2020-01-01T00:00:00Z
mem,host2,72.01,2020-01-01T00:00:00Z
mem,host1,62.61,2020-01-01T00:00:10Z
mem,host2,72.98,2020-01-01T00:00:10Z
mem,host1,63.40,2020-01-01T00:00:20Z
mem,host2,73.77,2020-01-01T00:00:20Z

将本地文件导入到 Managed InfluxDB bucket:sampledb

influx write --bucket sampledb --file "./sample_host.csv"

查询刚插入数据(使用 FLUX 语言 – Flux 是 InfluxData 公司专门为 InfluxDB 2.0 及更高版本设计的新型数据脚本语言和查询语言)

influx query 'from(bucket:"sampledb") |> range(start:-10y) |> filter(fn: (r) => r._measurement == "mem")'

将 S3 上数据文件导入到 Managed InfluxDB bucket:test

influx write --bucket test --url https://influx-testdata.s3.amazonaws.com/air-sensor-data-annotated.csv

通过 HTTP API 插入数据

通过 HTTP API 写入单条数据 (注意鉴权,要在 HTTP head 中带 token)

curl -i -XPOST 'https://managed-influxdb-1-5bc2krpa3h3ehv.us-east-1.timestream-influxdb.amazonaws.com:8086/write?db=test' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000' \
-H "Authorization: Token gFN88WQ48L8ZzSRdsfXlGxDiupyuQ4kChVFt-PEiuWZm55K9LyBq7e_qDJ******CCovp4lB88gouQKjig=="

输出结果

HTTP/2 204 
vary: Accept-Encoding
x-influxdb-build: OSS
x-influxdb-version: dev
date: Sun, 07 Apr 2024 06:21:44 GMT

表示成功数据插入

通过 HTTP API 查询数据(支持类 InfluxQL 语法)

curl -H "Authorization: Token gFN88WQ48L8ZzSRdsfXlGxDiupyuQ4kChVFt-PEiuWZm55K9LyBq7e_qDJLZkQdE******ovp4lB88gouQKjig==" \
-G 'https://managed-influxdb-1-5bc2krpa3h3ehv.us-east-1.timestream-influxdb.amazonaws.com:8086/query?db=test&pretty=true' --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west' and \"host\"='server01'"

查询结果

{"results":[{"statement_id":0,"series":[{"name":"cpu_load_short","columns":["time","value"],"values":[["2015-06-11T20:46:02Z",0.64]]}]}]}

通过 influx V1 Shell 访问数据库

执行下面命令访问 influx v1 shell

Influx v1 shell

查看数据库

show databases

切换到要查看数据库

use sampledb

查看指标

show measurements

查看指标的 tag 定义

show tag keys from mem

查看指标的 field 定义

show field keys from mem

查询指标中数据

select * from mem

插入新数据

INSERT cpu,host=server01,region=us-west value=42.5

下载 devops 时序数据生成应用

下载 devops 时序数据生成应用, 为后续数据查询等操作使用

git clone https://github.com/bingbingliu18/managed-influxDB.git
cd managed-influxDB

运行 devops 时序数据生成应用

python3 managed_influxDB_continuous_data_ingestor_application.py --url "https://managed-influxdb-1-5bc2krpa3h3ehv.us-east-1.timestream-influxdb.amazonaws.com:8086" \
   --org workshop \
   --token  "gFN88WQ48L8ZzSRdsfXlGxDiupyuQ4kChVFt-PEiuWZm55K9LyBq7e_qDJLZ******Covp4lB88gouQKjig==" \
   --bucket sampledb

–url 是 Managed influxDB URL
–org 是之前创建的 influxDB organization: workshop
–token 是之前创建访问地 influxDB token
–bucket 是之前创建的 influxDB bucket: sampledb

生成的 devops 时序数据描述:

  • Devops 时序数据 tag(dimensension)

availability_zone/cell/instance_name/jdk_version/microservice_name/os_version/process_name/region/silo

  • Devops 时序数据 Field(measure)

cpu_user/cpu_system/cpu_idle/cpu_iowait/cpu_steal/cpu_nice/cpu_si/cpu_hi
memory_free/memory_used/memory_cached
disk_io_reads/disk_io_writes/latency_per_read/latency_per_write
network_bytes_in/network_bytes_out
disk_used/disk_free/file_descriptors_in_use
task_completed/task_end_state/gc_reclaimed/gc_pause

通过 Influx UI 访问 Managed InfluxDB

通过 EC2 SSH tunnel 访问 Influx UI

(EC2 堡垒机和 Managed influxDB 在同一个 VPC 拥有同一个 default security group)

在 mac client 端 Terminal 中执行 (通过 EC2 SSH tunnel 访问 influx UI)
执行以下命令

ssh -i "us-east-1.pem" -L 8086:managed-influxdb-1-5bc2krpa3h3ehv.us-east-1.timestream-influxdb.amazonaws.com:8086 ec2-user@ec2-54-237-166-116.compute-1.amazonaws.com -N

其中:

us-east-1.pem – 是访问 EC2 堡垒机的密钥
managed-influxdb-1-5bc2krpa3h3ehv.us-east-1.timestream-influxdb.amazonaws.com:8086 – 是 Managed influxDB 访问 url
ec2-54-237-166-116.compute-1.amazonaws.com –  是 EC2 堡垒机 pubic 访问地址

保持这个 terminal 一直运行

通过 Influx UI 访问 managed InfluxDB

在 mac client 浏览器中输入:https://localhost:8086

输入 Username:masteruser;Password:Password1

创建新的 bucket 并定义 Retention Policy

Bucket Name: aggregate
Bucket Retention Policy: 30 days
Retention Policy: 将 bucket 的 rentention policy 设置为一个月,意味着 InfluxDB 会自动删除超过一个月的”老”数据

Bucket: aggregate 创建成功,并且 retention Policy 为 30 days

创建 Flux Task

Flux Task 是 InfluxDB 2.0 中的一个功能,它允许用户使用 Flux 脚本定义并调度数据处理任务。

创建一下个新的 Flux Task(点击左边导航 Flux TASK 图标),点击 create task 按钮,输入名字:mean_cpu_hi_5m,每 5 分钟执行一次。

把下面 flux task 定义的 flux script 拷贝到右边文本框里,下面定义的 Flux task 会每 5 分钟把 bucket:sampledb Measurement:devops_metrics 的 cpu_hi 指标做汇总(求近 5 分钟的平均值), 然后将汇总信息写到 bucket:aggregate Measurement:mean_cpu_hi(类似数据上卷动作)

from(bucket: "sampledb")
    |> range(start: -5m)
    |> filter(fn: (r) => r._measurement == "devops_metrics")
    |> filter(fn: (r) => r._field == "cpu_hi")
    |> aggregateWindow(every: 5m, fn: mean)
    |> set(key:"_measurement", value:"mean_cpu_hi")
    |> to(bucket: "aggregate", fieldFn: (r) => ({"mean": r._value}))

点击 save button

新的 task: mean_cpu_hi_5m 创建成功

点击 task mean_cpu_hi_5m,执行 task(run task)

可以看到 task: mean_cpu_hi_5m 被成功执行

登陆到 EC2 堡垒机,运行 devops 时序数据生成应用

  python3 managed_influxDB_continuous_data_ingestor_application.py --url "https://managed-influxdb-1-5bc2krpa3h3ehv.us-east-1.timestream-influxdb.amazonaws.com:8086" \
   --org workshop \
   --token  "gFN88WQ48L8ZzSRdsfXlGxDiupyuQ4kChVFt-PEiuWZm55K9LyBq7e_qD******zTyzCCovp4lB88gouQKjig==" \
   --bucket sampledb

通过 data explore 访问刚由 Flux Task 生成的汇总数据

点击 data explore 图标,进入 data explore

Bucket:选择 aggregate
Measurement:选择 mean_cpu_hi
Field:选择 mean
选择不同的维度信息值:Region/AZ/Cell/silo/instance_type/instance_name/microservice_name/os_version
图形选择:Graph
时间选择:近 15 分钟

点击 summit 生成分析

通过 Grafana 访问 Managed InfluxDB

安装 Granfana

登陆到 EC2 堡垒机

sudo vi /etc/yum.repos.d/grafana.repo

For OSS releases(拷贝以下内容到 grafana.repo)

[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt

sudo yum install -y grafana

Grafana 的启动

启动 Grafana 服务,并确认服务运转正常

sudo service grafana-server start
sudo service grafana-server status

将 Grafana 服务器配置为开机自启动,以便于系统重启时自动运行

sudo /sbin/chkconfig —add grafana-server

Grafana 的访问

第一次登陆到 Grafana(用户名:admin;口令:admin,第一次登陆需要改密码):

  • 打开浏览器,访问以下地址:http: //EC2 堡垒机器public ip]:3000(注意登陆 VPN 不能访问此 URL,要退出 VPN)
  • 除非您专门配置了其他端口,否则 Grafana 默认监听的 HTTP 端口为 3000

创建访问 InfluxDB 数据源 – 通过 FLUX

在 Grafana 选择 connection / 选择 Add new connection / Connection 类型选择influxDB / 选择 Add data source

查询语言为 Flux data source

输入 data source 名字:influxdb-1
Query language:Flux (选择 Flux)
输入访问 Managed influxDB URL:https: //managed-influxdb-1-5bc2krpa3h3ehv.us-east-1.timestream-influxdb.amazonaws.com:8086

认证方式:选择基本认证
用户名:masteruser
口令:Password1

InfluxDB detailsorganization:workshop
token:gFN88WQ48L8ZzSRdsfXlGxDiupyuQ4kChVFt-PEiuWZm55K9LyBq7e_qDJ******CCovp4lB88gouQKjig==
Default Bucket:sampledb选择 Save and test

创建访问 influxDB 数据源 – 通过 InfluxQL

在 Granfana 选择 connection / 选择 Add new connection / Connection 类型选择 influxDB /选择 Add data source

查询语言为 Flux data source

输入 data source 名字:influxdb-2
Query language:InfluxQL(选择 InfluxQL)
输入访问 Managed influxDB URL:https: //managed-influxdb-1-5bc2krpa3h3ehv.us-east-1.timestream-influxdb.amazonaws.com:8086
Auth:选择 with Credentials

Custom HTTP Headers

Header:输入 Authorization
Value 输入(要写 Token 最前面):Token gFN88WQ48L8ZzSRdsfXlGxDiupyuQ4kChVFt-

Database:输入 sampledb
User:输入 masteruser
Password:输入 Password1

登陆到 EC2 堡垒机,运行 devops 时序数据生成应用

  python3 managed_influxDB_continuous_data_ingestor_application.py --url "https://managed-influxdb-1-5bc2krpa3h3ehv.us-east-1.timestream-influxdb.amazonaws.com:8086" \
   --org workshop \
   --token  "gFN88WQ48L8ZzSRdsfXlGxDiupyuQ4kChVFt-PEiuWZm55K9LyBq7e_qDJLZkQ******vp4lB88gouQKjig==" \
   --bucket sampledb

创建 Dashboard – 通过 Flux 访问 Managed InfluxDB

New dashboard / Add Visualization / 选择 Flux 数据源(influxdb-1)

在 query editor 里面输入

from(bucket:"sampledb") |> range(start:-10y) |> filter(fn: (r) => r._measurement == "mem")

Panel Title:Mem query
Graph Type:Gauge
点击 Apply button
点击 save 按钮 Save dashboard,dashboard name:influx-flux-dashboard

创建 Dashboard – 通过 InfluxQL 访问 Managed InfluxDB

查询 1:降采样分析,分析可以从 devops_metrics 测量(Measure)中查询指定微服务(zeus)在过去 6 小时内每 15 分钟的 CPU 利用率指标平均值

New dashboard / Add Visualization / 选择 InfluxQL 数据源(influxdb-2)

在 query editor 里面输入:

SELECT mean(cpu_user) AS "mean_cpu_user",mean(cpu_system) AS "mean_cpu_system",mean(cpu_idle) AS "mean_cpu_idle",mean(cpu_iowait) AS "mean_cpu_iowait",mean(cpu_steal) AS "mean_cpu_steal",mean(cpu_nice) AS "mean_cpu_nice",mean(cpu_si) AS "mean_cpu_si",mean(cpu_hi) AS "mean_cpu_hi"
  FROM devops_metrics
where microservice_name = 'zeus' and time > now() - 6h
  GROUP BY time(15m) 

Panel Title:微服务 Zeus 的平均 CPU
Graph Type:Stat
点击 Apply button
点击 save 按钮 Save dashboard,dashboard name:influxQL-dashboard

创建 Dashboard 查询时,请设定时区为本地浏览器时区

修改 dashboard 为自动刷新 – 每 5 秒刷新一次

查询 2:降采样分析,分析可以从 devops_metrics 测量(Measure)中查询在新加坡区域特定 cell 指定微服务(zeus)在过去 6 小时内每 1 小时的内存使用指标的平均值 /P90/P95/P99 值

New dashboard / Add Visualization / 选择 InfluxQL 数据源(influxdb-2)

在 query editor 里面输入

SELECT 
   mean(memory_used) AS avg_mem,
percentile(memory_used, 90) AS p90_mem,
percentile(memory_used, 95) AS p95_mem,
percentile(memory_used, 99) AS p99_mem
FROM devops_metrics
WHERE time > now() - 6h
    AND region='ap-northeast-1' 
    AND cell='ap-northeast-1-cell-1'
    AND microservice_name = 'zeus'
GROUP BY region, cell, microservice_name, time(1h)

Panel Title:新加坡区域 cell-1 微服务 zeus 平均/P90/P95/P99 内存使用
Graph Type:Gauge
点击 Apply button
点击 save 按钮 Save dashboard,dashboard name:influxQL-dashboard

查询 3:查询不同主机在过去 5 分钟内的平均 CPU 使用,按照每 1 分钟做统计

New dashboard / Add Visualization / 选择 InfluxQL 数据源(influxdb-2)

在 query editor 里面输入

SELECT mean(cpu_user) as mean
from
devops_metrics
where time > now() -1h
group by instance_name, time(1m)

Panel Title:查询不同主机在过去 5 分钟内的平均 CPU 使用,按照每 1 分钟做统计
Graph Type:Bar Gauge
点击 Apply button
点击 save 按钮 Save dashboard,dashboard name:influxQL-dashboard

查询 4:Top 分析,分析可以从 devops_metrics 测量(Measure)中查询平均 CPU 使用最高的三个微服务

New dashboard / Add Visualization / 选择 InfluxQL 数据源(influxdb-2)

在 query editor 里面输入

SELECT  microservice_name,TOP( mean_cpu,3)
from (select mean(cpu_user) as mean_cpu
from devops_metrics
where  time > now()- 1h
group by microservice_name)

Panel Title:CPU 使用最高的 TOP3 微服务
Graph Type:Table
点击 Apply button
点击 save 按钮 Save dashboard,dashboard name:influxQL-dashboard

查询 5:特定主机在最近 5 分钟的 CPU 使用曲线,使用线性插值函数对缺失数据插值

New dashboard / Add Visualization / 选择 InfluxQL 数据源(influxdb-2)

在 query editor 里面输入

SELECT mean(cpu_user)
FROM "devops_metrics" 
WHERE "instance_name" = 'i-AUa00Zt2-apollo-0000.amazonaws.com' AND 
time > now() - 1h
group by time(5s) fill(linear)

Panel Title;主机 apollo-0000 在最近 5 分钟的 CPU 使用曲线,使用线性插值函数对缺失数据进行插值
时间选择:last 5 minutes
Graph Type:Time Series
点击 Apply button
点击 save 按钮 Save dashboard,dashboard name:influxQL-dashboard

查询 6:查询微服务为阿波罗 CPU 使用率较低的主机信息

在 query editor 里面输入

select instance_name,p90_mem from 
(select instance_name, percentile(cpu_user, 90) AS p90_mem from devops_metrics
where time > now() - 1h
and "microservice_name" = 'apollo'
group by "region", "cell", "silo", "availability_zone", "microservice_name", "instance_name",time(15m))
where p90_mem < 30

Panel Title:查询微服务为阿波罗 CPU 使用率较低的主机信息
时间选择:last 5 minutes
Graph Type:Stat
点击 Apply button
点击 save 按钮 Save dashboard,dashboard name:influxQL-dashboard

查询 7:查询过去一个小时任务终止状态为 USER_ERROR 的事件数量

在 query editor 里面输入

select count(*) from (SELECT task_end_state
FROM devops_metrics
WHERE time > now() - 1h
    AND region = 'ap-northeast-1'
    AND cell = 'ap-northeast-1-cell-1'
    AND microservice_name = 'apollo'
    and task_end_state ='USER_ERROR')

Panel Title:查询过去一个小时任务终止状态为 USER_ERROR 的事件数量
Graph Type:Stat
点击 Apply button
点击 save 按钮 Save dashboard,dashboard name:influxQL-dashboard

查询 8:CPU_User 和 CPU_IoWait 每 5 分钟变化值

在 query editor 里面输入

SELECT DERIVATIVE(mean(cpu_user), 5m),DERIVATIVE(mean(cpu_iowait), 5m) FROM "devops_metrics" WHERE time >= now() - 1h group by time(5m)

Panel Title:CPU_User 和 CPU_IoWait 每 5 分钟变化值
Graph Type:Gauge
点击 Apply button
点击 save 按钮 Save dashboard,dashboard name:influxQL-dashboard

查询 9:5 分钟内新加坡区域 AZ-1-3 微服务为 zeus 的每 1 分钟平均 GC_Pause

在 query editor 里面输入

SELECT 
 mean(gc_pause)
FROM devops_metrics
WHERE time > now() -1h
    AND region = 'ap-northeast-1' 
    AND cell = 'ap-northeast-1-cell-5' 
    AND silo = 'ap-northeast-1-cell-5-silo-2'
    AND availability_zone = 'ap-northeast-1-3' 
    AND microservice_name = 'zeus'
GROUP BY region, 
    cell, 
    silo, 
    availability_zone, 
    microservice_name,
    instance_name, 
    process_name, 
    jdk_version     ,
   time(1m)

Panel Title:5 分钟内新加坡区域 AZ-1-3 微服务为 zeus 的每 1 分钟平均 GC_Pause
Graph Type:Time Series
点击 Apply button
点击 save 按钮 Save dashboard,dashboard name:influxQL-dashboard

整体 Dashboard 展示

总结

本教程着重介绍通过 Timestream for influxDB 集成 Grafana ,实现 devops 运维时序数据实时采集、存储和分析,其中包含部署架构、环境部署、数据生成、数据存储和分析,希望当您有类似时序数据存储和分析需求的时候有所启发,实现海量时序数据高效管理,挖掘时序数据中蕴含的规律、模式和价值,助力业务发展。