QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

深入浅出时序数据库之分级存储

  • 2017-07-25
  • 本文字数:3016 字

    阅读完需:约 10 分钟

物联网领域近期如火如荼,互联网和传统公司争相布局物联网。作为物联网领域数据存储的首选,时序数据库也越来越多进入人们的视野,而早在 2016 年 7 月,百度云在其天工物联网平台上发布了国内首个多租户的分布式时序数据库产品 TSDB,成为支持其发展制造,交通,能源,智慧城市等产业领域的核心产品,同时也成为百度战略发展产业物联网的标志性事件。

前文提到低成本的存储是时序数据库需要解决的一个主要问题,而上一篇文章介绍了通过针对时序数据的压缩方法,从利用数据本身特征的方面,降低时序数据的存储成本。

本文将介绍通过对数据进行分级存储,从使用不同存储介质,以及减少数据的副本数的方面,介绍如何在保证时序数据的查询性能的前提下,降低时序数据的存储成本。

1. 分级存储

分级存储,就是按某一特征,将数据划分为不同的级别,每个级别的数据存储在不同成本的存储介质上。为什么需要对数据进行分级存储?为什么不把所有的数据都存储在最便宜的存储介质上?这是因为在降低存储成本的同时,还需要保证数据访问的性能(我们知道,存储介质的读写性能与成本一般成正比),分级存储是对两者比较好的平衡方法。分级存储的这一思想也体现在计算机的体系结构里(寄存器、L1/L2 Cache、内存、硬盘)。

2. 时序数据的分级存储

时序数据应该按什么特征进行分级呢?时序数据的时间戳是一种非常合适的分级依据,越近期的数据查询得越多,是热数据;越久以前的数据查询得越少,是冷数据。例如,用户会经常查询一个设备的最新温度,或者查看这个设备最近 1 小时或者最近 1 天的温度曲线;很难想象用户会经常查询一个设备 1 年前的温度,这些 1 年前的数据一般会用于大数据分析或者机器学习中,而这些批处理的场景一般对查询的延时不会像交互式场景那么敏感。

如图 1 所示,一般可以将时序数据分为 3 级,第一级是最近 1 天的数据保存在内存缓存 Cache 中,第二级是最近 1 年的数据存储在固态硬盘 SSD 中,第三级是 1 年以上的数据存储在机械硬盘 HDD 中。Cache 中的数据可以使用写回(write back)或者写通(write through)的策略写入 SSD,而 SSD 中的数据可以通过后台程序定期批量的迁移到 HDD。为了保证数据持久性,一般会为数据保存 2 个或者 3 个副本,通过 EC 编码可以将副本数降低到 1.5 甚至更低,但却不影响数据的持久性。不过 EC 编码会消耗更多的 CPU 和网络带宽,进而影响查询性能,因此一般只应用在存储冷数据的 HDD 上。

(点击放大图像)

图1 时序数据的分级存储

3. 内存缓存

时序数据库大部分请求的数据都集中在最近 1 天,将这些数据保存在内存中,可以保证这些数据能被快速的读取。虽然内存的访问速度快,但是成本很高(价格大约比 SSD 高一个数量级),并且容量有限。因此需要对数据进行压缩,以减少每个数据的内存占用,压缩相关的内容已经在上一篇文章中进行了介绍,在这里不再赘述。另一方面,由于内存中的数据是易失的、非持久化的,一旦重启进程或者重启机器后就会丢失,如果不恢复数据,所有请求将落到下一级的存储上,对下一级存储造成巨大的压力。因此一般会在写入内存的同时写入本地硬盘,在重启后重新加载到内存中。

Beringei 是 Facebook 开源的一款内存时序数据库,是 Facebook 发表的 Gorilla 论文的开源实现。Beringei 使用一种三级的内存数据结构,如图 2 所示,其中第一级为分片索引,第二级为时间序列索引,第三级为时序数据,通过该数据结构可以支持快速的数据读写;Beringei 实现了一种高效的流式的压缩算法,从而使内存占用最小化;Beringei 支持写入内存的同时写入硬盘,并在重启后恢复数据。然而 Beringei 也有一些限制,譬如只支持浮点型数值、时间精度只到秒、只能按时间戳顺序的写入数据。

(点击放大图像)

图2 Beringei 的内存数据结构

4. SSD 与 HDD

用户有时会关注时序数据在过去 1 周、过去 1 个月、过去 1 年的趋势,把最近 1 年的数据存储在固态硬盘 SSD 上,可以实现在秒级甚至亚秒级读取过去 1 年的数据。而 1 年以上的时序数据则很少用于交互式查询,这些数据往往会用于大数据分析或者机器学习,这些批处理场景对查询的延时不会像交互式场景那么敏感,因此可以把这些 1 年以上的数据存储在机械硬盘 HDD 上。

SSD 的价格大约是 HDD 的几倍,但是 SSD 的性能要远远高于 HDD。在前文中我们介绍过,时序数据库会对时序数据进行分片,一个分片的数据会连续的存放在一台机器的硬盘上,因此读取一个分片的数据是顺序读取的。对于顺序读取来说,SSD 和 HDD 的性能是差不多的,因此这种存储方式对于 SSD 和 HDD 来说都是合适的。但是,一台机器上会存储大量的分片,当同时读取多个分片时,硬盘的访问就变成了随机读取。对于随机读取来说,HDD 由于需要平均 10 毫秒的寻道时间,因此只能做到百这个量级的 IOPS,而 SSD 能做到万级甚至十万级的 IOPS,比 HDD 高 2 到 3 个数量级(注 3)。由此可见,HDD 只能应付批处理这种并发量较低、顺序读取大量数据的场景,而只有 SSD 能支持高并发、低延时的交互式查询场景。

5. EC 编码

为了保证时序数据在机器宕机、硬盘故障的时候还能正常的访问、不会丢失,也就是为了保证数据的可用性和持久性,会为数据保存多个备份(也称为副本),根据可用性和持久性的需求一般是保存 2 到 3 个副本,这样当其中的 1 个或者 2 个机器宕机、硬盘故障的时候也能保证数据的正常访问以及不会丢失。但是这也大大增加了存储的成本,3 个副本就是 3 倍的存储成本。通过 EC 编码,可以将存储成本降到 1.5 倍,同时不会降低数据的可用性和持久性。

EC 编码全称是 Erasure Coding 纠删码,是一种数据保护技术,最早应用于通信行业的数据传输的数据恢复中,同时也用于 RAID-5 和 RAID-6 存储阵列技术中。EC 编码主要是利用算法对原始数据块进行编码得到校验块,并将原始数据块和校验块都存储起来。当原始数据块丢失时,通过其他原始数据块以及校验块能重新计算出丢失的数据块;当校验块丢失时,重新计算即可得到校验块。这样就能对丢失的数据进行恢复,从而达到容错的目的。对于 k 个原始数据块和 m 个校验块,算法能保证在丢失任意 m 个块后,都可以通过算法恢复出原来的 k 个原始数据块。如图 3 所示,一个生成矩阵 GT 乘以 k 个原始数据块组成的向量,可以得到由 k 个原始数据块和 m 个校验块组成的向量。

(点击放大图像)

图3 EC 编码过程(注4)

将EC 编码应用于时序数据,关键问题在于如何定义什么是数据块。一种直观的方法是一个分片作为一个数据块(注意,一个分片是存储在一个机器上的,不同的数据块是存储在不同机器上的,因此不应该把一个分片再划分为多个数据块)。但是由于分片的数据量不一致,需要将数据块都对齐到最大的数据块,而且得到的校验块也是跟最大的数据块一样大,这会导致存储空间和计算资源的浪费。举个极端的例子,譬如1 个分片的大小是1M,其他k-1 个分片的大小都是1K,那么就需要将这k-1 个分片都对齐(可以通过补0)到1M 再计算EC 编码,得到的m 个校验块都是1M 的。更好的方法是利用底层存储的数据块作为EC 编码的数据块,譬如使用Hbase 存储时序数据的话,就可以利用底层HDFS 提供的EC 编码功能

6. 总结

根据时序数据天然的时序上的冷热划分,可以对时序数据进行分级存储,将最近的最热的数据保存在内存中,将中期的次热数据存储在 SSD 上,将远期的冷数据存储在 HDD 上,能在保证查询性能的前提下,降低存储成本。另外,通过 EC 编码技术,能减少数据的副本数,从而使存储成本能降至更低的水平。

2017-07-25 17:533460

评论

发布
暂无评论
发现更多内容

极狐(GitLab)与原森科技达成战略合作,共筑FinDevOps业财融合解决方案

科技热闻

什么是真正的 HTAP ?(二)挑战篇

StoneDB

MySQL OLAP OLTP HTAP StoneDB

零基础学习前端技术方法推荐

小谷哥

零基础学习大数据开发技术

小谷哥

Moonbeam Orbiters Program:为收集人参与 Moonbeam 和 Moonriver 提供新方式

One Block Community

区块链 科技

【7.15-7.22】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

iOS中@class和#import

NewBoy

ios 前端 移动端 iOS 知识体系 7月月更

LED显示屏和液晶透明拼接屏有什么区别?

Dylan

LED显示屏 led显示屏厂家

web前端开发技术就业前景怎么样

小谷哥

CESS 测试网上线!首个提供多元应用场景的去中心化存储网络

One Block Community

区块链 科技

单点登录的三种方式

Authing

云原生 SaaS SSO 单点登录 Authing

RocketMQ系列二:RocketMQ监控/告警一站式搭建应用

hum建应用专家

数据库 RocketMQ

音乐 NFT 为什么火了?Polkadot 或将成为发展音乐 NFT 的最佳选择

One Block Community

区块链 科技

Redis 做接口限流,一个注解的事!

江南一点雨

Java redis springboot

如何在java开发行业有更好前景

小谷哥

你的 NFT 会消失吗?DFINITY 提供 NFT 存储最佳方案

TinTinLand

区块链 科技

国内首台商用人形双足机器人发展史

优必选科技

机器人

李宏毅《机器学习》丨6. Convolutional Neural Network(卷积神经网络)

AXYZdong

机器学习 7月月更

如何通过在线协作文档提高办公效率

Baklib

性能大规模专项评测双通过,数牍Tusita步入隐私大数据计算时代

Jessica@数牍

隐私计算性能 数牍科技 可信隐私计算评测

腾讯5G创新中心成立,布局无人港口、智慧矿山、电竞赛事等重点方向

科技热闻

Java Idea插件Easy Code

孙永潮

idea插件

稀缺性之于Web3:如何成为去中心化世界的胜利者

One Block Community

区块链 科技

【字体反爬】目标站点5Lq65Lq66L2m(Base64加密),Python反爬系列再次更新

梦想橡皮擦

Python 爬虫 7月月更

App自动化测试是怎么实现H5测试的

和牛

测试

Spring Security 中的权限注解很神奇吗?

江南一点雨

观测云产品更新|新增智能巡检功能;新增用户访问指标检测事件通知模板变量等

观测云

2022可信云权威评估公布:天翼云获十项认证、五项最佳实践

Geek_2d6073

如何选择靠谱大数据课程

小谷哥

搭建实用的产品帮助文档,提升用户满意度

Baklib

暗黑王者|ZEGO 低照度图像增强技术解析

ZEGO即构

低照度图像增强技术

深入浅出时序数据库之分级存储_数据库_百度云时序数据库资深工程师_InfoQ精选文章