您当前的位置:首页 > 电脑百科 > 数据库 > 百科

1.3万亿条数据查询如何做到毫秒级响应?

时间:2020-03-14 10:07:47  来源:  作者:

作者:孙晓光 ,北京知乎软件架构师。

来源:http://itindex.net/

知乎,在古文中意为“你知道吗?”,它是中国的Quora:一个问答网站,其中各种问题由用户社区创建,回答,编辑和组织。作为中国最大的知识共享平台,知乎平台目前拥有2.2亿注册用户,3000万个问题,网站答案超过1.3亿。

随着用户群的增长,应用程序的数据大小无法评估,在一个名为Moneta的应用程序中存储了大约1.3万亿行数据(存储着用户已经阅读过的帖子)。由于每月累计产生大约1000亿行数据,且不断增长,这一数字将在两年内达到3万亿。

在保持良好用户体验的同时,我们在扩展后端方面面临严峻的挑战。

在这篇文章中,我将深入探讨如何在如此大量的数据上保持毫秒级的查询响应时间,以及TiDB是一个开源的MySQL兼容的NewSQL混合事务/分析处理( HTAP)数据库,如何为我们提供支持获得对我们数据的实时洞察。我将介绍为什么选择TiDB,如何使用它,学到了什么,最佳实践以及对未来的一些畅想。

我们的痛点

本节介绍了我们的Moneta应用程序的体系结构,我们尝试构建的理想体系结构,以及 数据库可伸缩性 作为我们技术团队的主要难点。

系统架构要求

知乎的Post Feed服务是一个关键系统,用户可以通过该系统接收网站上发布的内容。后端的Moneta应用程序存储用户已阅读的帖子,并在知乎的推荐页面的帖子流中过滤掉这些帖子。

Moneta应用程序具有以下特征:

  • 需要高可用性数据:Post Feed是第一个出现的屏幕,它在推动用户流量到知乎方面发挥着重要作用。
  • 处理巨大的写入数据:例如,在高峰时间每秒写入超过4万条记录,记录数量每天增加近30亿条记录。
  • 长期存储历史数据:目前,系统中存储了大约1.3万亿条记录。随着每月累积约1000亿条记录并且不断增长,历史数据将在大约两年内达到3万亿条记录。
  • 处理高吞吐量查询:在高峰时间,系统处理平均每秒在1200万个帖子上执行的查询。
  • 将查询的响应时间限制为90毫秒或更短:即使对于执行时间最长的长尾查询,也会发生这种情况。
  • 容忍误报:这意味着系统可以为用户调出许多有趣的帖子,即使有些帖子被错误地过滤掉了。

考虑到上述事实,我们需要一个具有以下功能的应用程序架构:

  • 高可用性:当用户打开Zhihu的推荐页面时,找到大量已经阅读过的帖子是一种糟糕的用户体验。
  • 出色的系统性能:我们的应用具有高吞吐量和严格的响应时间要求。
  • 易于扩展:随着业务的发展和应用程序的发展,我们希望我们的系统可以轻松扩展。

勘探

为了构建具有上述功能的理想架构,我们在之前的架构中集成了三个关键组件:

  • 代理:这会将用户的请求转发给可用节点,并确保系统的高可用性。
  • 缓存:这暂时处理内存中的请求,因此我们并不总是需要处理数据库中的请求。这可以提高系统性能。
  • 存储:在使用TiDB之前,我们在独立的 MySQL上管理我们的业务数据。随着数据量的激增,独立的MySQL系统还不够。然后我们采用了 MySQL分片和Master High Availability Manager( MHA)的解决方案,但是当每月有1000亿条新记录涌入我们的数据库时,这个解决方案是不可取的。

MySQL Sharding和MHA的缺点

MySQL分片和MHA并不是一个好的解决方案,因为MySQL分片和MHA都有它们的缺点。

 

MySQL分片的缺点:

 

  • 应用程序代码变得复杂且难以维护。
  • 更改现有的分片键很麻烦。
  • 升级应用程序逻辑会影响应用程序的可用性。

MHA的缺点:

  • 我们需要通过编写脚本或使用第三方工具来实现虚拟IP(VIP)配置。
  • MHA仅监视主数据库。
  • 要配置MHA,我们需要配置无密码安全Shell( SSH)。这可能会导致潜在的安全风险。
  • MHA不为从属服务器提供读取负载平衡功能。
  • MHA只能监视主服务器(而不是从主服务器)是否可用。

在我们发现TiDB并将数据从MySQL迁移到TiDB之前,数据库可伸缩性仍然是整个系统的弱点。

什么是TiDB?

TiDB平台是一组组件,当它们一起使用时,它们将成为具有HTAP功能的NewSQL数据库。

1.3万亿条数据查询如何做到毫秒级响应?

 

图1 TiDB平台架构

在TiDB平台内部,主要组件如下:

  • TiDB服务器是一个无状态的SQL层,它处理用户的SQL查询,访问存储层中的数据,并将相应的结果返回给应用程序。它与MySQL兼容并且位于TiKV之上。
  • TiKV服务器是数据持久存在的分布式事务键值存储层。它使用 Raft共识协议进行复制,以确保强大的数据一致性和高可用性。
  • TiSpark集群也位于TiKV之上。它是一个Apache Spark插件,可与TiDB平台配合使用,支持商业智能(BI)分析师和数据科学家的复杂在线分析处理(OLAP)查询。
  • 放置驱动程序(PD)服务器是由 etcd支持的元数据集群,用于管理和调度TiKV。

除了这些主要组件之外,TiDB还拥有一个工具生态系统,例如用于快速部署的 Ansible脚本,用于从MySQL 迁移的 Syncer和 TiDB数据迁移,以及用于收集对TiDB群集进行的逻辑更改并提供增量备份的 TiDB Binlog。复制到下游(TiDB,Kafka或MySQL)。

TiDB的主要功能

TiDB的主要功能包括:

  • 水平可扩展性。
  • MySQL兼容之语法。
  • 具有强一致性的分布式事务
  • 云原生架构。
  • 使用HTAP进行最小提取,转换,加载( ETL)。
  • 容错和Raft恢复。
  • 在线架构更改。

我们是如何使用TiDB的

在本节中,我将向您展示如何在Moneta的架构中运行TiDB以及Moneta应用程序的性能指标。

我们架构中的TiDB

我们在系统中部署了TiDB,Moneta应用程序的整体架构变为:

  • 顶层:无状态和可伸缩的客户端API和代理。这些组件易于扩展。
  • 中间层:软状态组件和分层redis缓存作为主要部分。当服务中断时,这些组件可以通过恢复保存在TiDB群集中的数据来自我恢复服务。
  • 底层:TiDB集群存储所有有状态数据。它的组件高度可用,如果节点崩溃,它可以自我恢复其服务。
1.3万亿条数据查询如何做到毫秒级响应?

 

知乎的Moneta应用程序中的TiDB架构

在该系统中,所有组件都是可自我恢复的,整个系统具有全局故障监视机制。然后,我们使用 Kubernetes来协调整个系统,以确保整个服务的高可用性。

TiDB的性能指标

由于我们在生产环境中应用了TiDB,因此我们的系统具有高可用性和易于扩展性,并且系统性能得到显着改善。

例如,在2019年6月为Moneta应用程序采用一组性能指标:

在高峰时间每秒写入40,000行数据。

1.3万亿条数据查询如何做到毫秒级响应?

 

每秒写入的数据行(数千)

在高峰时段每秒检查30,000个查询和1200万个帖子

1.3万亿条数据查询如何做到毫秒级响应?

 

每秒写入的数据行(数千)

第99百分位响应时间约为25毫秒,第999百分位响应时间约为50毫秒。实际上,平均响应时间远远小于这些数字,即使对于需要稳定响应时间的长尾查询也是如此。

1.3万亿条数据查询如何做到毫秒级响应?

 

第99百分位响应时间

1.3万亿条数据查询如何做到毫秒级响应?

 

第999百分位响应时间

我们学到了什么?

我们迁移到TiDB并非顺利。在这里,我们想分享一些经验教训。

更快地导入数据

我们使用TiDB数据迁移(DM)来收集MySQL增量binlog文件,然后使用 TiDB Lightning将数据快速导入TiDB集群。

令我们惊讶的是,将这1.1万亿条记录导入TiDB只用了四天时间。如果我们逻辑地将数据写入系统,可能需要一个月或更长时间。如果我们有更多的硬件资源,我们可以更快地导入数据。

减少查询延迟

完成迁移后,我们测试了少量的读取流量。当Moneta应用程序首次上线时,我们发现查询延迟不符合我们的要求。为解决延迟问题,我们与PingCap工程师合作调整系统性能。

在此过程中,我们积累了宝贵的数据和数据处理知识:

  • 有些查询对查询延迟很敏感,有些则不然。我们部署了一个单独的TiDB数据库来处理对延迟敏感的查询。(其他非延迟敏感的查询在不同的TiDB数据库中处理。)这样,大型查询和对延迟敏感的查询在不同的数据库中处理,前者的执行不会影响后者。
  • 对于没有理想执行计划的查询,我们编写了SQL提示来帮助执行引擎选择最佳执行计划。
  • 我们使用低精度时间戳Oracle( TSO)和预处理语句来减少网络往返。

评估资源

在我们尝试TiDB之前,我们没有分析我们需要多少硬件资源来支持MySQL端的相同数据量。为了降低维护成本,我们在单主机 - 单从机拓扑中部署了MySQL。相反,在TiDB中实现的 Raft协议至少需要三个副本。因此,我们需要更多的硬件资源来支持TiDB中的业务数据,我们需要提前准备机器资源。

一旦我们的数据中心设置正确,我们就可以快速完成对TiDB的评估。

我们对TiDB 3.0的期望

在Zhihu,反垃圾邮件和Moneta应用程序的架构相同。我们在用于生产数据的反垃圾邮件应用程序中尝试了TiDB 3.0( TiDB 3.0.0-rc.1和 TiDB 3.0.0-rc.2)的候选版本中的 Titan和 Table Partition。

Titan缩短了延迟

反垃圾邮件应用程序一直受到严重的查询和写入延迟折磨。

我们听说TiDB 3.0将引入Titan,一种键值存储引擎,用于 在使用大值时减少 RocksDB(TiKV中的底层存储引擎)的写入放大。

为了尝试这个功能,我们在TiDB 3.0.0-rc.2发布后启用了Titan。下图分别显示了与RocksDB和Titan相比的写入和查询延迟:

1.3万亿条数据查询如何做到毫秒级响应?

 

在RocksDB和Titan中编写和查询延迟

统计数据显示,在我们启用Titan后,写入和查询延迟都急剧下降。这真是太惊人了!当我们看到统计数据时,我们无法相信自己的眼睛。

表分区改进了查询性能

我们还在反垃圾邮件应用程序中使用了TiDB 3.0的表分区功能。使用此功能,我们可以按时将表分成多个分区。当查询到来时,它将在覆盖目标时间范围的分区上执行。这大大提高了我们的查询性能。

让我们考虑一下如果我们将来在Moneta和反垃圾邮件应用程序中实施TiDB 3.0会发生什么。

Moneta应用程序中的TiDB 3.0

TiDB 3.0具有诸如gRPC中的批处理消息,多线程Raftstore,SQL计划管理和TiFlash等功能。我们相信这些将为Moneta应用增添光彩。

gRPC和多线程Raftstore中的批处理消息

Moneta的写入吞吐量超过每秒4万次交易(TPS).TiDB 3.0可以批量发送和接收Raft消息,并且可以在多个线程中处理Region Raft逻辑。我们相信这些功能将显着提高我们系统的并发能力。

SQL计划管理

如上所述,我们编写了大量SQL提示,以使查询优化器选择最佳执行计划。TiDB 3.0添加了一个SQL计划管理功能,可以直接在TiDB服务器中将查询绑定到特定的执行计划。使用此功能,我们不需要修改查询文本以注入提示。

TiFlash

在TiDB DevCon 2019上,我第一次听说TiFlash是TiDB的扩展分析引擎。它使用面向列的存储技术来实现高数据压缩率,并在数据复制中应用扩展的Raft一致性算法以确保数据安全性。

由于我们拥有高写入吞吐量的海量数据,因此我们无法每天使用ETL将数据复制到 Hadoop进行分析。但是对于TiFlash,我们乐观地认为我们可以轻松分析我们庞大的数据量。

反垃圾邮件应用程序中的TiDB 3.0

与Moneta应用程序的巨大历史数据大小相比,反垃圾邮件应用程序具有更高的写入吞吐量。但是,它仅查询过去48小时内存储的数据。在此应用程序中,数据每天增加80亿条记录和1.5 TB。

由于TiDB 3.0可以批量发送和接收Raft消息,并且它可以在多个线程中处理Region Raft逻辑,因此我们可以用更少的节点管理应用程序。以前,我们使用了七个物理节点,但现在我们只需要五个。即使我们使用商用硬件,这些功能也可提升性能。

下一步是什么

TiDB是一个与MySQL兼容的数据库,因此我们可以像使用MySQL一样使用它。由于TiDB的横向可扩展性,现在我们可以自由扩展我们的数据库,即使我们有超过一万亿的记录来应对。

到目前为止,我们已经在我们的应用程序中使用了相当多的开源软件。我们还学到了很多关于使用TiDB处理系统问题的知识。我们决定参与开发开源工具,并参与社区的长期发展。基于我们与PingCAP的共同努力,TiDB将变得更加强大和强大。



Tags:数据查询   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
基于SQL的查询引擎简介,包括指向数据仓库和数据湖的链接> Photo by NASA on Unsplash介绍从高层的角度来看,许多数据和分析解决方案已经以相同的方式构建了许多年。 简而言之,...【详细内容】
2020-11-26  Tags: 数据查询  点击:(165)  评论:(0)  加入收藏
知乎,在古典中文中意为“你知道吗?”,它是中国的 Quora,一个问答网站,其中各种问题由用户社区创建,回答,编辑和组织。作为中国最大的知识共享平台,我们目前拥有 2.2 亿注册用户,3000...【详细内容】
2020-08-03  Tags: 数据查询  点击:(74)  评论:(0)  加入收藏
一、数据平台(5类)网络趋势分析6个1、5118 / chinaz——主要用户:SEO专员支持查询网站排名及发展趋势、百度收录情况等信息 2、艾瑞指数——主要用户:互联...【详细内容】
2020-07-01  Tags: 数据查询  点击:(1924)  评论:(0)  加入收藏
在日常工作中我们不可避免地会遇到慢SQL问题,比如笔者在之前的公司时会定期收到DBA彪哥发来的Oracle AWR报告,并特别提示我某条sql近阶段执行明显很慢,可能要优化一下等。对于...【详细内容】
2020-03-18  Tags: 数据查询  点击:(72)  评论:(0)  加入收藏
知乎,在古文中意为“你知道吗?”,它是中国的Quora:一个问答网站,其中各种问题由用户社区创建,回答,编辑和组织。作为中国最大的知识共享平台,知乎平台目前拥有2.2亿注册用户,3000万个问题,网站答案超过1.3亿。...【详细内容】
2020-03-14  Tags: 数据查询  点击:(68)  评论:(0)  加入收藏
一起学习,一起成长!DataFrame数据结构对查询方式是数据处理与分析中经常使用对。比如,我们通常使用对excel数据文件,通常都是这种数据结构。所以,该数据结构对数据查询或称数据...【详细内容】
2019-12-02  Tags: 数据查询  点击:(155)  评论:(0)  加入收藏
▌简易百科推荐
1增1.1【插入单行】insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values (&#39;开心朋朋&#39;,&#39;男&#39;,&#39;1980/6/15&#3...【详细内容】
2021-12-27  快乐火车9d3    Tags:SQL   点击:(2)  评论:(0)  加入收藏
最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫, 不知道各种写法孰优孰劣,该选用哪种写法,以及各种写法的优缺点,本文以一个简单的查询...【详细内容】
2021-12-23  linux上的码农    Tags:sql   点击:(9)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的HasorDB 是一个全功能数据库访问工具,提供对象映射、丰...【详细内容】
2021-12-22  GitHub精选    Tags:HasorDB   点击:(5)  评论:(0)  加入收藏
作者丨Rafal Grzegorczyk译者丨陈骏策划丨孙淑娟【51CTO.com原创稿件】您是否还在手动对数据库执行各种脚本?您是否还在浪费时间去验证数据库脚本的正确性?您是否还需要将...【详细内容】
2021-12-22    51CTO  Tags:Liquibase   点击:(4)  评论:(0)  加入收藏
场景描述:由于生产环境的表比较复杂,字段很多。这里我们做下简化,只为说明今天要聊的问题。有两张表 tab1,tab2: tab1 数据如下: tab2 数据如下: 然后给你看下,我用来统计 name=&#3...【详细内容】
2021-12-20  Bald    Tags:SQL   点击:(7)  评论:(0)  加入收藏
前言知识无底,学海无涯,知识点虽然简单,但是比较多,所以将MySQL的基础写出来,方便自己以后查找,还有就是分享给大家。一、SQL简述1.SQL的概述Structure Query Language(结构化查...【详细内容】
2021-12-16  谣言止于独立思考    Tags:SQL基础   点击:(13)  评论:(0)  加入收藏
前言作为一名测试工程师,工作中在对测试结果进行数据比对的时候,或多或少要和数据库打交道的,要和数据库打交道,那么一些常用的 SQL 查询语法必须要掌握。最近有部分做测试小伙...【详细内容】
2021-12-14  柠檬班软件测试    Tags:SQL   点击:(15)  评论:(0)  加入收藏
话说C是面向内存的编程语言。数据要能存得进去,取得出来,且要考虑效率。不管是顺序存储还是链式存储,其寻址方式总是很重要。顺序存储是连续存储。同质结构的数组通过其索引表...【详细内容】
2021-12-08  小智雅汇    Tags:数据存储   点击:(18)  评论:(0)  加入收藏
概述DBConvert Studio 是一款强大的跨数据库迁移和同步软件,可在不同数据库格式之间转换数据库结构和数据。它将成熟、稳定、久经考验的 DBConvert 和 DBSync 核心与改进的现...【详细内容】
2021-11-17  雪竹聊运维    Tags:数据库   点击:(26)  评论:(0)  加入收藏
一、前言 大家好,我是小诚,《从0到1-全面深刻理解MySQL系列》已经来到第四章,这一章节的主要从一条SQL执行的开始,由浅入深的解析SQL语句由客户端到服务器的完整执行流程,最...【详细内容】
2021-11-09  woaker    Tags:SQL   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条