如何实现一个百万亿规模的时序数据库,百度智能云 BTS 架构解析和实践分享

本文整理自 2023 年 12 月 16 日,百度智能云数据库总架构师朱洁在《国产数据库共话未来趋势》技术沙龙上的主题分享。


随着互联网和物联网的高速发展,产生了大量的结构化、半结构化数据。在百度集团内部, BTS(Baidu Table Storage) 成为处理这些半结构化数据的关键产品。随着技术的不断发展和业务需求的多样化,BTS 在百度内部经历了从支持单一 Table 能力到支持宽表、时序等多模能力的演进。

BTS 是百度智能云的半结构化存储产品,对内支撑百度核心业务(搜索、Apollo、凤巢、feed、系统监控等),对外提供高性能、低成本的 NoSQL 表格存储服务。

BTS 可用于丰富的场景,比如横向业务场景(分布式存储、结构化、聚合、高性能检索)、纵向行业场景(互联网、广告、feed、物联网、大数据、时序)以及一体化解决方案(大数据分析生态,监控)等,支撑业务创新。并且提供了多种 API、SDK 和可视化的 Web 管理平台供研发人员快速接入。通过 Batch 写、并发读、多级 Cache 加速等方式,打破性能瓶颈。通过热备副本、实时 Failover 和表回收站技术保证数据库高可用。另外,BTS 还提供企业级安全保障,服务可用性高达99.9%,数据可靠性达到了 99.99999999%(10 个 9)。

BTS 的优势积累源于在百度内部的技术沉淀,到现在一共有 12 年的历史,共分为三代。

  • 1.0 版本:在 2011 年,百度设计了第一代分布式 Table 以满足集团内部业务需要。1.0 版本实现了分布式技术的突破,条目数做到百亿级别,满足了海量数据存储的需求。在 2014 年之前,该版本主要为搜索等业务提供定制服务。

  • 2.0 版本:2015 年百度开始拓展商业广告等业务场景,增加了 FreeSchema、存算分离和稀疏表等能力。

  • 3.0 版本:2018 年百度开始推出云上服务,场景进一步拓展,包括 feed 推荐、AI 等场景,条目数增长至百万亿量级。现在已经涵盖了系统监控/自动驾驶等场景。由于 BTS 的单一 Table 能力模式无法满足新场景的需要,因此从 3.0 开始,BTS 新增了时序引擎。同时,目前正在进行多模引擎的重构。

1 BTS 系统架构

下面详细介绍下 BTS 的整体系统架构。如图所示,整个架构分三层:接入层、引擎层和存储层。

存储层负责数据块的管理,整体采用了存算分离架构,实现了模块化的设计。数据均下沉存储于存储层,提供多种存储介质和压缩格式,为客户提供数据生命周期管理的能力。

引擎层提供了核心数据处理和管理能力,根据多维度策略对各模块做智能化调度。由于引擎层的数据都是无状态的,所以各个子功能都能够做到模块化,彼此之间解耦并可独立伸缩。另外,引擎层专门设计了智能化调度模块,可针对不同切片负载,做到自动化切片和合并。目前,我们在做基于反馈的自动调动,比如根据数据预测业务波动的情况,进行提前自动化调度。

最后,上层接入层支撑了丰富的接口和生态的能力。目前 BTS 支持 HBase, Influx 接口,更多接口也在逐步完善中。

图片

2 BTS 核心技术架构设计

NoSQL 伴随着互联网业务发展而来,生来就是为了解决关系型数据库在垂直场景的不足。因此对于 NoSQL 数据库来说,高性能、低成本、高可用、高扩展是其核心能力。

2.1 单机引擎读写路径

接下来会重点介绍 BTS 是如何实现这些能力的。在这之前先介绍下单机引擎的读写路径,这是性能优化和高可用实现的前提。

首先是写路径,客户端写入数据后,数据写入 Redo-Log 并写进内存表中,导出数据压缩后以单元数据模式存储,可以支持多级压缩。详细的路径是:客户端写->数据写 Redo-Log->进入内存表-> dump 数据。压缩后以单元数据模式存储,支持多级压缩。

读路径则和写路径刚好相反:客户端读->优先在数据块缓存查询(如有)->如未命中,下沉到单元数据中查询->将数据返回客户端。读取数据的时候,核心能力是利用数据缓存加上内存里面的数据进行合并,加快读数据。

图片

2.2 高性能优化和低成本管理

我们首先看下如何实现 NoSQL 数据库中最关键的性能和成本。

在性能方面我们有几个关键的优化,分别是:

  • 通过 GroupCommit 将小块写合并处理,从而大幅度提升写吞吐。这在 HDD 介质上有明显的提升效果。

  • 多种 Compaction 策略减少 I/O 放大。

  • 写数据是把 I/O 合并,而读取数据的逻辑相反,把较大的 I/O 拆成小的 I/O 提供并发能力,通过「并发 I/O + 预读」提升读吞吐。

  • 支持可配置缓存(Cache),提供内存、SSD 等多级缓存的能力。

在成本方面,BTS 底层支持多种压缩类型,包括三副本、Snappy、EC 等多种方式压缩节省空间。另外,BTS 还支持容量型和性能型切换,未来将提供同一张表自动降冷的能力。

图片

2.3 高可用架构设计

接下来介绍 BTS 的高可用实现方法。

我们都知道数据的可靠性是存储层来保证的。在高可用上, BTS 有一整套的 HA 框架。这套框架包含控制节点和工作节点两部分,它们都支持高可用冗余。其中,工作节点之间是热备,数据通过 Redo-Log 进行同步。控制节点负责高可用的切换。主节点如果出现故障,可以进行快速切换,不可用时间控制在百毫秒内,切换时间控制在 RPC 调度时间之内。

依赖这个架构,可以实现快速 Failover,服务单元 MTTR 从秒级下降至百毫秒以内。另外,在系统升级的过程中,工作节点会主动切主,这个场景下业务无感知。

BTS 具备了完善的高可用的能力,比如多层次的容错和调度设计、多层弹性多租户隔离机制、端到端数据校验和实时监控和完善的运维。通过内核高可用框架和企业级能力来整体保证高可用的能力。

图片

2.4 核心技术总结

最后,总结下 BTS 关键的核心技术:

第一点是支持缓存加速器。可以配置缓存,并且支持多层级特性,包含内存和 SSD 。支持对指定的表进行多层级加速,可以有效地提升热数据的读取速度,满足多重场景的诉求。

第二点是多活架构。整体架构为热备多活,支持自动化故障切换,可以实现毫秒级故障切换,主动升级业务无感,适合对高可用有要求的业务。

第三点是存储层支持多级数据压缩。该方式减少了无用数据的 I/O 消耗,支持直接对压缩后的数据进行操作,可以提升读性能以及节省存储空间。

最后一点是正在进行内部测试的 key value 分离存储功能。通过分离存储可以做到单独压缩,查询的时候减少整行存取的 I/O 消耗,读写性能提升 50%。

3 使用场景

在介绍了 BTS 技术架构之后,我们进一步探讨下 BTS 架构在实际使用场景中的应用。BTS 目前支持超万亿的日均访问量,场景上覆盖了宽表、时序、大数据的处理和分析场景,覆盖了物联网、AI、feed 流、广告、健康、搜索、web 应用、自动驾驶等诸多方向。

图片

3.1 自动驾驶场景

Apollo 无人车自动训练是其中一个重要的场景。在此场景下,需要进行模型训练、仿真,按需获取多维度环境数据。这种类型的数具备如下特征:

  • 车端数据具有多源,包括位置数据、雷达数据、影像数据、红外数据等。

  • 单车单天 TB 级别,海量数据导致存储成本压力大。

  • 对数据实时性要求高。

从这些特征中我们可以看出,自动驾驶场景最大的特点就是吞吐高、数据量大,同时具备大数据和时序特征的场景。在这种海量时序数据场景中,性能和成本是其中的关键。

在性能上,关键的解决办法就是按车和传感器进行区分,将时序写入打散,从而解决写入瓶颈。底层存储单元支持按大小,负载自动分裂和合并来解决数据热点问题。

在成本上,BTS 支持数据转冷、按季度分表、转表、数据降冷等,从而实现高效的存储。

通过 BTS 综合解决方案,实现了百 PB 数据低成本的存储,百 GB 的吞吐能力,支持业务精细化仿真,按需读取维度数据的能力。

图片

3.2 系统监控场景

和自动驾驶场景不同,监控数据天然是打散的。监控场景中的物理服务器、虚拟机、容器等,均需要各个维度的监控以提升业务可视化程度。但是监控数据的小 value 很多,这导致读写和 Compaction 消耗很高。这也是监控业务相比自动驾驶业务不同的地方。

监控业务最大的痛点是离线流量和在线流量混合。离线流量需要分析全量数据,然后输出业务报表,对系统消耗很高。在线流量主要是实时监控、实时报警,要求数据能实时处理,不能阻塞。

BTS 通过支持在离线分级管理的方式,用不同的访问标识区分在离线任务。离线任务会切成很小块,一个小块占用不多的时间,让高优在线任务能够随时插入进来。在线流量低时,离线流量可以充分把资源利用起来,当在线流量起来后,离线又能够快速让出资源,不阻塞在线任务。

另外一点是监控对成本要求高的同时,对性能的要求也很高。所以利用监控业务读取最新数据的特征,通过多种缓存策略,让热数据尽量保持在高速缓存以保证高性能,冷数据放在 HDD 上,从而实现了成本的降低。

通过这些整体方案,已经可以实现缓存命中率超过 80%,在兼顾成本的同时又具备高性能。

通过以上方案,在百度集团内部的系统监控场景下,最终达到了业务成本下降 50% 以上、可支持每天十万亿级监控点采集、离线流量对在线流量 0 影响,实现监控 0 丢点率的效果。

图片

4 未来展望

目前 BTS 在支持了宽表和时序的基础上,将进一步发展支持文档、搜索的多模能力,给客户提供跨模态统一分析和计算的能力,即支持客户通过一个任务即可统一分析多个模态数据。

前面介绍了关键产品 BTS,最后简单回顾一下百度智能云产品矩阵。百度智能云数据库包括 RDS、NoSQL、云原生数据库,OLAP 等产品。相比业界其他云厂商,百度智能云数据库有两个显著特点:

  • 百度智能云数据库可以做到一套架构,云上云下客户享受同等的产品能力。

  • 支持国内最全的产品形态,包括公有云,专有云 ABC Stack,边缘计算节点 BEC,本地计算集群 LCC 等多种形态,可以服务各类诉求的客户。

图片

以上是今天分享的全部内容。

- - - - - - - - - - END - - - - - - - - - -

推荐阅读

千万级高性能长连接Go服务架构实践

百度搜索Push个性化:新的突破

数据交付变革:研发到产运自助化的转型之路

百度搜索exgraph图执行引擎设计与实践

百度搜索&金融:构建高时效、高可用的分布式数据传输系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows系统本地安装Wnmp服务并结合内网穿透公网远程访问

目录 前言 1.Wnmp下载安装 2.Wnmp设置 3.安装cpolar内网穿透 3.1 注册账号 3.2 下载cpolar客户端 3.3 登录cpolar web ui管理界面 3.4 创建公网地址 4.固定公网地址访问 结语 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊Windows…

【虚拟机数据恢复】异常断电导致虚拟机无法启动的数据恢复案例

虚拟机数据恢复环境: 某品牌R710服务器MD3200存储,上层是ESXI虚拟机和虚拟机文件,虚拟机中存放有SQL Server数据库。 虚拟机故障: 机房非正常断电导致虚拟机无法启动。服务器管理员检查后发现虚拟机配置文件丢失,所幸…

leetcode 1921

消灭的怪物数量 踩坑点:double类型的比较, C语言有qsort的排序函数,需要设计比较函数,double类型的数据存在精度问题,不能直接用号判断数据是否相等,需要通过设置精度eps。 int cmp(const void* val1,con…

###C语言程序设计-----C语言学习(7)#(调试篇)

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 一. 程序调试 1.程序调试介绍: 程序调试是软件开发过程中非常重…

npm 和 yarn 的使用

安装 yarn npm i yarn -g查看版本 npm -v yarn --version切换 npm/yarn 的下包镜像源 // 查看当前的镜像源 npm config get registry// 切换淘宝镜像源 // 新的淘宝源,旧的淘宝源已于2022年05月31日零时起停止服务 npm config set registry https://registry.…

iOS 17.4 苹果公司正在加倍投入人工智能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

重学Ajax

摘要:AJAX是一个在前端的应用非常广泛技术,为什么还要谈它呢?么得办法之前学的不全面,再收拾收拾。水平有限,欢迎指正! AJAX(全称:Asynchronous JavaScript and XML)是一…

vue3 组合式API获取子组件的属性和方法

在vue2中&#xff0c;获取子组件实例的方法或者属性时&#xff0c;父组件直接通过ref即可直接获取子组件的属性和方法&#xff0c;如下&#xff1a; // father.vue <child ref"instanceRef" /> this.$ref[instanceRef].testVal this.$ref[instanceRef].testFun…

unity 讯飞webapi在线语音合成

websocker插件使用的unitywebsocker 讯飞webapi&#xff0c;连接后只能请求一次&#xff0c;所以每次使用时进行连接&#xff0c;连接成功后进行请求&#xff0c;请求完成后关闭连接。 为什么连接后只能请求一次呢&#xff0c;可能是方便统计使用量。 如何通过音频数据计算出…

UPS负载过大有什么危害性

UPS&#xff08;不间断电源&#xff09;是一种用于保护电子设备免受电力波动和突然停电影响的设备。然而&#xff0c;如果UPS负载过大&#xff0c;可能会对其性能和寿命产生严重影响。以下是UPS负载过大的一些危害性&#xff1a; 1. 降低UPS效率&#xff1a;当UPS负载过大时&am…

C++ 11新特性之week_ptr

概述 在C11 标准中&#xff0c;智能指针的引入极大地提升了内存管理的安全性和便利性。除了已经广为人知的shared_ptr和unique_ptr之外&#xff0c;还有一个重要但相对较少被单独提及的智能指针类型——std::weak_ptr。std::weak_ptr是C 11引入的一种弱引用智能指针&#xff0c…

【RT-DETR改进涨点】ResNet18、34、50、101等多个版本移植到ultralytics仓库(RT-DETR官方一比一移植)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文是本专栏的第一篇改进,我将RT-DETR官方版本中的ResNet18、ResNet34、ResNet50、ResNet101移植到ultralytics仓库,网上很多改进机制是将基础版本的也就是2015年发布的ResNet移植到ultralytics仓库中,但是其实…

JavaScript进阶教程 - 事件循环和回调队列

JavaScript的事件循环是一种执行模型&#xff0c;它允许JavaScript引擎执行异步任务&#xff0c;尽管JavaScript是单线程的。这个模型确保了即使在执行长时间运行的操作&#xff08;如从服务器获取数据&#xff09;时&#xff0c;JavaScript代码也能保持响应性。事件循环和回调…

百度云网盘下载速度如何提升到正常速度

引入问题 我们在下载代码学习资料的时候大多数都是百度云网盘&#xff0c;但是限速&#xff01;下载的十分的慢&#xff0c;有什么办法能让我们不开通会员就能享受正常速度呢&#xff1f; 当然有&#xff01; 解决百度云网盘下载速度过慢&#xff0c;提高到正常速度 点击右…

Element ui 的组件弹窗 el-dialog点击的时候全屏变灰问题解决

最近在使用Element UI 的弹窗组件的时候发现这个组件各种的应用都没有问题&#xff0c;数据和元素的应用都是正确的但是在点击显示这个弹窗的时候全屏幕都会变灰。 这也不是因为增加了modal 遮挡幕的问题&#xff0c;在经过不断的排查代码的时候基本排除了代码的问题&#xf…

算法笔记:地理探测器

1 空间分层异质性&#xff08;spatial stratified heterogeneity&#xff09; 空间分层异质性&#xff08;空间分异性/区异性&#xff09;&#xff1a;层内方差小于层间方差的地理现象例如气 候带、土地利用图、地貌图、生物区系、区际经济差异、城乡差异以及主体功能区等 等[…

mybatis 实现查询默认添加分页

前言 分页查询在日常开发中无法避免,但每次sql编写时,mybatis 中使用limit,oracle中使用rownum分页,业务场景少的情况下,可以接受.但是随着业务增加每次相同的功能做重复开发又不是那么方便,那么我们有什么方案去解决开发中出现的分页问题呢? 一、PageHelper 框架分页 首先我…

温酒读Qt:QObject中篇2 ——欲遮还羞的 QObjectPrivate

《妙法莲华经》曰&#xff1a;“佛道长远&#xff0c;久受勤苦&#xff0c;乃可得成。” 世事修炼&#xff0c;莫不如是&#xff0c;日拱一卒无有尽&#xff0c;功不唐捐终入海。 传送门: 《温酒读Qt&#xff1a;QObject 序篇》 《温酒读Qt&#xff1a;QObject中篇1—— Q_OBJ…

Neo4j在java中的使用

1.Neo4j访问的两种方式 嵌入式数据库服务器模式(通过REST的访问) 它是由应用程序的性质&#xff08;neo4j是独立服务器 还是和程序在一起),性能&#xff0c;监控和数据安全性来决定架构选择。 An embedded database&#xff08;嵌入式数据库&#xff09; 嵌入式Neo4j数据库…

前端框架---Vue2学习教程(上)

从HTML到现在一路跟过来的小伙伴们&#xff0c;坚持固然不容易&#xff0c;但我相信大家已经学到了不少&#xff0c;那么我们开始马不停蹄的进入前端的框架吧&#xff0c;下面讲的是Vue2&#xff0c;大家继续加油鸭&#xff01;&#xff01;&#xff01;&#xff01; Vue2 Vu…