代码编织梦想

参考官方文档 1.8 版本

指标分为事件指标聚合指标

  • 事件指标常用于关键事件的告警和索引故障排查用。
  • 聚合指标常用于统计数据和趋势分析用。

事件指标

基于事件的指标会在事件发生时立即发布。例如:当用户登录失败时,要立即发送事件告警。

示例

name: event.error
fields:
  # 用于跟ELK关联款速索引查询
  trackingId: "trackingId"
  # 耗时单位ms
  duration: 10000
  description: "描述"
  userId: "用户id"
  orgId: "组织id"
  success: 成功 失败
  status: 状态
tag:
    module: "login"
    region: "hefei"
    service: "CI"
    instanceindex: "机器的索引 1,2,3"

聚合指标

聚合指标会汇总数据按时间间隔发布,在客户端收集、汇总然后发出指标。例如,如果在 30 秒的窗口期间,给定的 HTTP 端点接收到 10,000 个 API 调用,而不是发出 10,000 个指标,则聚合指标将发出 1 个具有 4 个字段的指标。这将节省 9999 个指标。

示例

// timer类型
name: http.request
fields:
  # 在报告间隔内所有数据点的 毫秒平均值
  mean: 100
  # 在报告期间看到的 记录总数
  count: 1000
  # 在报告间隔内看到的 所有记录的毫秒和
  sum: 10000
  # 在该间隔内看到的 最大时间
  upper: 250
tag:
    region: "hefei"
    service: "CI"
    instanceindex: "机器的索引 1,2,3"

对比分析

事件指标和聚合指标的优缺点

事件指标

优点

  • 能附加更多的字段。
  • 能更实时的发送。
  • 能进行更多维度的统计,因为原始数据粒度更细。

缺点

  • 指标记录数太大了。

聚合指标

优点

  • 指标的记录数大大降低。例如,一天的事件指标数原来为100W,假设1分钟聚合一次,聚合后的指标为每分钟一条 * tag * tagvalue = 1440 * 系列基数。
  • 也大大降低指标写入频率。
  • 可以提前预估数据规模问题。

缺点

  • 无法添加其他附件字段。
  • 注意客户端基数爆炸问题,因为是在每个客户端内存统计,基数过大会导致内存溢出。
  • 无法做更多维度的统计,因为原始数据已经在客户端处理了一轮,粒度变粗了。

举例分析事件指标和聚合指标记录数的差异

如果有n个事件,其有m个具有k个不同标签值的标签,则生成的记录数为:

  • 事件指标n个记录
  • 聚合指标时间间隔 * m * k个记录

假设一天有 10w个 http 请求,请求实体有2个标签HttpMethodsuccess,有4个标签值GET,POSTtrue,false

n = 10W
m = 2, k = 4

则一天有
事件指标 = 10w points
聚合指标 = 1440 * 2 * 4 = 11520 = 1w多 (1天有1440分钟,聚合步长为1分钟)

客户端和服务端基数计算

name: laker
tags:
    module: "login"           # 一个客户端内存可能3个值 服务端:3个值    
        - login
        - user
        - order
    region: "hefei"          #  一个客户端内存只可能1个 服务端:2个值
         - hefei
         - hangzhou
    service: "CI"            #  一个客户端内存只可能1个 服务端:20个值 假设20个服务
    instanceindex: "1"       #  一个客户端内存只可能1个 服务端:3 
         - 1
         - 2
         - 3

基数只跟tag数和tagvalue数量有关

客户端内存基数: 3 * 1 * 1 * 1 = 3

服务端基数: 3* 2* 20 * 3 = 360

最佳实践

事件指标和聚合指标的选择问题

以下情况可以选择事件指标

  • 事件的确切时间是必要的并且频率低。
  • 需要通过事件实时告警的。
  • 需要添加较多指端排查问题的。
  • 高基数事件UserIds 需要与指标一起发出。注意后端数据存储的基数。

注意所有搞不定的都建议通过日志记录或其他后端来完成,毕竟都是在日志系统上做的升华。

Field和Tag的选择问题

  • 标签Tag不要在标签值中使用高基数项,不要使用 UserId、OrgId、ClientIds、TrackingIds 等(建议放在Field)因为这些数据都是存储在内存里,会导致OOM。

  • 对于influxdb而言,不支持根据field进行分组。特别强调,用来分组的必须是tag

  • 把你经常查询的字段作为tag。

  • 如果你要对其使用GROUP BY(),也要放在tag中。

  • 如果你要对其使用InfluxQL函数,则将其放到field中。

  • 如果你需要存储的值不是字符串,则需要放到field中,因为tag value只能是字符串。

  • tag的名字和值不要太长,名字和值的长度越长,占用的内存越多。

  • 数值的规模很大,那就是field

  • 如果要作为where的条件,那应该作为tag。 field可以作为条件,但是效率很差。

  • 如果要作为group by的条件,那需要作为tag, field不能进行group by。

  • 如果需要做数学运算(如mean, percentile, stddev), 那必须是field。 tag的值不能进行数学运算。

  • 如果需要存储数据的类型(int, float, string, boolean), 必须是filed. tag只能是字符串。

  • tag内存中有索引,field没有索引

  • 不要在一个tag里存储多个信息。

其他问题

  • 一个Point由measurement名称,tag set和timestamp唯一标识。如果提交具有相同measurement,tag set和timestamp,但具有不同field set的行协议,则field set将变为旧field set与新field set的合并,并且如果有任何冲突以新field set为准。

  • 注意tag的设计,因为主键是由time + tag组成,是不可以重复的,如果重复,后面的将覆盖前面的。

    • 增加新的tag来标识不同的点(例如:多加个tag - instanceid)
    • 或者用不同的tag value区分记录
  • 避免在influxdb中使用大量的字段,限制每张表中的字段数量,最好保持在一百个以内;

  • 不可以更新和重命名tag

  • 时间戳 建议使用最粗糙的精度,因为这样可以显着提高压缩率。 Influxdb并不要求时间戳唯一,不同的tag, 相同的时间戳可以写入一条新的记录。也就是说对于普通的采集,以毫秒为单位完全可以满足需求。

  • 批量写入 建议每批写1000 point开始, 然后根据机器配置和应用调整。

数据保留策略和连续查询

InfluxDB 每秒可以处理数十万个数据点。长时间处理如此多的数据可能会产生存储问题查询性能问题

一个通用的解决方案是对数据进行下采样进行数据冷热分离;仅在有限的时间内保留高精度的原始数据,而将较低精度的汇总数据存储更长时间或永久存储。

InfluxDB 提供了两个功能 - 连续查询 (CQ) 和保留策略 (RP) - 可自动执行下采样数据和使旧数据过期的过程。

大批量的热数据强烈建议保存24H,7d等。通过连续查询 (CQ) 和保留策略 (RP) - 可自动执行下采样数据和使旧数据过期的过程。

1.一个数据库可以有多个 RP,每个数据库的 RP 都是唯一的,建立2个保留策略,7d和1y。

2.指标直接写入7d的保留策略。

3.增加CQ从7d的保留策略下采样到1y的保留策略。

详情和具体步骤参见InfluxDB连续查询(通过下采样聚合原始数据降低数据样本数)和数据保留策略(过期删除)

建模示例

influxdb推荐使用tag,而不是创建很多measurement

但是最终的选择还是要结合自己的业务场景

:我有10万个设备要上传数据,使用10万个measurement存储,还是一个measurement加上不同的tag存储

:这个问题很大程度上取决于您的数据结构和使用方式。如果您的数据结构是相同的,那么使用一个measurement加上不同的tag存储比较优化,但如果您的数据字段和数据类型不同,那么使用10万个measurement存储可能更加合理。

原始数据结构

采集时间设备ID数据源数据类型
2018-11-15T05:40:46.3592112ZCNC001温度10.5float
2018-11-15T05:41:41.9896781ZCNC001设备状态runString
2018-11-15T05:42:02.8402281ZCNC001湿度10int
2018-11-15T05:42:02.8402281ZCNC002温度-1.2float
2018-11-15T05:42:04.8402281ZCNC002设备状态runString

measurement

可以有以下3种选择

  • 只有一个measurement存放所有数据。

  • 1个设备作为1个measurement,用于存放一个设备的所有测量指标。

  • 选择数据源作为measurement。

tag

方便根据数据源进行查询,聚合,group等操作。根据实际业务场景决定,例如你想绘制哪些图表,需要什么SQL支持,需要哪些Group By 和 where过滤。

只有tag才支持Group By

值太多的强烈建议放在field中

timestamp

采集时间作为timestamp, 单位ms。

方案一

只有一个measurement

业务字段influxdb类型
采集时间timestamp
设备IDtag
数据源tag
采集数据field value
数据类型field value
入库时间field value

方案二

每类指标一个measurement

measurement: 温度

业务字段influxdb类型
采集时间timestamp
设备IDtag
采集数据field value
数据类型field value
入库时间field value

measurement: 设备状态

业务字段influxdb类型
采集时间timestamp
设备IDtag
采集数据field value
数据类型field value
入库时间field value

measurement: 湿度

业务字段influxdb类型
采集时间timestamp
设备IDtag
采集数据field value
数据类型field value
入库时间field value

方案三

每个设备一个measurement

measurement: xxx-CNC001

业务字段influxdb类型
采集时间timestamp
数据源tag
采集数据field value
数据类型field value
入库时间field value

measurement: xxx-CNC002

业务字段influxdb类型
采集时间timestamp
数据源tag
采集数据field value
数据类型field value
入库时间field value

参考

  • https://unanao.github.io/2018/04/11/tsdb-influxdb/

  • https://docs.influxdata.com/influxdb/v1.8/concepts/schema_and_data_layout/

  • https://help.aliyun.com/document_detail/113127.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/abu935009066/article/details/129309177

数据简化社区2018年全球数据库总结及18种主流数据库介绍(公号回复“数据库2018”下载典藏版pdf报告)_秦陇纪10数据简化datasimp的博客-爱代码爱编程

数据简化社区2018年全球数据库总结及18种主流数据库介绍(公号回复“数据库2018”下载典藏版PDF报告) 秦陇纪 数据简化DataSimp 今天 数据简化DataSimp导读:Google搜索量最大的DB-Engines数据库排名,介绍前几名数据库特点、云AI区块链等数据库服务;展望2018年数据库发展趋势,本文合计40k字详读约需36分钟。最

业务中台总体架构介绍与交易业务中台核心设计-爱代码爱编程

业务中台总体架构介绍与交易业务中台核心设计 架构总原则:电商中台:服务接入层:公用基础组件:云服务&设施容器层业务前台产品:稳定和安全保障系统工程结构: 架构总原则: 大中台+小前台的架构思路 业务中台采用领域驱动设计(DDD),在其上构建业务能力SAAS,持续不断进行迭代演进。 平台化定位,进行了业务隔离设计,方便一套系统支撑不

两万字关于数据中台的深度思考与总结-爱代码爱编程

数据中台离线平台实时平台离线数仓与实时数仓数据中台解决方案本文将总结下数据中台的相关理论知识。Flink平台化需要改进的点等等。 参考:《数据中台》 数据中台 数据汇聚 数据汇聚是数据中台必须提供的核心工具,把各种异构网络、异构数据源的数据方便地采集到数据中台中进行集中存储,为后续的加工建模做准备。数据汇聚方式一般有数据库同步、埋点、

Druid 数据模式设计技巧-爱代码爱编程

Druid 的数据模型 本文主要讨论对来自其他类型数据库系统的用户的提示,以及常规提示和通用做法。 Druid 数据存储在 datasources,datasource 类似于传统 RDBMS 中的 table。Druid 在向数据源摄取数据时,可以选择 rollup,也可以不 rollup。启用 rollup 功能后,Druid 会在摄取

NoSQL与SQL:选择数据管理解决方案-爱代码爱编程

目录 1.简介 2.分布式系统:CAP定理 3.关系数据存储 3.1。 MySQL的/ MariaDB的 3.2。 PostgreSQL的

Go 相关的框架,库和软件的精选清单-爱代码爱编程

概述 这是一个Go 相关的框架,库和软件的精选清单,引用自 awesome-go项目,并翻译补充而来这是一个Go 相关的框架,库和软件的精选清单,引用自 awesome-go项目,并翻译补充而来 音频和音乐 用于处理音频的库。 EasyMIDI -EasyMidi是一个简单可靠的库,用于处理标准Midi文件(SMF)。 flac支

sql与nosql_NoSQL与SQL:选择数据管理解决方案-爱代码爱编程

sql与nosql 目录 1.简介 2.分布式系统:CAP定理 3.关系数据存储 3.1。 MySQL的/ MariaDB的 3.2。 Postgr

干货:数据中台的深度思考与总结-爱代码爱编程

来源 | http://dwz.date/aHTb 本文将总结下数据中台的相关理论知识,参考《数据中台》。 数据中台 数据汇聚 数据汇聚是数据中台必须提供的核心工具,把各种异构网络、异构数据源的数据方便地采集到数据中台中进行集中存储,为后续的加工建模做准备。数据汇聚方式一般有数据库同步、埋点、网络爬虫、消息队列等;从汇聚

数据查询和业务流分开_一文带你了解大数据管道-爱代码爱编程

介绍 如果您从大数据开始,通常会被众多工具,框架和选项所困扰。 在本文中,我将尝试总结其成分和基本配方,以帮助您开始大数据之旅。 我的目标是对不同的工具进行分类,并试图解释每个工具的目的以及它如何适应生态系统。 首先,让我们回顾一些注意事项,并检查您是否确实遇到大数据问题。 我将重点介绍可以在本地部署的开源解决方案。 云提供商为您的数据需求提供了几

Hadoop 和 Spark 知识点整理汇总-爱代码爱编程

文章目录 前言一、LINUX 系统常用命令汇总二、Hadoop 常用命令汇总三、Hadoop 基本概念1. Hadoop 特性2. Hadoop 架构2.1 Hadoop 集群2.2 HDFS2.3. YARN四、Hadoop HDFS命令1. HDFS 命令通用格式2. 创建与查看 HDFS 目录3. HDFS 与本地计算机之间的文件复制4. 复

万字长文解读最新最全的大数据技术体系图谱!-爱代码爱编程

正文开始 大数据技术发展20年,已经形成覆盖面非常庞大的技术体系,最近信通院发布了《大数据白皮书2020》(关注本公众号后,后台回复“big2020”获得PDF),提供了一张非常全面的大数据技术体系图谱,如下图所示: 从这张图谱可以看到,大数据技术体系可以归纳总结为数据分析应用技术、数据管理技术、基础技术、数据安全流通技术四大方向,每个方向大

Kubernetes监控之最佳实践-爱代码爱编程

新钛云服已为您服务993天 什么是Kubernetes? Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。 Kubernetes由Google于2014年开源 ,它是

TDengine在弘源泰平量化投资中的实践-爱代码爱编程

公司简介 深圳市弘源泰平资产管理有限公司组建于2016年,团队核心成员来自于知名高校,有丰富的资产配置与策略构建的实践经验。弘源泰平以套戥交易绝对收益型配置工具为起点,致力于为用户提供流动性好、费率公允的资产配置工具。产品线全面、丰富,涵盖股、债、商品等各大类资产,通胀、趋势等各类因子。 场景简介+核心诉求 我们的量化交易系统每天要接收大量的行情数据

Java 框架、库和软件的精选列表(Awesome Java)-爱代码爱编程

原创翻译,原始链接 本文为awesome系列中的awesome java 文章目录 项目Bean映射构建字节码操作缓存CLI集群管理代码分析代码覆盖率代码生成器编译器计算机视觉配置约束满足问题求解器CSV数据结构数据库日期和时间依赖注入发展分布式应用程序分布式事务分发文档处理财务正式验证函数式编程游戏开发地理空间图形界面高性能HTTP客

基于电商业务中台最佳实践:总体架构介绍与交易业务中台核心设计-爱代码爱编程

架构总原则: 大中台+小前台的架构思路 业务中台采用领域驱动设计(DDD),在其上构建业务能力SAAS,持续不断进行迭代演进。 平台化定位,进行了业务隔离设计,方便一套系统支撑不同玩法的业务类型和便于定制化扩展。 前后端分离,通过服务接入层进行路由适配转发。 天然的分库分表,消息解耦和分布式缓存设计,支持弹性扩容,以支持大数据高并发场景。

IoTDB学习笔记-爱代码爱编程

IoTDB IoTDB简介 IoTDB (Internet of Things Database) 是一款时序数据库管理系统,可以为用户提供数据收集、存储和分析等服务。IoTDB由于其轻量级架构、高性能和高可用的特性,以及与 Hadoop 和 Spark 生态的无缝集成,满足了工业 IoT 领域中海量数据存储、高吞吐量数据写入和复杂数据查询分析的需求。

边缘计算框架工程与实践-阅读笔记_一帘忧梦的博客-爱代码爱编程

 -------------------------------------边缘计算概述--------------------------------------------------------------- 边缘计算的历史:   1.  Akamai公司定义了内容分发网络(Conetent Delivery Network CDN)被认为是最早起

percona-toolkit最佳实践(一)_chris_in_shanghai的博客-爱代码爱编程

Percona-Toolkit最佳实践(一) 1.Percona-Toolkit的安装2.pt-table-checksum数据校验3.pt-table-sync数据修复4.pt-slave-restart恢复主从