写点什么

使用 Amazon Timestream 存储和访问任何规模的时间序列数据

  • 2020-10-29
  • 本文字数:4962 字

    阅读完需:约 16 分钟

使用 Amazon Timestream 存储和访问任何规模的时间序列数据

时间序列是一种十分常见的数据格式,用于描述事物如何随时间的变化。最常见的时间序列数据来源包括工业机器和物联网设备、IT 基础设施堆栈(如硬件、软件和网络组件)以及共享其随时间变化的结果的应用程序。由于其数据模型不适合于通用数据库,要高效地管理时间序列数据绝非易事。


因此,我很高兴地告诉大家 Amazon Timestream 现已全面开放。Timestream 是一种快速、可扩展且无服务器的时间序列数据库服务,借助它可以每天轻松收集、存储和处理数万亿个时间序列事件,与关系数据库相比,其处理速度最高提升了 1000 倍,成本低至后者的十分之一。


这要归功于 Timestream 管理数据的方式:将最近的数据保存在内存中,然后根据您定义的保留策略将历史数据移动到成本优化的存储中。所有数据始终跨同一 AWS 区域的多个可用区 (AZ) 中自动复制。新数据将会写入内存存储,在返回操作成功的消息前,其中的数据将跨三个可用区复制。数据复制基于仲裁机制,因此节点或者整个可用区的丢失不会影响持久性或可用性。此外,作为一项额外的预防措施,内存存储中的数据会持续备份到 Amazon Simple Storage Service (S3)


查询会自动跨层访问和合并最近的数据和历史数据,无需您指定存储位置,并且支持特定于时间序列的功能,以帮助您近乎实时地识别数据中的趋势和模式。


没有前期成本,您只需为您写入、存储或查询的数据付费。根据负载的大小,Timestream 会自动扩展或收缩以调节容量,无需管理底层基础设施。


Timestream 与流行的数据收集、可视化和机器学习服务集成,从而可以方便地与现有和新的应用程序配合使用。例如,您可以直接从 AWS IoT CoreAmazon Kinesis Data Analytics for Apache FlinkAWS IoT GreengrassAmazon MSK 摄入数据。您可以从 Amazon QuickSight 可视化显示存储在 Timestream 中的数据,并使用 Amazon SageMaker 将机器学习算法应用于时间序列数据,例如用于异常检测。您可以使用 Timestream 的 AWS Identity and Access Management (IAM) 精细权限,轻松提取或查询来自 AWS Lambda 函数的数据。我们提供可将 Timestream 与 Apache KafkaTelegrafPrometheusGrafana 等开源平台配合使用的工具。

从控制台使用 Amazon Timestream

Timestream 控制台中,我选择了 Create database (创建数据库)。我可以选择创建一个 Standard database (标准数据库)或用示例数据填充的 Sample database (示例数据库)。我继续使用一个标准数据库,我将其命名为 MyDatabase



默认情况下,所有 Timestream 数据都会 加密 。我使用默认主密钥,但您可以使用您借助 AWS Key Management Service (KMS) 创建的客户管理的密钥。通过这种方式,您可以控制主密钥的轮换,以及有权使用或管理主密钥的人。



我完成了数据库的创建。现在我的数据库是空的。我选择 Create table (创建表)并将其命名为 MyTable



每个表都有自己的数据 retention (保留)策略。第一个数据将被摄入 memory store (内存存储)中,数据可以在这里存储至少一小时到最长一年。之后,数据将被自动移动到 magnetic store (磁性存储)中,数据可以在这里保存至少一天到最长 200 年,然后将被删除。在我的例子中,我选择 1 小时的内存存储保留期和 5 年的磁性存储保留期。



将数据写入 Timestream 时,不能插入早于内存存储保留期的数据。例如,在我的例子中,我将无法插入早于 1 小时前的记录。同样,您不能插入带有未来时间戳的数据。


我完成了表的创建。正如您注意到的那样,系统没有要求我提供数据 schema。Timestream 会在摄入数据时自动推断数据 schema。现在,我要在表格中放置一些数据!

将数据载入 Amazon Timestream

Timestream 表中的每条记录都是时间序列中的单个数据点,其中包含:


  • measure name (度量名称)、 type (类型)和 value (值)。每条记录都可以包含单个度量,但同一表中可以存储不同的度量名称和类型。

  • 采集度量的 timestamp (时间戳),粒度为纳秒。

  • 描述度量的零个或更多 dimensions (维度),可用于筛选或聚合数据。表中的记录可以具有不同的维度。


例如,假设我们构建一个将从服务器采集 CPU、内存、交换和磁盘使用情况的简单监控应用程序。每台服务器都通过主机名来标识,并用国家/地区和城市来表示位置。


在此例中,所有记录的维度都是相同的:


  • country

  • city

  • hostname


表中的记录将会度量不同的事物。我使用的度量名称是:


  • cpu_utilization

  • memory_utilization

  • swap_utilization

  • disk_utilization


所有记录的度量类型都是 DOUBLE


对于监控应用程序,我使用的是 Python。我使用 psutil 模块来收集监控信息,我可以使用以下命令来安装此模块:


pip3 install plutil
复制代码


以下是 collect.py 应用程序的代码:


import timeimport boto3import psutil
from botocore.config import Config
DATABASE_NAME = "MyDatabase"TABLE_NAME = "MyTable"
COUNTRY = "UK"CITY = "London"HOSTNAME = "MyHostname" # 您可以使用 socket.gethostname() 使其动态化
INTERVAL = 1 # Seconds
def prepare_record(measure_name, measure_value): record = { 'Time': str(current_time), 'Dimensions': dimensions, 'MeasureName': measure_name, 'MeasureValue': str(measure_value), 'MeasureValueType': 'DOUBLE' } return record

def write_records(records): try: result = write_client.write_records(DatabaseName=DATABASE_NAME, TableName=TABLE_NAME, Records=records, CommonAttributes={}) status = result['ResponseMetadata']['HTTPStatusCode'] print("Processed %d records.WriteRecords Status: %s" % (len(records), status)) except Exception as err: print("Error:", err)

if __name__ == '__main__':
session = boto3.Session() write_client = session.client('timestream-write', config=Config( read_timeout=20, max_pool_connections=5000, retries={'max_attempts': 10})) query_client = session.client('timestream-query')
dimensions = [ {'Name': 'country', 'Value': COUNTRY}, {'Name': 'city', 'Value': CITY}, {'Name': 'hostname', 'Value': HOSTNAME}, ]
records = []
while True:
current_time = int(time.time() * 1000) cpu_utilization = psutil.cpu_percent() memory_utilization = psutil.virtual_memory().percent swap_utilization = psutil.swap_memory().percent disk_utilization = psutil.disk_usage('/').percent
records.append(prepare_record('cpu_utilization', cpu_utilization)) records.append(prepare_record( 'memory_utilization', memory_utilization)) records.append(prepare_record('swap_utilization', swap_utilization)) records.append(prepare_record('disk_utilization', disk_utilization))
print("records {} - cpu {} - memory {} - swap {} - disk {}".format( len(records), cpu_utilization, memory_utilization, swap_utilization, disk_utilization))
if len(records) == 100: write_records(records) records = []
time.sleep(INTERVAL)
复制代码


我启动了 collect.py 应用程序。每 100 条记录的数据将写入 MyData 表中:


$ python3 collect.pyrecords 4 - cpu 31.6 - memory 65.3 - swap 73.8 - disk 5.7records 8 - cpu 18.3 - memory 64.9 - swap 73.8 - disk 5.7records 12 - cpu 15.1 - memory 64.8 - swap 73.8 - disk 5.7. . .records 96 - cpu 44.1 - memory 64.2 - swap 73.8 - disk 5.7records 100 - cpu 46.8 - memory 64.1 - swap 73.8 - disk 5.7Processed 100 records.WriteRecords Status: 200records 4 - cpu 36.3 - memory 64.1 - swap 73.8 - disk 5.7records 8 - cpu 31.7 - memory 64.1 - swap 73.8 - disk 5.7records 12 - cpu 38.8 - memory 64.1 - swap 73.8 - disk 5.7. . .
复制代码


然后在 Timestream 控制台中,我看到 MyData 表的 schema,它会根据摄入的数据自动更新:



请注意,由于表中的所有度量都是 DOUBLE 类型,因此 measure_value::double 列包含所有这些度量的值。如果度量为不同的类型(例如 INTBIGINT),则我会有更多的列(例如 measure_value::intmeasure_value::bigint)。


在控制台中,我还可以总览我表中拥有的度量、其对应的数据类型以及用于该特定度量的维度:


从控制台查询数据

我可以使用 SQL 来查询时间序列数据。内存存储专为快速的时间点查询进行了优化,而磁性存储则为快速的分析查询进行了优化。但查询会自动处理所有存储(内存存储和磁性存储)上的数据,无需在查询中指定数据位置。


我是直接从控制台运行查询,但也可以使用 JDBC 连接来访问查询引擎。我从一个基本的查询开始,以查看表中最近的记录:


SELECT * FROM MyDatabase.MyTable ORDER BY time DESC LIMIT 8
复制代码



下面我们来尝试一些更复杂的东西。我想查看过去两小时内以 5 分钟的间隔时间按主机名汇总的平均 CPU 利用率。我根据 measure_name 的内容来筛选记录。我使用函数 bin() 将时间舍入为间隔时间的倍数,并使用函数 ago() 来比较时间戳:


SELECT hostname,       bin(time, 5m) as binned_time,       avg(measure_value::double) as avg_cpu_utilization  FROM MyDatabase.MyTable WHERE measure_name = ‘cpu_utilization'   AND time > ago(2h) GROUP BY hostname, bin(time, 5m)
复制代码



在收集时间序列数据时,您可能会错过某些值。这很常见,尤其是对于分布式架构和 IoT 设备。Timestream 拥有一些有趣的函数,您可以使用这些函数来填充缺失的值,例如使用线性 插值法 或基于上一个前移的观察值的函数。


更广泛地说,Timestream 提供了许多函数,可帮助您使用数学表达式,操作字符串、数组和日期/时间值,使用正则表达式以及使用聚合/窗口等。


要体验 Timestream 的功能,您可以创建一个 示例数据库 并添加我们提供的两个 IoT 和开发运维数据集。然后在控制台查询界面中,查看 sample queries (示例查询)以了解一些更高级的功能:


将 Amazon Timestream 与 Grafana 配合使用

Timestream 最令人感兴趣的一个方面是与多种平台集成。例如,您可以使用 Grafana 7.1 或更高版本来可视化显示时间序列数据并创建提醒。Timestream 插件已经包含在 Grafana 的开源版本中。


我将一个新的 GrafanaDemo 表添加到我的数据库中,并使用另一个示例应用程序来连续摄入数据。该应用程序会模拟从在数千台主机上运行的微服务架构采集的性能数据。


我在一个 Amazon Elastic Compute Cloud (EC2) 实例上安装了 Grafana,并使用 Grafana CLI 添加了 Timestream 插件


$ grafana-cli plugins install grafana-timestream-datasource
复制代码


我通过 SSH 端口转发从我的笔记本电脑访问 Grafana 控制台:


$ ssh -L 3000:<EC2-Public-DNS>:3000 -N -f ec2-user@<EC2-Public-DNS>
复制代码


在 Grafana 控制台中,我使用正确的 AWS 证书以及 Timestream 数据库和表配置了插件。现在,我可以选择随 Timestream 插件分发的示例控制面板,此控制面板使用来自持续采集性能数据的 GrafanaDemo 表的数据:


现已推出

Amazon Timestream 现已在美国东部(弗吉尼亚北部)、欧洲(爱尔兰)、美国西部(俄勒冈)和美国东部(俄亥俄)开放。您可以通过控制台、AWS 命令行界面 (CLI)AWS 软件开发工具包AWS CloudFormation 来使用 Timestream。使用 Timestream 时,您需要按写入的次数、查询扫描的数据以及使用的存储付费。有关更多信息,请参阅定价页面


您可以在此存储库中找到更多示例应用程序。要了解更多信息,请参阅文档。时间序列数据的使用(包括数据摄入、保留、访问和存储分层)从未变得如此简单。快来告诉我您打算构建什么样的应用程序吧!


Danilo


本文转载自亚马逊 AWS 官方博客。


原文链接


使用 Amazon Timestream 存储和访问任何规模的时间序列数据


2020-10-29 14:071718

评论

发布
暂无评论
发现更多内容

[教你做小游戏] 只用几行原生JS,写一个函数,播放音效、播放BGM、切换BGM

HullQin

CSS JavaScript html 前端 9月月更

设计模式的艺术 第十二章装饰设计模式练习(开发一个数据加密模块,可以对字符串进行加密。最简单的加密算法通过对字母移位来实现,同时提供了稍复杂的逆向输出加密和更高级的求模加密。用户先用最简单的算法加密,如果觉得不够,可以使用其他算法进行二次加密和三次加密)

代廉洁

设计模式的艺术

设计模式的艺术 第十三章外观设计模式练习(为新开发的智能手机控制与管理软件提供一键备份功能。通过该功能可以将原本存储在手机中的通讯录、短信、照片、歌曲等资料一次性地全部复制到移动存储介质(如MMC卡或SD卡)中。实现过程中需要与多个已有的类进行交互)

代廉洁

设计模式的艺术

云原生(三十四) | Kubernetes篇之平台存储系统实战

Lansonli

云原生 9月月更

分享一套自己制作的Nestjs实战教程

pincman

node.js typescript nestjs

SpringCloud 配置中心(Nacos)的简单使用

nacos SpringCloud 配置中心 9月月更

阿里顶配版 Spring 全家桶高级笔记+300道硬核面试题,跪着啃完了

钟奕礼

Java 编程 程序员 架构 java面试

费时3个月啃烂了这份Redis技术笔记,我成功上岸进了字节

收到请回复

redis 架构 语言 & 开发 Java core redis 底层原理

重学网络系列之(我的名字叫IP)

自然

网络 9月月更

什么是 SAP Business Function

汪子熙

SAP abap Netweaver 业务流程驱动 9月月更

中小企业集成AI人工智能的窘境

felix

人工智能 中小企业 开放应用模型

软件复杂性的来源与应对

源字节1号

软件开发 前端开发 后端开发 小程序开发

发布仅1小时Github破万赞!这份LeetCode算法刷题手册真是离谱

了不起的程序猿

Java 程序员 LeetCode 数据结构算法

《游戏机图鉴》:发展、继承、崩溃、复兴,游戏机的前世今生

图灵社区

科普 游戏机

小六六学Netty系列之Java NIO(一)

自然

网络 9月月更 neety

设计模式的艺术 第十一章组合设计模式练习(开发一个界面控件库。界面控件分为两大类:一类是单元控件,例如按钮、文本框等;另一类是容器控件,例如窗体、中间面板等。试用组合模式设计该界面控件库)

代廉洁

设计模式的艺术

秋招国内大厂最牛的Java面试八股文合集(全彩版),不接受反驳

退休的汤姆

Java 程序员 面经 Java工程师 秋招

数据存储与物联网

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

Java进阶(三)Java安全通信:HTTPS与SSL应用配置

No Silver Bullet

https SSL证书 9月月更

数据治理的内核:元数据管理

Taylor

数据治理 数字化 元数据 元数据管理 元数据管理平台

分布式技术难学?谷歌大神首发纯手撸ZK+Dubbo笔记,网友看完直呼NB

收到请回复

Java zookeeper 架构 分布式 语言 & 开发

上车上车,快速搞懂Redis 过期策略和内存淘汰策略

知识浅谈

redis 过期策略 9月月更

C++后台开发学习路线(已多人拿下腾讯后台开发)

C++后台开发

后台开发 后端开发 C++后台开发 C++开发 腾讯后台开发

小六六学Netty系列之Java BIO

自然

网络 9月月更 neety

程序人生 | 编程的上帝视角应该怎么去找

小明Java问道之路

程序人生 编程思维 如何学习 9月月更 计算机思维

腾讯T4整合Spring+Spring MVC+MyBatis+Redis实现

退休的汤姆

Java 程序员 面经 Java工程师 秋招

DPDK技术学习路线总结,虚拟化专家之路

C++后台开发

后台开发 DPDK VPP OvS DPDK开发

一名中年码农转型成远程工作及远程全栈教学创业者的故事

pincman

node.js typescript react.js 远程工作 nestjs

远程TS全栈学习+远程全职工作+远程高质量外包=3R教室

pincman

node.js typescript react.js 远程工作 nestjs

Java工程师丨面试必会进程线程问答

陈橘又青

Java 面试 9月月更

首次发布!Java面试八股文让569人成功进入大厂,堪称2022最强面试八股文核心知识版!

退休的汤姆

Java 程序员 面经 秋招 Java八股文

使用 Amazon Timestream 存储和访问任何规模的时间序列数据_5G/IoT_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章