关于时间序列数据库的思考——(1)运用hash文件(例如:RRD,Whisper) (2)运用LSM树来备份(例如:LevelDB,RocksDB,Cassandra) (3)运用B-树排序和k/v存储(例如:BoltDB,LMDB)
转自:http://0351slc.com/portal.php?mod=view&aid=12
近期网络上呈现了有关catena、benchmarking boltdb等时刻序列存储办法的介绍,Go社区也有相似的谈论论题,呈现了seriesly、influxDB、prometheus等优异项目。原文作者Jason moiron现在从事Datadog有关工作,文中他关于时刻序列数据库宣布了一些观点,(网友们在Hacker News上也有精彩的谈论)咱们一起来认识下。
时刻序列模型和图形式先于计算机呈现,可是直到90年代初伴随着MRTG的呈现才逐步发展壮大。这些体系的不断老练是有缘由的:“大数据”的“岂止于大”;虚拟化和容器化带来了可观的分布式运用节点增量;云效劳对摩尔定律提出了挑战。
时刻序列存储层(Time-series Storage Layer)
大家常常会这么问自己:
- 有对写入进行优化吗?
- 有对读取进行优化吗?
- 数据库要支援哪种语义学才干运用户得到想要的查询成果呢?
假如前两个疑问的答案是“是”,存储层就必须一起对写入和读取进行优化。
假如你企图对一个已索引的数据库进行多个序列写入,幻想下这是一个富含主键,时刻戳,值等数据的SQL表,那么当要处理读请求时就不得不处理巨大的数据。假如你把序列分隔写入,那么这或许是最差劲的写入形式:高频跨数据写入。
我看到有的开发者的做法是:
- 运用文件(例如:RRD,Whisper)
- 运用LSM树来备份(例如:LevelDB,RocksDB,Cassandra)
- 运用B-树排序和k/v存储(例如:BoltDB,LMDB)
这些做法有长处也有缺点。这儿无妨测验别的办法,时刻序列是一个多点矢量,因而要做的本来很简略:
- 创立一个新矢量
- 找出一个矢量(不一样的)
- 附加到矢量上(0(1))
- 从矢量读取数据
运用文件
显然一切数据库都是“文件式”的,但我这儿所指的是文件即序列(file-as-a-series)的办法。透过该办法,你能够得到高效的缓冲附加并可进行自在的缓存线性读取。关于高档文件体系如zfs,ext4,xfs等来说,目录记录查找是根据hash表的,也即意味着是0(1)。
文件体系越来越杂乱而变得难于了解,因而需求一些黑艺术来对它进行调节。虽然有些体系的规划意图是为了处理百万级的文件,可是还没有专门关于小文件而做的优化处理。这么就致使了关于少数数据查询来说,许多时分都会存在空页浏览的状况。最后,会遍历整个数据集,这关于备份,批量工作等操作都是有主要影响的。
运用根据树的存储办法
当运用根据树的KV存储办法时,能够有几种完成办法。键能够辨认一个单序列,或一个单点,或一个序列中的某个时刻片。无论你的键构造甚或树相似的选择是什么,键查找都会是O(log n),然后在表上会留有许多空白。
关于大规模存储时,假如点的数量过于巨大,这关于CPU缓存是个灾祸;因而把数据看成是{series, timestamp} -> {point}的KV对是不会工作的。关于小规模数据,开源时刻序列存储是测验运用相似的办法来处理,可是我很有信心肠说,换用文件会愈加简略和方便,除非你要常常读取很许多的数据集。关于O(log n)查找,我可不想在读取上花费许多时刻。
所以接下来要重视写入端,这是一个难点。运用双B树的COW办法看起来不适合于许多的随机写入。在实践中这无妨做进一步的研究。一切这些运用mmap及频频微量写入时,会对你的数据库形成许多页阅览,然后致使f/msync的I/O处于高负荷状况。附加在LSM上也许状况会好些,可是树兼并紧缩操作也是一个高强度工作。
总的来说,树关于写入和读取都是能够统筹的,这是极好的互补办法。
查询语义
我以为时刻序列存储所需的仅有语义支撑应该是能够进行批量和并行读取;而其他的如紧缩读取规模,非常好的外部完成,还有对时刻序列存储的束缚等都是加分项。
维度
根据我的开发经验,发现维度是至关主要的;从商品层面看,缺少对它的支撑将会使你的商品被替代。
把一切的元数据都存入衡量键中,然后以键/值(K/V)查找的办法来进行查询不最优的处理办法;你最少要具有or/and和逻辑操作来完成跨维度;例如:eg: az=us-east-1 AND role=db-master, version=2.1 OR version=2.3,若有更丰厚操作的言语则非常好。但关于存储层来说需求支援任何的额定语义来完成这些优化吗?在维度存储中,查询中的索引要么指向了许多无关数据的元组,要么包含了数据自身然后致使写入缓慢。SSD办法或许好些,但仍需读取一切数据页才有效;数据方位仍是个疑问。
聚合,失效等
时刻聚合和数据失效在轮询调度中的主要性显而易见,这仍是开源的规范。例如rrdtool,graphite等。
此外还有几个主要疑问亟需处理。RRD是连续空间,但时刻序列的运用通常包含了许多的稀少序列。别的,关于写入的紧缩/聚合会使写入操作变得巨大。聚合和失效看起来很像维度:能够在一个独立策略层中异步完成。
关于时间序列数据库的思考——(1)运用hash文件(例如:RRD,Whisper) (2)运用LSM树来备份(例如:LevelDB,RocksDB,Cassandra) (3)运用B-树排序和k/v存储(例如:BoltDB,LMDB)的更多相关文章
- ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库,表空间,数据文件
ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库.表空间.数据文件 仅仅有使用过的block能够被备份成backup set 表空间与数据文件相应关系:dba_data_file ...
- [转帖]时间序列数据库 (TSDB)
时间序列数据库 (TSDB) https://www.jianshu.com/p/31afb8492eff 0.3392019.01.28 10:51:33字数 5598阅读 4030 背景 2017 ...
- 时间序列数据库调研之InfluxDB
基于 Go 语言开发,社区非常活跃,项目更新速度很快,日新月异,关注度高 测试版本 1.0.0_beta2-1 安装部署 wget https://dl.influxdata.com/influxdb ...
- 时间序列数据库(TSDB)初识与选择
时间序列数据库(TSDB)初识与选择 本文作者由 MageByte 团队的 「借来方向」编写,关注公众号 给你更多硬核技术 背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工 ...
- 时间序列数据库(TSDB)初识与选择(InfluxDB、OpenTSDB、Druid、Elasticsearch对比)
背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工智能.物联网.机器学习.商业智能.智能预警啊等等. 以前的系统,做数据可视化,信息管理,流程控制.现在业务已经不仅仅满足于这 ...
- Akumuli时间序列数据库——列存储,LSM,MVCC
Features Column-oriented time-series database. Log-structured append-only B+tree with multiversion c ...
- OpenTSDB介绍——基于Hbase的分布式的,可伸缩的时间序列数据库,而Hbase本质是列存储
原文链接:http://www.jianshu.com/p/0bafd0168647 OpenTSDB介绍 1.1.OpenTSDB是什么?主要用途是什么? 官方文档这样描述:OpenTSDB is ...
- 时间序列数据库选型——本质是列存储,B-tree索引,抑或是搜索引擎中的倒排索引
时间序列数据库最多,使用也最广泛.一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper.这 ...
- 时间序列数据库武斗大会之 KairosDB 篇
[编者按] 刘斌,OneAPM后端研发工程师,拥有10多年编程经验,参与过大型金融.通信以及Android手机操作系的开发,熟悉Linux及后台开发技术.曾参与翻译过<第一本Docker书> ...
随机推荐
- 历史命令history
历史命令在用户注销之后会保存在用户家目录下的-/.bash_history中 history #查看系统中实时缓存的历史命令,与.bash_history中的内容并不完全相同 history -c # ...
- Codeforces Round #257 (Div. 2) A题
A. Jzzhu and Children time limit per test 1 second memory limit per test 256 megabytes input standar ...
- 检测服务器IP端口是否可用
private static double Scanner(string ip, int port) { try { System.Net.Sockets.TcpClient Tcp = new Sy ...
- Spring环境的搭建与测试 (spring2.5.6)
这里是采用的视频里面的spring版本 下载spring2.5.6, 然后进行解压缩,在解压目录中找到下面jar文件,拷贝到类路径下 dist\spring.jar lib\jakarta-commo ...
- Div里面载入另一个页面的实现(取代框架)(AJax)(转)
随着框架越来越不火了,HTML5就不对框架支持了,iframe也只有url了,Div就担当了此大任 DIV+CSS在页面部局确实也很让人满意,使用也更方便 今天突然遇到一个问题,那就是需要导入另一个页 ...
- java实现excel与mysql的导入导出
注意:编码前先导入poi相关jar包 1 /** * 读excel 到list * * @param file excel file * @param fields 字段数组 * @return * ...
- JS常用方法函数
document.write("");为 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,bod ...
- surfaceview介绍
[1]surfaceview 控件是一个重量级控件 [2]内部维护了2个线程 A 获取数据 负责显示 B 负责显示 获取数据 [3]他可以直接在子线程更新ui ...
- Android网络编程系列 一 TCP/IP协议族之传输层
这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 传输层中有TCP协议与UDP协议. 1.UDP介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,U ...
- JavaWeb 7 Servlet
7 Servlet Servlet学习的大纲:1. servlet概念及相关接口简介2. servet 执行过程3. servlet路径映射4. 缺省servlet --应用5. s ...