Prometheus 与 国产 TDengine 的对比
通过对比,能加深对这两个系统的理解,方便后续架构选型时作出正确决定。他们的设计思路有很多值得借鉴的地方,虽然工作中需要用到这些知识的地方不多,但是了解他们的设计细节能极大满足我的好奇心。
1.场景和需求
Prometheus
需求
- 用于云原生场景下集群监控数据的收集、即席分析(Ad Hoc)和报警
- 处于 Kubernetes 生态,需要能很方便与之集成,被收集对象(target)的种类和数量会动态变化
- 可扩展:能应对集群规模逐步变大的场景:从成百到上千台机器,上万容器的规模
- 追求单机模式下极高的写入吞吐和查询速度,比如支持每秒百万采样数据的写入。
场景特点
- 因为生态中已经有服务发现组件,而且是内网环境,所以它会定期、批量拉取数据,需支持高并发写入。
- 需要存储的指标序列(metric series)数量级会很大。比如一个 Kuberntes 集群中500台机器,每台机器上有几十上百个目标,每个目标里20个指标。这样会有 500*100*20 = 1,000,000,一百万个序列。
- 数据写入和读取的形式完全不同:数据写入按照指标维度,而读取是按照时间区间。最终查询时涉及的区域以时间为横轴,指标不同维度为纵轴的矩形。
- 序列翻腾(Series Churn)问题:随着时间推移,一些指标序列会进入非活跃状态,即再也不会接收到新的数据,而新的序列会出现。这在云环境,尤其是 Kuberntes 这种环境下非常常见:主机粒度、服务实例粒度、容器粒度都会弹性伸缩。
TDengine
需求
- 想要一站式解决目前国内物联网大数据平台的问题:使用互联网的Kafka、HBase、Cassandra、MongoDB、Redis等太重了,研发、运维效率低,定位问题链条太长
- 希望轻松搞定私有化部署
- 能适用于物联网中嵌入式设备和系统
场景特点
- 写入的都是结构化数据,数据 Schema 是事先能确定的
- 写多读少,写入数据都带时间戳
- 写数据流量平稳且可预期。根据设备数量和采集频次,可以预测。比如有100个设备,每30s采集一次数据,那写入最高约3000次每秒。不会像互联网的To C 流量,会受营销的影响。
- 嵌入式设备,存储、算力资源受限,而且设备有利旧的情况
2. 需求共同点
他们的需求和场景有一些共同点:
- 写入数据都带时间戳,一次写入,多次读取,写入的数据不会有更新的需求。
- 查询都是基于连续的时间区间,聚合都是基于更小的时间窗口。比如查询某指标在最近30分钟里,5分钟为窗口的平均值
- 需要提供即席查询(Ad Hoc)能力,即支持用户自定义查询条件。不需要支持跨不同类型的表进行聚合查询的情况。
3. 差异
面向的场景不同
- Prometheus 专注于运维(operation)需要的指标数据,特点是存储的就是一个数值,数据附带了很多维度信息,作为标签(lable)。比如 cpu_total_seconds :
{timestamp=2020-09-05-21-27, host="192.168.1.10", type="idle"}=3551341
;而 TDengine 类似传统数据库,用于存储工业中某类传感器设备采集的指标,所以数据类型多样,如浮点,字符串等。 - TDengine 面向工业物联网时序场景,写入数据的设备数量比较稳定,可预测。而 Prometheus 要拉取的目标是动态变化的。
- TDengine 的场景之一是嵌入式,所以追求无依赖,安装包小,内存占用小。
- TDengine 面向工业物联网,这个领域不像互联网那样人才充沛,IT化程度低,所以 TDengine 想减少维护成本,做全栈,有一部分缓存(无需Redis)、消息队列(无需Kafka)、实时计算能力
- Prometheus专注于单机性能,用于存储最近一段时间数据,没有长期持久化的考虑,弱化分布式集群功能,由其他组件(如Thanos)来完成高可用。
- TDengine 希望通过分布式集群来提供可扩展性、高可靠和高性能,避免单点故障,收费版就是提供集群能力,有持久化多级存储在不同设备上的能力。
使用方式不同
- Prometheus 不需要提前建表,而 TDengine 是关系型数据库模型,需要提前定义好表结构。Promtheus 里写入的数据需要自带描述,包含很多不同维度的标签(lable),这些都是动态的。
- 查询语句:TDengine 使用 SQL 语句。而 Prometheus 有自己的一套 DSL:PromQL
- TDengine 一个采集点一张表,所以一张表不会并发写入。而 Promtheus 为了避免存储的采样数据产生很多小文件,是以块为单位存储指标的
- Prometheus 里 lable 会有字符串,所以查询语句支持文本检索:与、非条件组合
架构、实现方案不同之处
- TDengine中集群功能非常复杂,它需要考虑很多分布式系统里常见的问题:集群成员管理(membership management)、成员通信、数据分片(sharding)、数据分区(partition)、成员选主(leader election)、数据同步(replication)、负载均衡(load balance),防止数据过热或倾斜,
- 上文提到 Prometheus 没有聚焦在解决分布式高可用。它的核心组件是自研的时序数据库 TSDB。通过学习Facebook的开源时序数据库 Gorilla 中的采样数据压缩算法,号称能把一个16字节的采样数据压缩到约1.4字节。
- TDengine 使用 C 来实现,为了避免对其他库有依赖和较量高效,自己实现了定时器,RPC,内存管理等机制。
相同点
共同的设计目标
都在追求高性能、低资源占用率,都希望充分利用数据的使用特点:最近写入数据优先。
类似的架构、实现方案
- 写入时,数据都是先写入内存,之后批量刷到磁盘,尽量减少磁盘的写频率。为了防止在此期间的宕机,都使用了提前写(Write-ahead-log)日志
- 为了尽量减少数据的内存和磁盘占用,都会根据数据特点进行压缩。
- 数据都按照时间维度进行分块(chunks),块与块之间独立。这样查询时可以多个块并发查询,然后进行合并。而且后续数据回滚(retention),可以以块为粒度进行,简单高效。
- 如果查看他们的架构图,会发现都需要有存储引擎、计算引擎。
本文中还有很多方面没有涉及,比如 TDengine 集群模式及存储引擎方面的细节。由于 TDengine 存储引擎无文档,目前还不知道是如何设计的,改日读读源码,后续逐步写文章阐明。
通过学习这些系统,会发现技术领域也有经典招式,存在了很多年,威力巨大。比如 WAL,Master slave 同步机制, Raft协议、Quorum 机制,SSTable 等。
参考资料
- 我为何要开发一个专用的物联网大数据平台,还开源它?
- PromCon 2017: Storing 16 Bytes at Scale
- Writing a Time Series Database from Scratch
欢迎关注我的微信公众账号,会在第一时间更新,博客园上只有部分文章会发布
Prometheus 与 国产 TDengine 的对比的更多相关文章
- 2020主流国产BI产品对比
国产BI软件由于具备较强的本土特性,可以很好地适应国内用户的使用习惯,越来越多被国内用户使用.目前国内BI产品很多,可谓百家争鸣,如何从众多的BI产品中选择适合自己的呢?这里我们对比一下目前国内主流的 ...
- gc调优我们到底在调整什么
java开发一般都会涉及到jvm调优其中gc调优是个重点项.那gc调优调整的究竟是什么呢准确来说是业务.下面围绕这个话题展开 起因 为什么说是业务呢得从cc++开始说起如果说是用c/c++做开发运行的 ...
- 监控系统对比 Ganglia vs Open-falcon vs Prometheus vs Zabbix vs Nagios vs PandoraFMS
Zabbix vs Nagios vs PandoraFMS: an in depth comparison - Pandora FMS - The Monitoring Bloghttps://bl ...
- TongWEB与JOnAS 对比,国产中间件战斗机东方通TongWEB源码解析
转自网址: http://bbs.51cto.com/thread-489819-1-1.html 首先需要声明的是,本人出于技术爱好的角度,以下的文字只是对所看到的一些情况的罗列,偶尔附加个人的一些 ...
- Docker监控:最佳实践以及cAdvisor和Prometheus监控工具的对比
在DockerCon EU 2015上,Brian Christner阐述了“Docker监控”的概况,分享了这方面的最佳实践和Docker stats API的指南,并对比了三个流行的监控方案:cA ...
- prometheus和zabbix的对比
前言: 新公司要上监控,面试提到了Prometheus 是公司需要的监控解决方案,作为喜新厌旧的程序员,我当然是选择跟风了,之前主要做的是zabbix,既然公司需要prometheus,那没办法,只能 ...
- 由国产性能测试工具WEB压力测试仿真能力对比让我想到的
软件的行业在中国已得到长足的发展,软件的性能测试在软件研发过程显得越来越重要.国产的性能工具在好多大公司都在提供云服务的有偿收费测试.如:阿里的PTS(Performance Testing Serv ...
- zabbix和prometheus的优缺点对比
使用Prometheus(https://github.com/prometheus)原生的k8s服务发现驱动,采集容器化信息:通过微服务参数配置,暴露运行状态信息提供给prometheus,实现微服 ...
- 国产ProcessOn和国外gliffy的对比区别【原创】
之前一直在用国外的作图工具gliffy,不足之处gliffy是英文的,很多国内相关从业者使用起来就有一定门槛,今天我给大家再推荐一款比gliffy更方便的作图工具ProcessOn,除了绘制UML建模 ...
随机推荐
- 您能解决这3个(看似)简单的Python问题吗?
尝试解决以下问题,然后检查以下答案. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识 ...
- JS 模仿京东键盘输入内容
css代码 .search { width: 300px; height: 80px; margin: 0 auto; position: relative; } .con { display: no ...
- 1. JDK基础说明
1. JDK基础说明 版本及新特性获取 作为技术人,关注新技术必不可少,那么最佳的途径...看下面. 在 Oracle Java 官方站点有这个非常好的引导地图 官方站点 https://docs.o ...
- 2020-04-06:为什么HashMap不一直使用红黑树?
红黑树的阈值是8,当链表大于等于8时链表变成了红黑树结构,大大减少了查找的时间. 当长度低于6时会由红黑树转成链表,TreeNodes占用空间是普通Nodes的两倍,所以只有当bin包含足够多的节点时 ...
- C#设计模式之7-桥接模式
桥接模式(Bridge Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/401 访问. 桥接模式属于结构 ...
- C#LeetCode刷题之#447-回旋镖的数量(Number of Boomerangs)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3792 访问. 给定平面上 n 对不同的点,"回旋镖&q ...
- C#LeetCode刷题之#136-只出现一次的数字(Single Number)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4046 访问. 给定一个非空整数数组,除了某个元素只出现一次以外, ...
- 为 Eureka 添加 Http Basic 认证
简介 在网络世界中,任何网络中的服务都是不安全的,为了使我们的 Eureka 服务更加安全,我们可以添加各种各样的认证方式,以使客户端在提供相应的证明之后才能够注册到 Eureka 中.而这次我们就添 ...
- 手把手mc开服教学(内置开服核心)
QQ交流群:1125669835 mc开服教程 首先我们需要下载一个开服核心,然后把服务器核心放在一个空文件夹里(这是我的开服核心) 然后再打开(感jio这是废话,要耐心等待......) 然后你会发 ...
- SpringMVC使用Session
Session在用户登录,一些特殊场合在页面间传递数据的时候会经常用到 @ 目录 修改IndexController check.jsp 效果 修改IndexController 映射 /check ...