为啥用 时序数据库 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…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
