原标题:技术解读:Facebook开源内存数據库Beringei如何做到极致的压缩率
2017年2月3日,Facebook宣布将开源他们的高性能时序数据存储引擎Beringer本文将会详细介绍Beringei的来龙去脉以及它的设计思路、应鼡场景和特点。并带来链家网大数据工程团队的贺红涛、赵鹏的技术解读
Beringei是用来解决其内部监控数据存储和查询需求的数据库,其特点昰读写速度快属于内存数据库的一种。
运维大规模的分布式服务通常需要对内部系统的运行状况和性能指标进行实时并精确的监控,鉯便在第一时间发现、诊断、处理出现的问题
Facebook使用时间序列数据库(TSDB)跟踪和存储系统度量指标,比如说产品的统计信息(每分钟发送哆少消息)、服务的统计信息(命中缓存层与MySQL层的查询速率)以及系统的统计信息(CPU、内存和网络的使用情况)等等,基于这些数据运維人员就可以看到基础设施上的实时负载情况并指定策略决定如何分配资源。
Facebook的每个系统、服务每秒需要向存储引擎写入成百上千个数據指标而负责进行数据分析的工程师可以实时查询这些数据。
2013年初随着公司和系统的不断发展,Facebook的存储引擎监控团队发现HBase使用的TSDB无法靈活扩展导致未来可能无法处理高并发的读取负载。如果是分析少量数据平均读取延迟可以接受,但是试图实时处理大量数据的需求無法满足用户体验很差。大批量数据查询时间可能需要数秒钟这对于可能需要发出数百个或数千个查询来执行分析的自动化工具来说昰不可接受的。几千个时间序列的查询请求要花几十秒的时间来执行针对稀疏数据集执行的查询可能会超时,这是因为HBase数据存储经过调整后策略改为优先处理写入操作。
由于查询性能太差监控系统无法实时处理大规模分析。Facebook团队在评估和否决了几款基于磁盘的解决方案和现有的内存缓存解决方案后存储引擎开发团队将注意力转移到自行编写内存TSDB方案,以支持Facebook的运行状况和性能监控系统团队在VLDB2015大会仩发表了一篇名为《Gorilla:一种快速、可扩展的内存时间序列数据库》的文章,Beringei正是基于这项工作成果的进一步发展
Beringei基于BSD协议,它不同于其怹的内存系统(比如Memcached)Beringei通过优化,支持存储专门用于运行状况和性能监控的时间序列数据设计Beringei的初衷是为了更高的写入速率和更低的讀取延迟,同时尽可能高效地使用内存来存储时间序列数据Facebook团队创建了一种系统,该系统可以存储最近24小时内在Facebook生成的所有性能和监控數据以便Facebook在生产环境中遇到问题后,可以极快地探究并调试系统和服务
数据压缩对于帮助降低存储开销必不可少。Facebook考虑了现有的压缩方案仅适用于整数数据的方法、使用近似技术的方法,以及需要对整个数据集进行操作的方法都被Facebook否决了
Beringei使用一种无损耗数据流压缩算法,压缩时间序列里面的数据点不进行跨时间序列的额外压缩。每个数据点是一对64位值表示当时计数器的时间戳和值。时间戳和值使用前一个值的信息单独压缩时间戳压缩使用delta-of-dalta编码方式,通过采用规则的时间序列在较少的内存内存储时间戳
Facebook团队分析了存储的性能監控系统中的数据后发现,大多数时间序列中的值与相邻数据点相比并没有显著的变化此外,许多数据源只存储整数(尽管系统支持浮點值)
知道这一点后,只要使用XOR将当前值与先前值进行比较然后存储发生变化的比特。最终该算法将整个数据集至少压缩了90%。
-
创建┅个简单的共享服务和客户端后者可以存储和处理时间序列查询请求。
-
Beringei可以用作一个嵌入库处理高效存储时间序列数据的底层细节。鉯这种方式使用Beringei类似RocksDBBeringei有望成为支持其他性能监控解决方案的高性能存储系统。
Beringei作为库的使用具有下列特点: