淘宝太细了:mysql 和 es 的5个一致性方案,你知道吗?

news2024/11/16 23:33:15

说在前面

在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如拼多多、极兔、有赞、希音的面试资格,遇到一几个很重要的面试题:

  • 说5种mysql 和 elasticsearch 数据一致性方案

与之类似的、其他小伙伴遇到过的问题还有:

  • Mysql 和 ES 数据一致性问题及方案?
  • Mysql 和 redis 数据一致性问题及方案?
  • 如果保证 Mysql 和 redis 数据一致性?
  • 如果保证 Mysql 和 HBase数据一致性?
  • 等等等等…

这里尼恩给大家做一下系统化、体系化的线程池梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典》V70版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

最新《尼恩 架构笔记》《尼恩高并发三部曲》、《尼恩Java面试宝典》 的PDF文件,请到文末公众号【技术自由圈】取得

文章目录

    • 说在前面
    • 问题场景分析
    • 方案一:同步双写
    • 方案二:异步双写
      • 方案2.1 使用内存队列(如阻塞队列)异步
      • 方案2.2 使用消息队列(如阻塞队列)异步
    • 方案三:定期同步
    • 方案四:数据订阅
    • 方案五:etl 工具
    • 说在最后
    • 参考文献:
    • 技术自由的实现路径 PDF:
        • 实现你的 架构自由:
        • 实现你的 响应式 自由:
        • 实现你的 spring cloud 自由:
        • 实现你的 linux 自由:
        • 实现你的 网络 自由:
        • 实现你的 分布式锁 自由:
        • 实现你的 王者组件 自由:
        • 实现你的 面试题 自由:

问题场景分析

咱们的生产需求上,为了便于商品的聚合搜索,高速搜索,采用两大优化方案:

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

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

比如:

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

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

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

方案一:同步双写

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

同步双写优点:

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

同步双写缺点:

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

方案二:异步双写

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

异步双写,分为两种:

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

方案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三级缓存组件架构实操。

方案五: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

说在最后

数据一致性的方案,是非常常见的面试题。

以上的5大方案,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。

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

学习过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

本文题目以及参考答案,收入咱们的 《尼恩Java面试宝典》V70版本,请到文末公号【技术自由圈】获取

参考文献:

清华大学出版社 《尼恩 Java 高并发核心编程 卷2 加强版》

4000页《尼恩Java面试宝典》中 专题29 多线程 面试专题

[1]. https://www.infoq.cn/article/1afyz3b6hnhprrg12833

[2].https://www.iamle.com/archives/2900.html

[3].https://blog.51cto.com/lianghecai/4755693

[4].https://qinyuanpei.github.io/posts/1333693167/

[5].https://github.com/alibaba/canal/wiki/ClientAdapter

技术自由的实现路径 PDF:

实现你的 架构自由:

《吃透8图1模板,人人可以做架构》

《10Wqps评论中台,如何架构?B站是这么做的!!!》

《阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了》

《峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?》

《100亿级订单怎么调度,来一个大厂的极品方案》

《2个大厂 100亿级 超大流量 红包 架构方案》

… 更多架构文章,正在添加中

实现你的 响应式 自由:

《响应式圣经:10W字,实现Spring响应式编程自由》

这是老版本 《Flux、Mono、Reactor 实战(史上最全)》

实现你的 spring cloud 自由:

《Spring cloud Alibaba 学习圣经》

《分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)》

《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)》

实现你的 linux 自由:

《Linux命令大全:2W多字,一次实现Linux自由》

实现你的 网络 自由:

《TCP协议详解 (史上最全)》

《网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!》

实现你的 分布式锁 自由:

《Redis分布式锁(图解 - 秒懂 - 史上最全)》

《Zookeeper 分布式锁 - 图解 - 秒懂》

实现你的 王者组件 自由:

《队列之王: Disruptor 原理、架构、源码 一文穿透》

《缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)》

《缓存之王:Caffeine 的使用(史上最全)》

《Java Agent 探针、字节码增强 ByteBuddy(史上最全)》

实现你的 面试题 自由:

4000页《尼恩Java面试宝典 》 40个专题

以上尼恩 架构笔记、面试题 的PDF文件更新,▼请到下面【技术自由圈】公号取 ▼

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

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

相关文章

电脑怎么隐藏文件夹?这样做,快速搞定!

案例:我想把一些敏感和重要的文件夹隐藏起来,不想别人看到它们。在电脑上如何隐藏电脑文件夹?有没有小伙伴知道如何操作?急需! 我们在使用电脑的过程中,会产生大量文件,有些文件可能包含私密信…

4.1 Spark SQL概述、数据帧与数据集

一、数据帧 - DataFrame (一)准备工作 1、准备数据文件 2、启动Spark Shell (二)加载数据为Dataset 1、读文件得数据集 2、显示数据集内容 3、显示数据集模式 (三)给数据集添加元数据信息 1、定…

强!PCB“金手指”从设计到生产全流程

在电脑内存条、显卡上,有一排金黄色导电触片,就是大家俗称的“金手指”。 在PCB设计制作行业中的“金手指”(Gold Finger,或称Edge Connector),是由connector连接器作为PCB板对外连接网络的出口。 关于“金手指”你知道多少呢&a…

像核战争一样,AI可能灭绝人类:Geoffrey Hinton、Sam Altman等百名专家签署了一封公开信

多位图灵奖得主、顶级 AI 公司 CEO、顶尖高校教授,与数百位在各自领域享有话语权的专家,共同签署了一份公开信,内容简单却有力: 降低 AI 灭绝人类的风险,应该与大流行病、核战争等其他社会规模的风险一样,…

AI落地:儿童节礼物指南

这个儿童节,用AI做点不一样的礼物,给孩子一个惊喜。 可行清单: 写走心的贺卡(增强表达能力,培养心思细腻)用AI让孩子的画的小人动起来(激发创造力,培养想象力)把孩子的…

Ansys Zemax | 如何模拟部分反射和散射的表面

这篇文章介绍了如何模拟一个部分反射的表面,该表面会根据指定的散射分布对一部分入射光能量进行散射。本文介绍的示例包含部分吸收以及部分镜面反射的情况。(联系我们获取文章附件) 介绍 使用 OpticStudio 非序列模式模拟散射和膜层的能力,我们可以模拟一…

MFC按钮中添加图标

目录 一、创建对话框 二、 开始添加 1、将.ico图片放进res路径下 2、添加资源 3、添加按钮 4、将按钮属性中icon修改为true 5、代码添加 一、创建对话框 首先需要创建个对话框程序,参考之前写的博客: mfc入门基础(三)创…

浅谈智能化配电室在居民小区的建设应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要:近年来居民小区配电室的数量增长快且设备情况较复杂,以致巡视效果不理想、缺陷和事故处理不及时,亟需建立一套智能化的配电室监控系统。按照实用性、统一性、分层和模块化设计…

RobotFramework接口测试方案

1. Robot FrameWork介绍 1.1 介绍 Robot Framework是用于验收测试和回归测试的通用测试自动化框架。它使用易于理解的表格数据语法,非常友好的实现了关键字驱动和数据驱动模式。它的测试功能可以通过使用Python或Java实现的测试库进行扩展,用户可以使用…

RCE代码及命令执行漏洞全解(30)

web应用中,有时候程序员为了考虑灵活性,简洁性,会在代码中调用代码或执行命令执行函数去处理。 比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能够控制这些字符串,将代码执行漏洞,同…

华为OD机试真题B卷 Java 实现【求最大连续bit数】,附详细解题思路

一、题目描述 求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1。 二、输入描述 输入一个int类型数字。 三、输出描述 输出转成二进制之后连续1的个数。 四、解题思路 首先通过输入获取一个 int 类型的数…

K8s环境使用Triton实现云端模型推理

前置条件:K8集群、helm 1、以模型名作为目录名,创建目录 mkdir resnet50_pytorch 2、将模型文件、配置文件(输入、输出等)存到刚创建的目录下,resnet50_pytorch目录下文件层级结构如下 model-respository/ └── …

【C++模版】模版进阶 {非类型模版参数; 模版的特化; 模版的分离编译; 模版总结}

一、非类型模版参数 模板参数分类型形参与非类型形参。 类型形参:出现在模板参数列表中,跟在class或者typename之后的参数类型名称。非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来…

mysql中的锁浅析

前言 MySQL 锁机制是保证多个并发事务同时访问数据库时数据一致性的重要手段,也是 MySQL 的重要特性之一。在实际开发使用 MySQL 数据库时,了解并掌握 MySQL 的锁机制非常重要,因为不正确的锁机制使用很容易出现严重的性能瓶颈和数据不一致等…

尚硅谷大数据hadoop教程_mapReduce

p67 课程介绍 p68概述 p69 mapreduce核心思想 p70 wordcount源码 序列化类型 mapReduce三类进程 p71 编程规范 用户编写的程序分成三个部分:Mapper、Reducer和Driver。 P72 wordcount需求案例分析 p 73 -78 案例环境准备 (1)创建maven…

写代码?文心一言or文言文,谁更胜一筹?新工具或许可堪重任

中国版的ChatGPT“文心一言”写代码能力尚浅 被称为中国版的“ChatGPT”的“文心一言”可以说是上市几个月了,很多用户都受到了邀请码来体验,遗憾的是,小编早就申请了,但还在排队等待中。虽然没有亲自体验过百度的“文心一言”&a…

NET HELPMSG 3534 报错(以及其他一些在配置过程中遇到的问题)

使用了带管理员权限的 PowerShell(即在管理员权限下运行CMD) 然后进行安装和服务启动操作 1、清空 MySQL 下的 data 文件夹; 2、确保系统环境变量中已经配置了 mysql 的 bin 目录到Path中; 3、执行以下命令: sc delet…

基于条件风险价值CVaR的微网动态定价与调度策略(matlab代码)

目录 1 主要内容 模型示意图 电能交易流程 模型亮点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序复现文章《A cooperative Stackelberg game based energy management considering price discrimination and risk assessment》,建立基于主从博弈的考…

【封装frame模型 Objective-C语言】

一、计算每行的高度 1.计算每行的高度,它就等于最后这个控件, 如果说,当前这行是有配图的,那么这个行高,就等于这个配图最大的Y值,加上一个margin, 如果说,这行是没有配图的 如果说,这行是没有配图的 那么就等于它正文的最大的Y值,加一个margin, 是不是很简单,…

海昌海洋公园携手盖雅工场,数字化人才管理助力企业踏浪前行

五一假期刚刚结束,但各地主题公园里的游客依然爆满。在这种客流高峰期,游客更加关注乐园的细节和服务水平,保障服务品质和顾客体验是各地主题乐园在竞争中脱颖而出的关键因素之一。为此,乐园高峰期需要大量招聘短期工、临时工、兼…