玩转 Timestream For influxDB 实现时序数据存储和分析
本教程主要包含以下几个部分:Timestream for InfluxDB 创建、连接、数据插入,如何采用 influxDB UI 连接和管理 Timestream for influxDB;以及我们将以 devops 运维数据为示例场景,介绍如何采用 Timesteram for influxDB 来高效插入、存储时序数据;以及如何采用和集成 grafana,实现时序数据丰富和高效的查询、分析和展现。
部署架构图
其中架构主要分成四大部分:
- 实时时序数据采集:通过安装部署在 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 运维时序数据实时采集、存储和分析,其中包含部署架构、环境部署、数据生成、数据存储和分析,希望当您有类似时序数据存储和分析需求的时候有所启发,实现海量时序数据高效管理,挖掘时序数据中蕴含的规律、模式和价值,助力业务发展。