当前位置: 首页 > news >正文

Vivint大规模IoT部署的指标收集

\

看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料!

\
\\

Vivint工程团队构建了自己的指标收集平台,用于收集和分析他们部署的设备上的指标。他们之所以编写自己的系统是希望能够只存储聚合数据,并集中精力分析这些数据,这是通过Rothko项目实现的。

\\

Vivint是一家智能家居设备提供商。Rothko的基本设计决策不同于Graphite、OpenTSDB等系统的地方在于,它存储聚合数据,而不是每项服务的数据点。他们这样做是因为他们有意识地对不存储每个数据点和仍然具备精准定位问题的能力进行了权衡。同时,用于统计分析的数据不能丢失此类分析所需要的任何关键特征。

\\

Rothko可以提供指标的总体分布并分析它们。鉴于没有存储单个的指标,团队是否遇到过单个设备需要诊断的情况?InfoQ采访了Vivint软件工程师Jeff Wendling,了解更多情况以及Rothko的架构:

\\
\

事实上,我们不会存储单个的数据点。这可以通过两个方法解决。一个是,我们可以简单地存储最小值和最大值以及数据来源,我们就是这样做的。那有助于我们发现最显著的异常。另一个是,考虑到每种设备大约每30分钟发送数据,我们有一个“数据流入口(firehose)”,让我们可以接入数据,筛选出特定的指标或设备等等。假如它还是发送,我们通常就可以找出是哪个设备。当然,这两个方法并不能保证我们可以确定问题,但是,我们只需要付出20%的努力就得到了一个廉价而便捷的80%的解决方案,这符合Rothko的原则。

\
\\

通常,时间序列数据有类似标签这样的元数据,可以存储类似应用程序名或数据中心位置这样的额外属性,在分析过程中可以用它们进行逻辑分组。Vivint的数据也是这样吗?Wendling回复说:

\\
\

我们只会向上发送一个随机的实例ID,这目前只是一个非结构化的字节切片。理论上讲,你想发送什么,就可以向上发送什么。考虑到我们监控的设备大部分都是客户家居用的廉价设备,它们没有配备任何GPS设备,但是,可以通过IP得出颇为接近的定位。

\
\\

Rothko的架构中包含一个数据库实现,为每个指标分配数量可配置的平面文件,使用mmap写入和读取。它还包含一个基于Graphite有线协议的指标接收实现,一个近似的分位数略图用于聚合数据,一些API端点用于检索数据、渲染图像,以及一个前端UI,方便人们使用。数据可以从设备安全地发送到Rothko端点。

\\

Wendling说,“我们的设计一直保持可插拔”,因为“有许多相互矛盾的计算标准和不同的工作负载。例如,在内部,我们就有自己的插件,用于从我们自定义的有线协议中读取指标。我们的设计让插件编写很容易,而且使用一个toml文件即可完成配置。甚至是日志和进程内部指标收集都可以轻松替换成任何你想要的东西。”

\\

按照设计,Rothko用来处理大量实例的少数指标。目前,它处理大约5万个指标,使用500MB内存在大约50秒内完成磁盘刷新。据Wendling介绍,刷新每10分钟一次,因此“应该很容易处理50万个指标”。它部署在单个实例上,目前尚没有实现像横向切片这样的扩展策略的需求。

\\

有人问,Vivint的团队是否也使用了什么预警机制,Wendling答复说,他们不那样做,而是要更多地关注控制面板。Rothko是用Go编写的开源项目,托管在Github上。

\\

查看英文原文:Metrics Collection from Large Scale IoT Deployments at Vivint

相关文章:

  • [NOSQL] Redis介绍
  • JS 面试题总结
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • c++(类) this指针
  • 【Python改变生活!】用pynput控制键盘鼠标!Mac如何卸载python?
  • Docker 镜像、容器、仓库的概念及基本操作
  • 十分钟讲清楚大众对区块链的误解
  • 移动端适配问题解决方案
  • 每天一个linux命令(20):find命令之exec
  • 多张图片合成一张图片、兼容问题总结
  • git 配置多个账户
  • CentOS下安装php扩展exif
  • Alembic基本使用
  • 机器学习中特征的处理及选择
  • Prometheus Querying Function rate() vs irate()
  • 【知识碎片】第三方登录弹窗效果
  • 2017 前端面试准备 - 收藏集 - 掘金
  • 2017年终总结、随想
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java 网络编程(2):UDP 的使用
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Js基础——数据类型之Null和Undefined
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • python 装饰器(一)
  • React Native移动开发实战-3-实现页面间的数据传递
  • React-生命周期杂记
  • SOFAMosn配置模型
  • 初识MongoDB分片
  • 小程序开发中的那些坑
  • 原生js练习题---第五课
  • 找一份好的前端工作,起点很重要
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #{} 和 ${}区别
  • $.ajax中的eval及dataType
  • (1)bark-ml
  • (4)事件处理——(7)简单事件(Simple events)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Core 中插件式开发实现
  • .NET 使用配置文件
  • .NET程序员迈向卓越的必由之路
  • .net反混淆脱壳工具de4dot的使用
  • .NET简谈设计模式之(单件模式)
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET序列化 serializable,反序列化
  • .Net组件程序设计之线程、并发管理(一)
  • /var/lib/dpkg/lock 锁定问题
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • [ACM] hdu 1201 18岁生日
  • [ajaxupload] - 上传文件同时附件参数值