饿了么时序数据库LinDB架构演进

简介: 2019年3月2日,阿里云栖开发者沙龙时序数据库专场中,饿了么技术经理黄杰分享了饿了么公司时序数据库从设计构建到监控一系列开发更新过程,揭秘了LinDB数据库内部架构并对LinDB未来的发展做出了展望。

以下内容根据演讲视频以及PPT整理而成。

饿了么的监控体系于2015年之前通过StatsD与Graphite技术建立,在2016年公司开发了第一个版本基于RocksDB的本地存储系统LinDB1.0,系统实现了全链路监控的自用型功能,基本满足了公司的需求。在2017年,公司通过扩展RocksDB将LinDB系统升级到了2.0版本。在2018年,公司参考RocksDB的思想基于排倒索引与自研存储开发的LinDB3.0版本,很好的提升了系统的性能,满足了业务上多活的需求。下图展示了公司数据库的发展历程。

1

基于LinDB系统优良的性能与公司增长的需求,饿了么公司的对LinDB数据库的不断改进的目标如下所示:

  1. 数据库监控体系结构足够轻量,减少维护所需人力物力;
  2. 体系支持Measurement、Tags与Fields技术;
  3. 可以解决指标写入的热点问题,采用Series技术进行Sharding过程,体系支持水平扩展;
  4. 支持近实时读写功能,高效快捷的查询出数据;
  5. 监控体系下的数据库支持多活;
  6. 自动的Rollup;
  7. 支持类SQL的查询方式;
  8. 安全性上高度可靠,可以支持多个副本;

2

二.系统整体架构
如下图所示是公司数据库的整体架构。
image

3

公司的数据库从结构上分为四层,不同于传统数据库在存储层进行多活,公司将多活设计在了计算层中,以此提升系统的效率。在数据写入层中,不同客户端的写入数据会存入对应的不同机房的集群中。在用户查询层中,用户将通过HTTP的访问对相应LinProxy模块中的数据进行查询。在系统的计算层LinProxy中,公司为不同的LinProxy定义了不同的逻辑集群,逻辑集群将通过相应的方式向对应的物理集群进行数据的查询。
在进行重量级查询时,数据会不断地从下层送到上层,导致在计算层中数据处理遇到瓶颈。系统的计算层采用了并行处理请求的方式,通过拓扑结构将数据一层层的送给用户。系统同样支持更高级的计算,例如对股票曲线的预算或时间线的预判等。

三.写入过程
如下图所示,数据在系统中的写入分为WAL的复制与本地写入两步。WAL复制的过程中,系统参考了Kafka设计方式,即用户只要写入WAL成功就被认为数据写入成功,通过这种方式提高了整个系统的吞吐量。本地写入过程中,用户将WAL的数据解析写入自己的存储结构中,并可以通过本地存储查到已写入的数据。

4

例如下图所示情景,在一份含有三个副本的数据中,用户将写入成功的副本一数据分别同步到副本二与副本三中,系统采用了透取技术,用“推”的方式将数据从Leader节点推送给Follower节点。系统的复制协议采用多通道复制协议,主要基于WAL在多节点之间的复制,WAL在每个节点上的写入由独立的写操作完成,所以当客户端写入对应Leader节点的WAL成功就认为本次写操作是成功的,Leader所在的节点负责把相应的WAL复制到对应的Follower中, 同理写WAL成功被认为复制成功。

5_

下图所示多通道复制的原理图,多通道复制技术仿照Kafka机制设计而来,这种设计理念将WAL视为巨大的数组以此实现将客户端上的数据一点点的写入。对于Leader节点有三个指针,分别代表写入指针,复制指针与复制完成后Follower的位置指针。通过多通道复制设计,系统提高了吞吐量,但同时降低了数据一致性的程度。

6_

系统本地写入存储数据的结构如下图所示,系统的一个数据库在单节点上会存在多个Shard,每个Shard负责各自的数据写入,并含有各自的WAL,所有Shard共享同一个索引数据。所储存的数据会根据数据库的Interval按时间片进行存储。系统的设计具有以下的优势:

  1. 方便处理TTL,遇到过期的数据使用者可以直接删除相应的目录;
  2. 每个Shard下面会存在Segment,Segment根据Interval来存储相应时间片的数据;
  3. 每个Segment下面按Interval方式存储了很多Data Family,以此减少数据文件之间的合并操作,平衡写入放大的问题;

7_

下图所示为数据本地写入的过程。系统会为每一个Shard启一个写线程,该线程负责这个Shard的所有写操作。在写入的过程中,系统首先会把Measurement、Tags、Fields对应的数据写入数据库的索引文件,并生成相应的ID数据。系统会根据索引得到的ID,结合写入时间和数据库Interval计算得到需要写入到对应Segment下的对应Family中。整个写过程先写内存,再由Flusher线程把内存中的数据推到相应的文件中。

8_

四.如何查询
下图所示为系统的查询过程。用户提交的请求首先到达Proxy层,在该层中进行SQL解析,并将解析的数据送到Aggregator Stream中进行聚合操作。系统通过LinProxy层中的LinConnect模块将处理好的请求发送到机房集群中,在机房集群中进行数据的反馈。ZooKeeper在系统中负责简单的Metadata存储。整个系统的操作采取了异步化的方式,这样可以利用系统线程在IO等待时做一些计算操作。

9

系统在节点层面上的数据查询过程如下图所示。该过程类似于Map操作,公司在节点层面上使用了Actor来替代传统的Task,大大增加了索引查询的效率。

10

五.存储结构
在存储过程中,对数据的索引分为ID与倒排索引两部分,系统首先将输入的字符串转换成Int类型,并根据Time Series的规则为数据生成对应的唯一ID。系统根据Tags标签进行倒排索引,将索引指向一个ID列表。TSID列表以BitMap的方式存储,以方便查询的时候通过BitMap操作来过滤出用户想要的数据。系统中的每一类数据都存储在独立的RocksDB Family中。系统的具体索引步骤如下图。

11

将数据中的字符串转换实例的过程如下图。系统首先将CPU数据、Host数据及地区数据全部转换为整型数字,再根据相应的数据规则对转换后的数字进行倒排解析,将解析后的数据存储入库。

12

13

系统的存储模式参考了LSM方式,下图列出了系统根据LSM方式设计的存储模式。

14

在系统存储的内存层面,系统设计了两个版本的Memory Table,一个负责写入数据,一个负责将数据写入文件中。在Memory Table中,每个Table都会拥有对应的Store及Block块。存储结构如下图所示。

15

系统的文件存储中使用同一个Measurement的数据以Block的方式存储在一起,查询时通过Measurement ID定位到该的数据所存储的Block中。在文件存储结构的尾部,系统指向了Metric索引,在索引块中包含了很多Offset模块,通过这种方式方便用户得知系统的版本号并加快索引速度。系统的文件存储结构如下图所示。

16

六.系统自身监控
系统拥有很好的自身监控能力。在系统自身监控的模块,使用者可以清晰看到系统各个方面的运行情况,通过每项数据的变动,使用者可以清楚掌握系统目前的状况,监控数据示意图如下图所示。

17

18

19

相关文章
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与最佳实践
在微服务架构中,数据库访问的效率直接影响到系统的性能和可扩展性。本文探讨了优化微服务架构中数据库访问的策略与最佳实践,包括数据分片、缓存策略、异步处理和服务间通信优化。通过具体的技术方案和实例分析,提供了一系列实用的建议,以帮助开发团队提升微服务系统的响应速度和稳定性。
|
存储 关系型数据库 数据库
高性能云盘:一文解析RDS数据库存储架构升级
性能、成本、弹性,是客户实际使用数据库过程中关注的三个重要方面。RDS业界率先推出的高性能云盘(原通用云盘),是PaaS层和IaaS层的深度融合的技术最佳实践,通过使用不同的存储介质,为客户提供同时满足低成本、低延迟、高持久性的体验。
|
存储 Cloud Native 关系型数据库
PolarDB开源:云原生数据库的架构革命
本文围绕开源核心价值、社区运营实践和技术演进路线展开。首先解读存算分离架构的三大突破,包括基于RDMA的分布式存储、计算节点扩展及存储池扩容机制,并强调与MySQL的高兼容性。其次分享阿里巴巴开源治理模式,涵盖技术决策、版本发布和贡献者成长体系,同时展示企业应用案例。最后展望技术路线图,如3.0版本的多写多读架构、智能调优引擎等特性,以及开发者生态建设举措,推荐使用PolarDB-Operator实现高效部署。
585 4
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
897 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
存储 SQL 并行计算
【赵渝强老师】达梦数据库MPP集群的架构
达梦数据库提供大规模并行处理(MPP)架构,以低成本实现高性能并行计算,满足海量数据存储和复杂查询需求。DM MPP采用完全对等无共享体系,消除主节点瓶颈,通过多节点并行执行提升性能。其执行流程包括主EP生成计划、分发任务、各EP并行处理及结果汇总返回。为确保高可用性,建议结合数据守护部署。
629 0
|
SQL 弹性计算 安全
【上云基础系列04】基于标准架构的数据库升级
本文回顾了业务上云从基础到进阶的理念,涵盖基础版和全栈版架构。在“入门级:上云标准弹性架构基础版”的基础上,本文针对数据库升级,重点介绍了高可用数据库架构的升级方案,确保数据安全和业务连续性。最后,附有详细的“上云标准弹性架构”演进说明,帮助用户选择合适的架构方案。
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库

热门文章

最新文章

相关产品

  • 云原生多模数据库 Lindorm