百亿数据存储-高并发搜索如何设计?

最近好多小伙伴都跑来问小北,百亿级别的数据存储要怎么设计架构啊?

听说面试里经常问到这个问题。

就像前几天,有位同学去字节面试,就碰到了这个问题:

“百亿级数据存储,你怎么设计?”

他们回答说要分库分表,但面试官好像不太满意。那到底为啥呢?

小北今天就用这10年的技术经验,给大家好好说说,怎么从0开始设计这个百亿级的数据存储架构。

首先,咱们得明白,这种级别的数据存储架构,得具备哪些能力。

简单来说,一般需要具备以下多种能力

  • 要能处理高并发的在线事务、搜索
  • 能处理海量数据的离线任务,甚至还得有冗余表双写能力,也就是能同时处理多个业务维度的事务。

比如说,在订单特别多的情况下,咱们得按用户维度和商家维度来分别处理事务。

当然,如果业务没那么复杂,这个双写能力就是可选的。

不过啊,搞这么多副本也有好处也有坏处。

好处是能满足各种处理需求,坏处就是得维护多个副本之间的数据一致性。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的
, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

怎么实现这个数据一致性呢?

为了让商品搜索更快,咱们可以用两个方案:

  1. 把商品数据冗余存储在Elasticsearch里,这样搜索就超快了;
  2. 把商品数据放在redis里,做个高速缓存。这样一来,搜索速度就嗖嗖的了!

既然我们有了这么多数据的副本,那么问题就来了,怎么确保这些副本的数据都是一模一样的呢?
举几个例子哈:

  • 比如说,我们要让 mysql 和 es(一种搜索引擎)的数据在几秒钟内就同步上。
  • 还有啊,mysql 和 redis(一个超快的内存数据库)也得在几秒钟内同步数据。
  • 还有 mysql 和 hbase(一个分布式存储系统)也得有秒级别的数据同步。

接下来,我就拿 mysql 和 es 的数据同步来给大家说道说道,其他的同步方式,其实都差不多。
大家要是能把下面这五大绝招,关于数据一致性的方案,说得头头是道、滔滔不绝,那面试官估计得听得目瞪口呆,口水都要流出来了!

方案1:同步双写

同步双写是一种最为简单的方式,在将数据写到 MySQL 时,同时将数据写到 ES。

同步双写的好处啊,就是快!简单直接,实时写入几乎就是秒秒钟的事儿。
但说到缺点,也是一大堆。
首先,业务太紧密了,这种写法让代码变得很复杂。

比如你原本写 mysql 的地方,现在还得加写 es 的代码,以后每次写 mysql 都得记得加 es。这就好比你在炒菜,本来只放一种调料,现在得放两种,麻烦得很。

再来说说性能吧。
因为要写入两个存储,所以响应时间会变长。
MySQL 本身性能就一般,再加上 ES,整个系统的性能肯定得降一降。
还有啊,扩展起来也麻烦。
比如搜索功能,有时候需要个性化,得对数据进行聚合处理,但这种方式就很难实现这种需求。
最要命的是,这种方式风险还高。如果双写失败了,数据就可能丢失!

方案2:异步双写

同步操作真的挺慢的,但异步操作就快多了。说到异步双写,它主要有两种实现方式:

  • 使用内存队列(如阻塞队列)异步
  • 使用消息队列进行异步

方案2.1 使用内存队列(如阻塞队列)异步

先把商品的数据写进数据库,然后把这个数据放进这个内存队列(比如BlockingQueue)里面。
之后,有一个专门负责“干活”的线程,它会从队列里拿出数据,再一批一批地写入ElasticSearch。这
样,数据的一致性就能得到保证了。
同步流程如下

方案2.2 使用消息队列(如RRocketMQ)异步

我们都知道存储在内存的数据是不稳定的,一旦服务宕机或重启,内存队列里边数据就会丢失,那么es 当中的数据和DB就不一致了

针对这种问题,我们该如何解决呢?

这时候就可以用可靠性消息队列(RocketMQ)来解决了
生产场景中,我们一般会有一个搜索服务,由搜索服务去订阅商品变动的消息,来完成同步。

异步双写优点:

  • 性能高;
  • 不易出现数据丢失问题,主要基于 MQ 消息的消费保障机制,比如 ES 宕机或者写入失败,还能重新消费 MQ 消息;
  • 多源写入之间相互隔离,便于扩展更多的数据源写入。

异步双写缺点:

  • 硬编码问题,接入新的数据源需要实现新的消费者代码;
  • 系统复杂度增加,引入了消息中间件;
  • MQ是异步消费模型,用户写入的数据不一定可以马上看到,造成延时。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的
, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

方案3 定期同步

定期同步我们可以设计两个方案,分别是:增量数据同步和全量数据同步

方案3.1 增量数据同步

通过定时任务(例如xxl-job)调度平台,定期同步增量数据。

例如每一个小时,同步所有更新时间变更的数据

适用场景

  1. 数据增量不是很大,更新时间变更的数据不多
  2. 一致性要求不高,可以接受一定的数据同步延迟

方案3.2 全量数据同步

全量数据同步一般很少用,因为如果百亿级别的数据,采用全量数据同步,会有以下的问题:

  1. 同步完成时间很长,导致数据延迟很高
  2. 会有中间中断的情况

所以全量同步一般只作为第一次DB的数据往ES或HBase等大数据框架中同步使用。
或者是每天晚上做一次全量数据(一定时间范围内)同步检查,以保证第二天的部分热数据完全一致性
定期全量同步优点:

  • 实现比较简单

定期同步缺点:

  • 实时性难以保证
  • 对存储压力较大

方案4 数据订阅(MySQL的binlog+Canal)

实现方案
  1. 基于Binlog的实时同步:
    • MySQL的Binlog(Binary Log)记录了所有的增删改操作。通过解析Binlog,可以实时获取数据变更。
    • 使用工具如Debezium或Canal,这些工具可以捕获MySQL Binlog并将变更数据同步到Elasticsearch
步骤
  1. 配置MySQL开启Binlog,并确保日志格式为ROW。
  2. 部署Debezium或Canal,连接到MySQL并订阅Binlog。
  3. 配置Kafka、Logstash等数据管道,将捕获的变更数据流式传输到Elasticsearch。
  4. 在Elasticsearch中配置索引和文档结构,确保能够正确接收和存储变更数据。
优点
  • 实时性好: 数据几乎实时同步,延迟较低。
  • 性能优: 只同步变化的数据,减少了不必要的全量同步开销。
  • 一致性强: 可以保证数据的强一致性,尤其适用于频繁变更的数据。
  • **无侵入:**对商品服务无侵入
缺点
  • 复杂度高: 需要配置和维护Binlog捕获工具及数据管道。
  • 依赖性强: 依赖于MySQL的Binlog机制和额外的工具,如Debezium、Canal等。
  • 错误处理复杂: 数据变更过程中出现错误时,恢复和重新同步较为复杂。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的
, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

方案5 冗余表的同步双写/异步双写

数据量都这么大了,为啥我们要搞个冗余表呢?

简单来说,当我们的t_order表里的订单数量达到500万条或者表的大小超过2GB时,就需要考虑把这个表拆分成多个小表,这样查询起来会更快。

拆分表时,我们得根据某个列(分表健)来分,比如按照userId来分。那对于用户来说,他们查询自己的订单时,带上userId就能找到对应的表。

但问题来了,商家想查自己店铺的订单时,他们不知道具体的userId啊,所以他们得把每个小表都查一遍,再把结果拼起来,这样效率就超级低了。

为了解决这个问题,我们可以给商家搞个冗余的订单表。

这个冗余表不是按照userId分的,而是按照merchantId(商家ID)来分的。

这样商家查自己店铺的订单时,直接查这个冗余表就行了,效率就大大提高了。

不过呢,这样做也有个坏处,就是我们要保证这个冗余表和普通表里的数据得一致,得定期维护它们,确保两边数据都一样。

但总的来说,为了提升查询效率,这点麻烦还是值得的。

冗余表的同步双写实现方案

更新t_order的操作要执行两次,一次更新普通表,一次更新冗余表,写两次。优点:

  • 实现简单,由一次写变为两次写
  • 容易维护数据的一致性

缺点:

  • 代码冗余,第二次写跟第一次写的代码类似,而且每个更新的地方都要写两次
  • 请求处理时间变长

冗余表的异步双写方案

更新请求过来,写一次数据库,再发送一条消息到消息中间件,返回响应。
消费者拉取消息进行写操作。

优点:

  • 处理时间是单次写

缺点

  • 较复杂,引入了消息中间件
  • 不容易维护数据的一致性

方案6 ETL数据同步

什么是ETL数据同步?

ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库。

ETL的工作原理?

ETL是构建数据仓库的重要一环,用户从数据源抽取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中去。

ETL的常用工具有哪些?

常用的etl工具有:databus、canal (方案四用了这个组件,有etl 的部分功能)、otter 、kettle 等

下面以 databus为例,介绍一下

databus,其实就是一个特别牛的数据抓取系统。这个系统是LinkedIn在2013年开源的,它能实时、可靠地抓取数据库的变动。

你想啊,数据库里数据一变,databus就能立马知道,然后业务那边就可以通过特定的方式拿到这些变化,去做自己想做的事情。

那databus有啥厉害的地方呢?

首先,它支持多种数据源,比如Oracle和MySQL。也就是说,不管你的数据放在哪里,databus都能帮你抓到。

然后,它特别能抗造,可以支持很多消费者同时来拿数据,还不容易出问题。

而且啊,databus还能保持数据原来的顺序,比如你数据库里有个事务,它里面的数据变化,databus都会按照原来的顺序给你。

再说说速度吧,数据源一变,databus就能在几毫秒内把这些变化给消费者。消费者还可以自己选只拿自己想要的数据,特别方便。

最后,如果你想要重新看一遍之前的数据,databus也能做到,而且不会对数据库造成啥负担。就算你的数据已经落后数据库很多了,也能用这个功能来补。

总的来说,databus就是一个很厉害的数据抓取工具,特别适合那些需要实时知道数据库变化并做业务处理的场景。

最后再看看Databus 的系统架构

Databus 由 Relaysbootstrap 服务和 Client lib 等组成,Bootstrap 服务中包括 Bootstrap ProducerBootstrap Server

  • 快速变化的消费者直接从 Relay 中取事件;
  • 如果一个消费者的数据更新大幅落后,它要的数据就不在 Relay 的日志中,而是需要请求 Bootstrap 服务,返回的将会是自消费者上次处理变更之后的所有数据变更快照。

最后给大家贴一下Databus的开源地址,感兴趣的可以自己去研究下

开源地址:https://github.com/linkedin/databus

总结

看到这里,大家心里都对百亿级数据存储并发搜索的设计方案有一个清晰的认知了吧。

最后再给大家做一个完整的总结:以电商订单场景为例

  1. 首先百亿级数据级别的存储,肯定要分表
  2. 在分表的基础上,考虑到不同目标用户的场景,我们需要针对C端用户和商家用户做冗余表(一套ToC,一套ToB)
  3. 为了满足除单个用户、单个商家的查询场景(例如运营或者是其他搜素场景),我们需要借助ES等搜索引擎满足搜索的业务场景
  4. 最后解决数据库DB与ES、Hbase、Redis等中间件数据同步问题(参考本文的6种方案)

最后说一句(求关注,求赞,别白嫖我)

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的
, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

本文,已收录于,我的技术网站 cxykk.com:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Scikit-Learn随机森林回归

Scikit-Learn随机森林回归 1、随机森林1.1、集成学习1.2、Bagging方法1.3、随机森林算法1.4、随机森林的优缺点2、Scikit-Learn随机森林回归2.1、Scikit-Learn随机森林回归API2.2、随机森林回归实践(加州房价预测)1、随机森林 随机森林是一种由决策树构成的集成算法,它在大多…

QT::QNetworkReply类readAll()读取不到数据的可能原因

程序中,当发送请求时,并没有加锁,而是在响应函数中加了锁,导致可能某个请求的finished信号影响到其他请求响应数据的读取 connect(reply,&QNetworkReply::finished,this,&Display::replyFinished);参考这篇文章&#xff…

闪电加载:Hexo博客性能优化全攻略

巴索罗缪大熊 前言 这些年积累了很多前端性能优化的知识点和思路,日常工作很少涉及技术层极限优化,近期终于一点点把博客独立搭建并部署了,对之前的一些技术点进行了深度探索,最终结果也达到了预期效果,由于水平有限&…

怎么从视频中提取音频?这里有三种提取妙招

怎么从视频中提取音频?在数字媒体日益丰富的今天,视频内容成为了信息传播的重要形式。但有时我们可能只需要视频中的音频部分,用于制作播客、音乐剪辑或语音分析等。幸运的是,技术的发展为我们提供了多种从视频中高效提取音频的方…

如何降本增效获得目标客户?AI企业使用联盟营销这个方法就对了!

AI工具市场正在迅速发展,现仍有不少企业陆续涌出,那么如何让你的工具受到目标群体的关注呢?这相比是AI工具营销人员一直在思考的问题。 为什么AI企业难以获客呢? 即使这个市场正蓬勃发展,也无法保证营销就能轻易成功…

【问题解决】pycharm中添加python interpreter报错 conda excutable is no found

选择安装目录下的conda.bat文件,然后点击“Load Environments”按钮,然后在列表中选择conda环境即可。

开源表单流程设计器有哪几个突出的优势特点?

当前,传统的表单制作已经无法满足现在企业的发展需求了。想要实现高效率发展,需要引进先进的低代码技术平台、开源表单流程设计器等优秀软件平台助力发展。它们具有可视化操作界面、灵活好操作、易维护、效率高等诸多优势特点,在推动企业实现…

蓝桥杯嵌入式 第六届国赛 更新中……

题目 配置 注意事项 复制LCD的工程,先配置资源 --- 勾选完选项一定要再看一眼,可能选择错误 ADC:配置ADC2_IN15,对应PB15引脚 EEROM,配置PB6和PB7 按键 输入模式PB0、PB1、PB2、PA0 LED 一定要使能PD2 PWM互补输出&…

vue3 + ts 实现IP地址及Mac地址输入框功能

1、组件完成代码 <template><div class"ip-input"><div v-for"(item, index) in ipArr" :key"index" class"ip-input__item-wrap"><input ref"ipInput" v-model"ipArr[index]" type"t…

AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月29日预测第5弹

今天继续基于8883的大底&#xff0c;使用尽可能少的条件进行缩号&#xff0c;同时&#xff0c;同样准备两套方案&#xff0c;一套是我自己的条件进行缩号&#xff0c;另外一套是8883的大底结合2码不定位奖号预测二次缩水来杀号。好了&#xff0c;直接上结果吧~ 首先&…

【数据结构】

根据先序、中序、后序确定二叉树&#xff1a; #背景&#xff1a;树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序&#xff0c;根据先序和后序不一定可以确定一棵二叉树&#xff0c;给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。 抓住中序特点&#x…

开源工具专题-04 Atlassian Crowd部署备份及迁移

开源工具专题-04 Atlassian Crowd部署备份及迁移 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-05-29csdn 博客名称&#xff1a;五维空间-影子&…

SpringBoot与Spring Framework提供的缓存抽象

目录 缓存 项目总结 新建一个SpringBoot项目 pom.xml application.properties CacheConfig Book BookRepository接口 BookService服务类 BookController控制器 SpringbootCacheApplication启动类 启动项目&#xff0c;使用Postman测试 参考博文&#xff1a; 1、使用…

无人港口/码头兴起,可视化大屏功不可没。

码头/港口可视化大屏可以为管理上带来多方面的价值&#xff0c;包括但不限于&#xff1a; 1. 实时监控&#xff1a; 大屏可以将港口的各种数据、设备状态、船舶位置等信息实时展示&#xff0c;管理人员可以通过大屏随时监控港口的运营情况&#xff0c;及时发现并处理问题。 2…

第13章 常用类

一、包装类 二、String String的常用方法&#xff1a; equals&#xff1a;判断内容是否相等&#xff0c;区分大小写。 String str1 "hello";String str2 "Hello";System.out.println(str1.equals(str2));//false equalsIgnoreCase&#xff1a;判断内容…

清华大学提出IFT对齐算法,打破SFT与RLHF局限性

监督微调&#xff08;Supervised Fine-Tuning, SFT&#xff09;和基于人类反馈的强化学习&#xff08;Reinforcement Learning from Human Feedback, RLHF&#xff09;是预训练后提升语言模型能力的两大基础流程&#xff0c;其目标是使模型更贴近人类的偏好和需求。 考虑到监督…

一文看懂标准版和Pro版的区别

在CRMEB的众多产品中&#xff0c;有这样两款产品经常被拿来比较&#xff0c;它们就是CRMEB的标准版和Pro版商城系统&#xff0c;今天&#xff0c;我们就来盘一下这两款系统之间究竟有哪些不同。 1、Pro版系统性能更卓越 CRMEB Pro版采用Tp6 SwooleRedis高性能框架开发&#…

游戏联运平台如何助力游戏行业飞速发展?

随着科技的进步和互联网的普及&#xff0c;游戏行业正以前所未有的速度飞速发展。在这个过程中&#xff0c;游戏联运平台凭借其独特的优势和功能&#xff0c;成为了推动游戏行业腾飞的关键力量。本文将探讨游戏联运平台如何助力游戏行业实现飞速发展。 一、游戏联运平台的定义与…

四川易点慧电商抖音小店信誉之店

在当下这个电商飞速发展的时代&#xff0c;如何在众多网店中挑选出一家既可靠又值得信赖的店铺&#xff0c;成为了消费者们关注的焦点。四川易点慧电子商务有限公司抖音小店以其卓越的品质和诚信的经营&#xff0c;逐渐在抖音平台上崭露头角&#xff0c;成为了众多消费者心中的…

北京大学第一医院与智源研究院共同发布基于可信执行环境的AI医学影像挑战赛

肾动脉狭窄是导致继发性高血压及肾功能不全的常见原因&#xff0c;而目前针对肾动脉狭窄功能学的评估尚处于探索阶段。数据保护和可信计算环境是目前人工智能技术应用于临床研究的一大瓶颈。北京大学第一医院与北京智源人工智能研究院心脏AI 联合研究中心特发布基于可信执行环境…