为啥用 时序数据库 TSDB
前言
其实我之前是不太了解时序数据库以及它相关的机制的,只是大概知晓它的用途。但因为公司的业务需求,我意外参与并主导了公司内部开源时序数据库influxdb的引擎改造,所以我也就顺理成章的成为时序数据库“从业者”。
造飞机的人需要时刻理解开飞机的人的需求。我不算时序数据库的使用者,但我想站在用户的角度去思考,他们需要一款怎样的“时序数据库”,我司的influxdb的第一阶段改造已经完成,所以我写下这篇文章,总结一下自己在开发中的一些思考与想法。也许有些地方还不够成熟,但胜在人会慢慢进步。
正文
一、几款优秀的时序数据库
Prometheus、Influxdb和opentsdb是三款业内比较知名且实际生产使用的时序数据库了,总的来说三款各有优缺点,这里不谈它们的性能,主要谈谈使用和生态。
Influxdb:目前开源排名最高的时序数据库,是单独的数据库,主要就是用来写入和查询数据。目前集群版已经闭源商业化,开源版仅支持单机模式。数据采集使用push模式(数据源主动将数据写入influxdb)。优势是提供类SQL的查询引擎。

InfluxDB在DB-Engines的时序数据库排名中遥遥领先
Prometheus:提供了一整套的监控体系,包括数据的采集存储报警等。仅支持单机,数据写入本地。数据采集使用的是pull模式。
opentsdb:基于hbase做的时序数据库,最大的特点是由hbase带来的横向扩展能力,最大的缺点是hbase带来的笨拙感,一旦集群扩大,运维可能会烦死人。
二、时序数据库要解决的痛点
公司内部团队曾经用mysql+中间件做过一款伪时序数据库,但是由于mysql底层的存储形式导致其天然不适应时序数据的场景。且其写入能力也完全无法满足时序数据大量写入的要求。
那么时序数据的特点是什么呢?
1、数据随着时间增长,根据维度取值,而数据纬度几乎不变。
2、持续高并发写入,设备越多,写入数量越大,而且由于定期采样,写入量平稳。但是几乎不会有更新操作(一个设备在某个时间点产生的数据不会变动)以及单独数据点的删除(通常只会删除过期时间范围内所有的数据)
3、查询一般都是查最近产生的数据,很少会去查询过期的数据。
4、设备之间的数据关联性小,同种类设备A和设备B产生的数据互相并不依赖。你并不需要join。
由上述特点结合我与iot行业相关人员的探讨,我总结出以下时序数据库要解决的痛点
1、海量设备带来的写入压力
2、如何高效存储大量纬度相同仅值和时间戳不同的数据
3、能够方便的剔除过期数据,或者能够把数据冷热分离以降低存储成本
4、传统企业it人员专业素质不高带来的对整个时序数据库体系的易用性要求
三、现有产品已经满足的和缺失的
假如你要问我写多读少的场景适合什么算法?显然那就是LSM Tree。更妙的是,时序数据很少有更新、删除操作,对事物的需求也不高,这很好的规避了LSMT对于update和delete上的缺陷。市面上的时序数据库基本都是采用LSM Tree的架构。
关于数据的压缩,很容易的能想到同纬度的数据压缩,时间戳前缀压缩等想法,这些在各家数据库都有体现。当然opentsdb似乎由于底层的hbase无法更好的针对时序数据的特点进行压缩,与之类似的问题是opentsdb必须手动去根据时间段来管理数据,而Influxdb、Prometheus包括Graphite等都是可以自己根据时间段来分割数据的。这样当你要删除过期数据时,只要删除对应的block就行。
对于数据查询,经常有人吐槽SQL不太行,所以有后面的NO-SQL出现。但是当大家真的想去做些分析时,还是不由自主的想念SQL,想在KV上用上SQL(new sql),哈哈哈,SQL真香。所以好的内置的针对时序数据的sql引擎也是让人感到愉悦、不可缺少的东西。目前Influxdb在这一块大大领先。
如果你想长时间保存数据,一个比较麻烦的问题是单机总是有容量上限的,即使你做一个上层中间件来搞一个所谓的集群。另外关于高可用,坏盘、数据迁移等等是真实的让人头痛的东西,我个人比较反感简单的双写,毕竟你要浪费两倍的CPU和内存,LSMT的Compaction带来的写放大本来就让人头疼,你还要对你的数据做两次,OMG!(李佳琦脸)真让人接受不能。
遗憾的是目前除了opentsdb似乎都落本地,麻烦事儿。
四、时序数据库架构
在数据库领域,只要你上生产,你就得考虑HA、数据可靠性,你就得考虑你的运维难度和成本,否则性能再高,也只是个PPT产物。
在时序数据库这一块,我讨厌简单的双写,同时我对于上层弄个一致性协议去搞所谓的分布式不是很感冒:只要数据要同时处理(解压,压缩)多次的,都挺浪费的。
你也可以选择分库分表分设备,但是底层似乎也是单点的,且单点上也要做主备,emmm。
我认为计算存储分离是个好方向。底层存储像hdfs一样,数据写(解压、压缩)一次,剩下两份直接副本传输(或者做EC),美妙。
上层是时序数据库引擎,下层是分布式文件/块存储。
显著的好处是对同一份数据的compaction肯定只要做一次(读取-compaction-写入文件-副本拷贝),而且免去了坏盘,物理机down等的烦恼。数据扩容/冷热分离也较为方便。同时对于一写多读相对友好(类似阿里的Polardb)
缺点嘛,多个计算节点写同一份数据比较麻烦,需要分布式锁来同步,不过在iot下设备天然可分割,设备区1的设备数据无需与设备区2的监控等数据做join等,那么为什么不能把无瓜葛的设备数据写在不同的实例里呢?这样似乎能较好的缓解写入的压力。(另一种形式的分库分表?)
这里希望有人能探讨一下。
总结
时序数据库确实在iot/监控这一方面是专精的,其在时序数据写入/查询/数据压缩方面有巨大的优势,能够解决许多用户痛点。而现有的时序数据库在存储方面还有所不足,要么是单机的,要么难以维护(opentsdb)。可改造的地方还有很多。
不过更高的查询性能,更快的写入速度,更方便低成本的运维,人人想要。一旦业务规模上来,各方面的需求都应该且会被考虑到,却并不可能都被满足。做工程本质上还是不断地做Trade Off。如何取舍还是要在实际生产应用中去选择。
相关文章:
为啥用 时序数据库 TSDB
前言 其实我之前是不太了解时序数据库以及它相关的机制的,只是大概知晓它的用途。但因为公司的业务需求,我意外参与并主导了公司内部开源时序数据库influxdb的引擎改造,所以我也就顺理成章的成为时序数据库“从业者”。 造飞机的人需要时刻…...
Linux命令·cp
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一。一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数。但是如果是在shell脚本…...
SAP GUI快捷键
快速调整字体大小 Ctrl + 鼠标滚轮 剪切一行 Ctrl Shift X 删除一行 Ctrl Shift L 复制一行 Ctrl Shift T 转成小写 Ctrl L 转成大写 Ctrl U 大小写相互转换 Ctrl K 取消 Ctrl Z 重做 Ctrl Y 原地复制一行 Ctrl D 一次性注释多行 …...
【Java】序列化与反序列化
1. 对象的序列化机制是什么? 对象序列化机制允许把内存中的Java对象转化成语平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。 当其他程序获取了这种二进制流,就可…...
面向对象的使用
目录1. 类和对象的概念类对象类和对象的关系2. 定义简单的类(只包含方法)3. 创建对象4. self参数5. 类的初始化方法在初始化方法内部定义属性在初始化方法内部接收参数定义属性6. 类的内置方法使用__del__ 方法__str__ 方法7. 身份运算符is 与 区别:8. …...
LPDDR4x 的 学习总结(3) - SDRAM基本功能
上一节,我们重点介绍了array的存储结构。 本节介绍array周边的电路,对DDR的基本读写操作的相关功能模块的理解。 即通过哪些模块可以实现对ddr的基本读写。最简化的方式是把存储操作理解为行列选择,拆分为横竖两个纬度,最终实现对arrary进行读写。横向…...
设计模式(三)--适配器模式(Adapter Pattern)
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作.比如我们日常开发中使用到的slf4j就使用了适配器模式,slf4j提供了一系列打日志的api,底层调用的是log4j或者logback来打日志,而作为调用者,不需…...
Web服务器基础介绍与Apache的简单介绍(LAMP架构与搭建论坛)
目录 Web服务器基础介绍 一.HTML是什么? 二.静态网页和动态网页 1.静态网页 2.动态网页 3.动态网页语言 三.HTTP协议 1.HTTP协议是什么? 2.HTTP方法 3.HTTP状态码 4.HTTP请求流程分析 4.1 请求报文 4.2 响应报文 Apache的简单介绍 一.Apa…...
Linux 进程:exec函数簇
目录(1)execl(2)execlp(3)execle(4)execv(5)execvp(6)execve在进程控制中提到,子进程的最大价值在于程序替换,…...
极简RSS订阅器Miniflux
什么是 Miniflux ? Miniflux 是一个极简主义的 RSS 阅读器。它简单、快速、轻便且非常易于使用。Miniflux 是静态编译的单个二进制文件,没有使用任何复杂的框架,也没有外部依赖,简单、快速、轻巧且超级容易安装。支持 Atom、RSS 1…...
网络通信快速入门
🏡个人主页 : 守夜人st 🚀系列专栏:Java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 目录网络编程实现网络编程的三要素&#x…...
【阅读文档】Vue.js 2.0 之教程文档
系列文章目录 提示:阅读本章之前,请先阅读目录 文章目录系列文章目录前言兼容性Devtools开发版和生产版安装Vue-cli编译器Vue.js 是什么最基本的Vuev-bind 指令split 和 reverse 搭配v-model 双向绑定vue-component 定义组件v-bindObject.freeze箭头函数…...
Docker【基本使用】
1:启动Docker1.1:操作systemctl start docker.service1.2:常见问题【第一步】启动docker,提示启动失败,查询运行状态systemctl start docker.service【第二步】查询docker运行状态,提示不支持SELinux【第三…...
算法leetcode|39. 组合总和(rust重拳出击)
文章目录39. 组合总和:样例 1:样例 2:样例 3:提示:分析:题解:rustgoccpythonjava39. 组合总和: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找…...
JavaSE学习笔记总结day18
今日内容 零、 复习昨日 一、作业 二、进程与线程 三、创建线程 四、线程的API 五、线程状态 六、线程同步 零、 复习昨日 晨考 一、作业 见答案 二、进程与线程[了解] 一个进程就是一个应用程序,进程包含线程 一个进程至少包含一个线程,大部分都是有多条线程在执行任务(多线…...
HybridFusion: LiDAR和视觉交叉源点云融合
一、基本信息 研究方向: 大场景点云配准 HybridFusion: 它可以在户外大型场景中从不同视角记录交叉源密集点云。 团队链接:http://www.adv-ci.com 视频链接: https://www.bilibili.com/video/BV1vM41147yD/?spm_id_from333.337.sear…...
走进JVM
JVM的位置 在操作系统之上,可以想象成一个软件,Java程序都运行在上面 JVM结构图 JVM调优的位置 99%的调优在堆中,极少数在方法区中 很多第三方插件都是在执行引擎那块地方做出修改而来,比如Lombook在程序运行时动态生成get/s…...
C语言-基础了解-15-C函数指针与回调函数
C函数指针与回调函数 一、函数指针 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。 函数指针变量的声明: type…...
react和vue在响应式上的不同理解
vue和react的区别总是被提及,关于这个问题最近也有了自己的想法。我认为它们之间最大的区别是对于响应数据变化的实现方式不同。 vue实现响应的方法是,首先收集依赖这个数据的副作用(视图更新、计算属性等),当数据修改…...
多线程二 多线程了解与使用
文章目录synchronized 锁有两种synchronized异常捕获主线程和子线程volatile的作用notify是随机启动等待线程中的一个synchronized 锁有两种 类对象类的实例 第一种:锁类对象,有两种方式,如下: // 方法一:synchroni…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
