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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云数据库 Tair(兼容Redis),内存型 2GB
简介: 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

相关文章
|
2月前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
2月前
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与最佳实践
在微服务架构中,数据库访问的效率直接影响到系统的性能和可扩展性。本文探讨了优化微服务架构中数据库访问的策略与最佳实践,包括数据分片、缓存策略、异步处理和服务间通信优化。通过具体的技术方案和实例分析,提供了一系列实用的建议,以帮助开发团队提升微服务系统的响应速度和稳定性。
|
21天前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
22天前
|
缓存 关系型数据库 MySQL
高并发架构系列:数据库主从同步的 3 种方案
本文详解高并发场景下数据库主从同步的三种解决方案:数据主从同步、数据库半同步复制、数据库中间件同步和缓存记录写key同步,旨在帮助解决数据一致性问题。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
高并发架构系列:数据库主从同步的 3 种方案
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
2月前
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与实践
随着微服务架构的普及,如何高效管理和优化数据库访问成为了关键挑战。本文探讨了在微服务环境中优化数据库访问的策略,包括数据库分片、缓存机制、异步处理等技术手段。通过深入分析实际案例和最佳实践,本文旨在为开发者提供实际可行的解决方案,以提升系统性能和可扩展性。
|
2月前
|
存储 负载均衡 数据库
探索后端技术:从服务器架构到数据库优化的实践之旅
在当今数字化时代,后端技术作为支撑网站和应用运行的核心,扮演着至关重要的角色。本文将带领读者深入后端技术的两大关键领域——服务器架构和数据库优化,通过实践案例揭示其背后的原理与技巧。无论是对于初学者还是经验丰富的开发者,这篇文章都将提供宝贵的见解和实用的知识,帮助读者在后端开发的道路上更进一步。
|
3月前
|
XML 分布式数据库 数据库
【计算机三级数据库技术】第13章 大规模数据库架构--附思维导图
文章概述了分布式数据库、并行数据库、云计算数据库架构和XML数据库的基本概念、目标、体系结构以及与传统数据库的比较,旨在提供对这些数据库技术的全面理解。
44 1
|
3月前
|
存储 缓存 关系型数据库
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
73 0
|
3月前
|
存储 前端开发 关系型数据库
Linux 技术架构:前端、后端与数据库的完美融合
【8月更文挑战第25天】本文深入剖析了Linux操作系统的技术架构,重点介绍了前端、后端及数据库三大核心组成部分。Linux前端技术不仅涵盖了图形用户界面(GUI),包括GNOME、KDE等桌面环境,还涉及HTML、CSS、JavaScript等Web前端技术及其相关框架。后端技术则聚焦于Python、Java等多种编程语言、Apache和Nginx等Web服务器以及MySQL、PostgreSQL等数据库管理系统。Linux数据库技术覆盖了关系型和非关系型数据库,如MySQL、MongoDB等,并提供了多种数据库管理工具。
98 0

相关产品

  • 云原生多模数据库 Lindorm
  • 下一篇
    无影云桌面