字节面试:百亿级数据存储,怎么设计?只是分库分表吗?

尼恩:百亿级数据存储架构起源

在40岁老架构师 尼恩的读者交流群(50+)中,经常性的指导小伙伴们改造简历。

经过尼恩的改造之后,很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会,拿到了大厂机会。

这些机会的来源,主要是尼恩给小伙伴 改造了简历,植入了亮点项目、黄金项目。

尼恩的 亮点项目、黄金项目 需要持续迭代。

下一个亮点项目、黄金项目是:百亿级数据存储架构。

同时,小伙伴在面试时,经常遇到这个面试难题。比如,前几天一个小伙伴面试字节,就遇到了这道题

字节面试:百亿级数据存储,怎么设计?只是分库分表吗?

于是,尼恩组织小伙伴开始研究和 设计 《百亿级数据存储架构》,帮助大家打造一个新的黄金项目,实现大厂的梦想。

百亿级数据存储架构,只有分库分表吗?

很多的小伙伴来咨询尼恩, 百亿级数据存储怎么架构,说他们的面试中,都遇到的。

比如,前几天一个小伙伴面试字节,就遇到了这道题

字节面试:百亿级数据存储,怎么设计?

他们回答了分库分表。

大家都知道,当一个表(比如t_order) 达到500万条或2GB时,需要考虑水平分表。

这个虽然是常识了,但是面试官不满意。

很多的小伙伴来咨询尼恩,为什么?

这里,尼恩用20年的技术功力,给大家做一个彻底性、系统化梳理,帮助大家吊打面试。

从0到1, 百亿级数据存储架构,怎么设计?

咱们的生产需求上,百亿级数据存储架构, 一般来说,需要具备以下四个能力:

  • 高并发的在线ACID事务 (分库分表)
  • 高并发的在线搜索 (倒排表副本)
  • 海量数据的离线处理 (高可用+全量副本)
  • 冗余表双写能力 (不同业务维度的副本)

其中,上面的冗余表双写能力, 也就是 高并发的 多业务维度 在线ACID 事务处理能力

比如在海量订单场景,

  • 用户维度的在线ACID 事务订单处理能力,需要进行用户维度的分库分表。
  • 商家维度的在线ACID 事务订单处理能力,需要进行商家维度的分库分表。

如果不需要 不同业务维度的 在线ACID 事务订单处理能力,那么冗余表双写能力 这个是可选项。

这是引入这么多的副本,有好处,也有坏处:

  • 好处是满足各种各样的处理要求
  • 坏处是我们要维护多个副本之间的数据一致。

百亿级数据存储架构,多副本之间的数据一致如何实现?

便于商品的聚合搜索,高速搜索,采用两大优化方案:

  • 把商品数据冗余存储在Elasticsearch中,实现高速搜索
  • 把商品数据冗余存储在redis 中,实现高速缓存

在这里插入图片描述

很多的时候,要求保持很高的数据一致性。

比如:

  • 要求 mysql 与 es 做到秒级别的数据同步。
  • 要求 mysql 与 redis 做到秒级别的数据同步。
  • 要求 mysql 与 hbase 做到秒级别的数据同步。

接下来,以 mysql 与 es 的数据一致,作为业务场景进行分析, 其他的场景比如mysql 与 redis 的数据一致性方案,都是差不多的。

只要大家能把下面的 5大数据一致性方案, 滔滔不绝的说出来,面试官一定会爱到 “不能自已、口水直流”。

方案一:同步双写

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

在这里插入图片描述

同步双写优点:

这种方式简单粗暴,实时写入能做到秒级。

同步双写缺点:

  • 业务耦合,这种方式代码侵入性强,商品的管理中耦合大量数据同步代码,要在之前写 mysql 的地方加写 es 的代码。以后写 mysql 的地方也要加写 es 的代码。
  • 影响性能,写入两个存储,响应时间变长,本来 MySQL 的性能不是很高,再加一个 ES,系统的性能必然会下降。
  • 不便扩展:搜索可能有一些个性化需求,需要对数据进行聚合,这种方式不便实现
  • 高风险:存在双写失败丢数据风险

方案2:异步双写

同步操作性能低,异步性能高。

异步双写,分为两种:

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

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

先把商品数据写入DB后,然后把 数据写入 BlockingQueue 阻塞队列

消费线程异步从 drain 数据,batch 写入 ElasticSearch, 保证数据一致性

在这里插入图片描述

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

如果内存队列里边数据丢失,那么es 当中的数据和DB就不一致了

如何解决呢?

  • 方式1:定期同步 db数据到 es ,同步周期一般比较长,这里有比较长时间的不一致
  • 方式2: 保证队列的可靠性,使用高可靠消息队列

生产场景中,一般会有一个搜索服务,由搜索服务去订阅商品变动的消息,来完成同步。

在这里插入图片描述

异步双写优点:

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

异步双写缺点:

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

方案三:定期同步

为了保证 DB和ES /HBase 数据一致性,包括两个方面:

  • 增量数据一致性
  • 全量数据一致性

在这里插入图片描述

为了保证 DB和ES /HBase 的全量数据一致性, 往往需要进行定期的全量数据同步

在这里插入图片描述

数据增量数据,很少,并且,一致性要求不高,那么可以把增量数据一致性行的 同步双写、异步双写去掉。

在这里插入图片描述

定期同步优点:

实现比较简单

定期同步缺点:

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

当然,增量数据,可以考虑用定时任务来处理:

  1. 数据库的相关表中增加一个字段为 timestamp 的字段,任何 CURD 操作都会导致该字段的时间发生变化;
  2. 原来程序中的 CURD 操作不做任何变化;
  3. 增加一个定时器程序,让该程序按一定的时间周期扫描指定的表,把该时间段内发生变化的数据提取出来;
  4. 逐条写入到 ES 中。

方案四:数据订阅

如果要提高实时性,又要低入侵, 可以利用 MySQL 的 Binlog 来进行同步。

MySQL通过binlog订阅实现主从同步,canal Server 是一个伪装的slave节点,接收到binlog日志后,发送到MQ, 其他的 存储消费 MQ里边 的binlog日志,实现数据订阅。

架构图如下

在这里插入图片描述

这种方式和异步双写比较像,但是有两个优点:

  • 第一降低了商品服务的入侵性,
  • 第二数据的实时性更好。

所以使用数据订阅:

  • 优点:
    • 业务入侵较少
    • 实时性较好

至于数据订阅框架的选型,主流的大体上是这些:

CancalMaxwellPython-Mysql-Rplication
开源方阿里巴巴Zendesk社区
开发语言JavaJavaPython
活跃度活跃活跃活跃
高可用支持支持不支持
客户端Java/Go/PHP/Python/RustPython
消息落地Kafka/RocketMQ 等Kafka/RabbitNQ/Redis 等自定义
消息格式自定义JSON自定义
文档详略详细详细详细
Boostrap不支持支持不支持

注意,尼恩的100Wqps三级缓存组件架构实操中,也介绍了,这种架构,存在秒级延迟。

如果不允许有秒级延迟的场景,不能使用这种架构。

具体请参见 尼恩的100Wqps三级缓存组件架构实操。

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

为什么要有冗余表

当t_order表达到500万条或2GB时需要考虑水平分表,进行水平分表需要根据某个列进行分割,假设根据userId分割。用户查询自己的订单携带着userId,因此能够定位到具体哪张表。

而商家查询者自己店铺的订单,没办法确定userId,只能访问一遍所有的分表再合并结果,效率非常低。

为了加快商家端的查询,可以冗余一份订单表,这份冗余表根据merchantId切分,商家访问冗余表,效率就很好。

这是引入冗余表的好处,坏处是我们要维护普通表和冗余表的数据一致。

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

在这里插入图片描述

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

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

缺点:

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

在这里插入图片描述

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

  • 处理时间是单次写

缺点

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

方案六: ETL数据同步

在这里插入图片描述

一致性分为两种:

  • 增量一致性: 前面的的双写方案,主要是保持增量数据的一致性。

  • 全量一致性: ETL数据同步主要用于同步全量数据。

MySQL数据全量同步到Redis、MySQL同步到hbase、MySQL同步到es、或机房同步、主从同步等,都可以考虑使用elt工具。

什么是etl 工具呢?

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

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

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

下面以 databus为例,介绍一下。

Databus 是一个低延迟、可靠的、支持事务的、保持一致性的数据变更抓取系统。由 LinkedIn 于 2013 年开源。

Databus 通过挖掘数据库日志的方式,将数据库变更实时、可靠的从数据库拉取出来,业务可以通过定制化 client 实时获取变更并进行其他业务逻辑。

特点:

  • 多数据源:Databus 支持多种数据来源的变更抓取,包括 Oracle 和 MySQL。
  • 可扩展、高度可用:Databus 能扩展到支持数千消费者和事务数据来源,同时保持高度可用性。
  • 事务按序提交:Databus 能保持来源数据库中的事务完整性,并按照事务分组和来源的提交顺寻交付变更事件。
  • 低延迟、支持多种订阅机制:数据源变更完成后,Databus 能在毫秒级内将事务提交给消费者。同时,消费者使用D atabus 中的服务器端过滤功能,可以只获取自己需要的特定数据。
  • 无限回溯:对消费者支持无限回溯能力,例如当消费者需要产生数据的完整拷贝时,它不会对数据库产生任何额外负担。当消费者的数据大大落后于来源数据库时,也可以使用该功能。

再看看 Databus 的系统架构。

Databus 由 Relays、bootstrap 服务和 Client lib 等组成,Bootstrap 服务中包括 Bootstrap Producer 和 Bootstrap Server。
在这里插入图片描述

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

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

从0到1, 百亿级数据存储架构,怎么设计?

从0到1, 百亿级数据存储架构,40岁老架构尼恩团队,计划用一个系列的文章帮大家实现这个架构难题,这个系列还会录成视频,并辅导大家写入简历。

这个系列包括:

  • 高并发搜索篇:从0到1, 从入门到 ElasticSearch 工业级使用
  • 100亿级任务调度篇:从0到1, 从入门到 XXLJOB 工业级使用
  • 100亿级海量存储篇:从0到1, 从入门到 HABSE 工业级使用
  • 100亿级离线计算篇:从0到1, 从入门到 Flink 工业级使用

已经发布的文章包括:

100亿级任务调度篇:从0到1, 从入门到 XXLJOB 工业级使用

说在最后:有问题找老架构取经

百亿级数据存储架构,一定是一个超级牛掰的简历亮点项目,黄金项目,稍微晚点把全量的架构方案和视频进行发布。

这个项目写入简历,面试的时候如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。

最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。

在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典》V174,在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

另外,如果没有面试机会,可以找尼恩来帮扶、领路。

  • 大龄男的最佳出路是 架构+ 管理
  • 大龄女的最佳出路是 DPM,

在这里插入图片描述

女程序员如何成为DPM,请参见:

DPM (双栖)陪跑,助力小白一步登天,升格 产品经理+研发经理

领跑模式,尼恩已经指导了大量的就业困难的小伙伴上岸。

前段时间,领跑一个40岁+就业困难小伙伴拿到了一个年薪100W的offer,小伙伴实现了 逆天改命

另外,尼恩也给一线企业提供 《DDD 的架构落地》企业内部培训,目前给不少企业做过内部的咨询和培训,效果非常好。

在这里插入图片描述

尼恩技术圣经系列PDF

  • 《NIO圣经:一次穿透NIO、Selector、Epoll底层原理》
  • 《Docker圣经:大白话说Docker底层原理,6W字实现Docker自由》
  • 《K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由》
  • 《SpringCloud Alibaba 学习圣经,10万字实现SpringCloud 自由》
  • 《大数据HBase学习圣经:一本书实现HBase学习自由》
  • 《大数据Flink学习圣经:一本书实现大数据Flink自由》
  • 《响应式圣经:10W字,实现Spring响应式编程自由》
  • 《Go学习圣经:Go语言实现高并发CRUD业务开发》

……完整版尼恩技术圣经PDF集群,请找尼恩领取

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

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

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

相关文章

cuda 11.6 pytorch安装

在安装之前,需要先配置GPU环境(安装CUDA和CudaNN) 命令行输入nvidia-smi,查看驱动信息 nvidia-smi 安装相应的CUDA 和CUDANN 验证:输入nvcc --version 或者nvcc -V 进行检查 nvcc --version nvcc -V 在anaconda里创建环境 con…

彭永东所交“答卷”道尽万般无奈,贝壳找房营收、利润双双锐减

就今年第一季度业绩披露后两日的股价变动来看,贝壳找房(下称“贝壳”)似乎并未在港股和美股市场取得预期的效果。 港股市场,截至5月24日收盘,贝壳-W(HK:02423)报收43.9港元/股,当日跌…

海外网红营销新趋势:“快闪式”营销如何迅速提升品牌曝光度

在当今数字化时代,海外网红营销已成为品牌迅速触达全球消费者、提升品牌曝光度和刺激销售的重要手段。其中,“快闪式”营销以其独特的时效性、创意性和互动性,成为品牌与海外网红合作的新趋势。本文Nox聚星将和大家探讨如何利用海外网红的影响…

梭住绿色,植梦WILL来,容声冰箱“节能森林计划”再启航

近日,容声冰箱再度开启了“节能森林计划”绿色公益之旅。 据「TMT星球」了解,此次活动深入到阿拉善荒漠化地带,通过实地考察和亲身体验,见证容声了“节能森林计划”项目的持续落地和实施效果。 2022年,容声冰箱启动了…

5个好用的AI写论文网站推荐

目录 1.AIQuora论文写作 2.passyyds 答辩PPT 3.AIPassgo论文降AIGC 4.文状元 5.passyyds论文写作 毕业论文是每个毕业生的痛,不管你是本科还是硕士要想顺利毕业你就不得不面对论文。然而,面对论文写作时常常感到无从下手:有时缺乏灵感&a…

微信小程序毕业设计-跑腿系统项目开发实战(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

ChAMP加载肺癌数据和分析甲基化数据流程

ChAMP加载肺癌数据和分析甲基化数据流程 1. 加载数据分析 #!/bin/evn R rm(list = ls()) library(rstudioapi) current_script_path <- getActiveDocumentContext()$path# 将路径转换为当前目录 current_directory <- dirname(current_script_path)# 设置当前工作目录 …

【数据结构】红黑树——领略天才的想法

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 二叉搜索树 AVL树 红黑树概述 性质详解 效率对比 旋转操作 元素操作 代码实现 二叉搜索树 【数据结构】二叉搜索树-CSDN博客 AVL树 【数据结构】AVL树——平衡二叉搜索…

摸鱼大数据——Hive表操作——基本操作

Hive表操作 Hive乱码解决 1、乱码现象 create database test1 comment "乱码测试"; use test1; CREATE TABLE orders ( orderId bigint COMMENT 订单id, orderNo string COMMENT 订单编号, shopId bigint COMMENT 门店id ); 2、处理步骤 注意&#…

uniapp页面vue3下拉触底发送获取新数据请求实现分页功能

页面下拉触底获取新数据实现分页功能实现方式有两种&#xff0c;根据自己的业务需求来定&#xff0c;不同的方案适用场景不一样&#xff0c;有的是一整个页面下拉获取新数据&#xff0c;有的是部分盒子内容滚动到底部时候实现获取新数据&#xff0c;下面讨论一下两种方式的区别…

是他将计算机从“一屋子”变成“一柜子”——量子前哨缅怀小型机之父 戈登·贝尔

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;6000字丨15分钟阅读 5 月 21 日&#xff0c; 美国贝尔实验室资深人士 John Mashey 发布消息称&#xff0c;计算机先驱戈登贝尔&#xff08;Gordon…

精通C++ STL(二):string类的模拟实现

目录 string类各函数接口总览 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载函数 析构函数 迭代器相关函数 begin和end 容量和大小相关函数 size和capacity reserve和resize empty 修改字符串相关函数 push_back append operator insert erase clear swap c_str 访…

[数据集][目标检测]森林火灾检测数据集VOC+YOLO格式362张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;362 标注数量(xml文件个数)&#xff1a;362 标注数量(txt文件个数)&#xff1a;362 标注类别…

《开发问题解决》Window下7z解压:cannot create symbolic link : 客户端没有所需的特权

问题描述&#xff1a; 今天使用7z来解压东西的是突然出现这个问题。 问题解决&#xff1a; download直接下载到c盘中&#xff0c;由于所在文件夹有权限限制。无法进行正常解压。 7.zip解压时使用管理员权限进行解压&#xff0c;解压时使用管理员权限。即如图 使用管理员权限重…

代码随想录算法训练营第四十一天|动态规划理论基础、509. 斐波那契数列、70. 爬楼梯、746. 使用最小花费爬楼梯

动态规划理论基础 什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就…

android-mvp模式

mvvm可以理解成使用databing的mvp模式&#xff0c;modleview 通过接口让view和Presenter层解耦 从图中就可以看出&#xff0c;最明显的差别就是view层和model层不再相互可知&#xff0c;完全的解耦&#xff0c;取而代之的presenter层充当了桥梁的作用&#xff0c;用于操作view…

技术面‍:前端代码是如何与服务器交互的

前言&#xff1a; 本篇文章主要是想讲解 .html 文件和 .CSS 文件在实际开发中和后端服务器交互最后上线的基础原理。 面向的人群&#x1f195;&#xff1a;是刚入行不久&#xff0c;且目前只会写前端业务代码而不清楚整个工作流的前端新人。我会从 0 开始一步一步带你理解整个…

Kubernetes(k8s) v1.30.1 本地集群部署 安装metallb 支持LoadBalancer 生产环境 推荐 BGP模式部署

1 metallb 安装参考:Kubernetes(k8s) v1.30.1 本地集群部署 默认不支持LoadBalancer metallb来解决-CSDN博客 2 删除 Layer 2 模式 配置 kubectl delete -f IPAddressPool.yaml kubectl delete -f L2Advertisement.yaml kubectl delete -f discuz-srv.yaml 3 配置 k8s Metal…

2024电工杯数学建模B题完整论文讲解(含每一问python代码+数据)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024电工杯数学建模B题大学生平衡膳食食谱的优化设计及评价完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 …

【Python】 XGBoost模型的使用案例及原理解析

原谅把你带走的雨天 在渐渐模糊的窗前 每个人最后都要说再见 原谅被你带走的永远 微笑着容易过一天 也许是我已经 老了一点 那些日子你会不会舍不得 思念就像关不紧的门 空气里有幸福的灰尘 否则为何闭上眼睛的时候 又全都想起了 谁都别说 让我一个人躲一躲 你的承诺 我竟然没怀…