JAVA面试题分享二百五十五:mysql 和 es 的5个一致性方案,你知道吗?

这篇具有很好参考价值的文章主要介绍了JAVA面试题分享二百五十五:mysql 和 es 的5个一致性方案,你知道吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

问题场景分析

方案一:同步双写

方案二:异步双写

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

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

方案三:定期同步

方案四:数据订阅

方案五:etl 工具


问题场景分析

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

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

  • 把商品数据冗余存储在redis 中,实现高速缓存JAVA面试题分享二百五十五:mysql 和 es 的5个一致性方案,你知道吗?,JAVA 面试题分享,Mysql 面试题分享,ElasticSearch 内容分享,java,mysql,elasticsearch

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

比如:

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

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

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

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

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

方案一:同步双写

同步双写是一种最为简单的方式,在将数据写到 MySQL 时,同时将数据写到 ES。JAVA面试题分享二百五十五:mysql 和 es 的5个一致性方案,你知道吗?,JAVA 面试题分享,Mysql 面试题分享,ElasticSearch 内容分享,java,mysql,elasticsearch

同步双写优点:

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

同步双写缺点:

  • 业务耦合,这种方式代码侵入性强,商品的管理中耦合大量数据同步代码,要在之前写 mysql 的地方加写 es 的代码。以后写 mysql 的地方也要加写 es 的代码。

  • 影响性能,写入两个存储,响应时间变长,本来 MySQL 的性能不是很高,再加一个 ES,系统的性能必然会下降。

  • 不便扩展:搜索可能有一些个性化需求,需要对数据进行聚合,这种方式不便实现

  • 高风险:存在双写失败丢数据风险

方案二:异步双写

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

异步双写,分为两种:

  • 使用内存队列(如阻塞队列)异步

  • 使用消息队列进行异步

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

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

消费线程异步从 drain 数据,batch 写入 ElasticSearch,  保证数据一致性JAVA面试题分享二百五十五:mysql 和 es 的5个一致性方案,你知道吗?,JAVA 面试题分享,Mysql 面试题分享,ElasticSearch 内容分享,java,mysql,elasticsearch

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

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

如果解决呢?

  • 方式1:定期同步 db数据到 es ,同步周期一般比较长,这里有比较长时间的不一致

  • 方式2:保证队列的可靠性,使用高可靠消息队列

生产场景中,一般会有一个搜索服务,由搜索服务去订阅商品变动的消息,来完成同步。JAVA面试题分享二百五十五:mysql 和 es 的5个一致性方案,你知道吗?,JAVA 面试题分享,Mysql 面试题分享,ElasticSearch 内容分享,java,mysql,elasticsearch

异步双写优点:

  • 性能高;

  • 不易出现数据丢失问题,主要基于 MQ 消息的消费保障机制,比如 ES 宕机或者写入失败,还能重新消费 MQ 消息;

  • 多源写入之间相互隔离,便于扩展更多的数据源写入。

异步双写缺点:

  • 硬编码问题,接入新的数据源需要实现新的消费者代码;

  • 系统复杂度增加,引入了消息中间件;

  • MQ是异步消费模型,用户写入的数据不一定可以马上看到,造成延时。

方案三:定期同步

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

  • 增量数据一致性

  • 全量数据一致性JAVA面试题分享二百五十五:mysql 和 es 的5个一致性方案,你知道吗?,JAVA 面试题分享,Mysql 面试题分享,ElasticSearch 内容分享,java,mysql,elasticsearch

为了保证 DB和ES /HBase 的全量数据一致性, 往往需要进行定期的全量数据同步JAVA面试题分享二百五十五:mysql 和 es 的5个一致性方案,你知道吗?,JAVA 面试题分享,Mysql 面试题分享,ElasticSearch 内容分享,java,mysql,elasticsearch

数据增量数据,很少,并且,一致性要求不高,那么可以把增量数据一致性行的 同步双写、异步双写去掉。JAVA面试题分享二百五十五:mysql 和 es 的5个一致性方案,你知道吗?,JAVA 面试题分享,Mysql 面试题分享,ElasticSearch 内容分享,java,mysql,elasticsearch

定期同步优点:

实现比较简单

定期同步缺点:

  • 实时性难以保证

  • 对存储压力较大

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

  1. 数据库的相关表中增加一个字段为 timestamp 的字段,任何 CURD 操作都会导致该字段的时间发生变化;

  2. 原来程序中的 CURD 操作不做任何变化;

  3. 增加一个定时器程序,让该程序按一定的时间周期扫描指定的表,把该时间段内发生变化的数据提取出来;

  4. 逐条写入到 ES 中。

方案四:数据订阅

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

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

架构图如下JAVA面试题分享二百五十五:mysql 和 es 的5个一致性方案,你知道吗?,JAVA 面试题分享,Mysql 面试题分享,ElasticSearch 内容分享,java,mysql,elasticsearch

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

  • 第一降低了商品服务的入侵性,

  • 第二数据的实时性更好。

所以使用数据订阅:

  • 优点:

    • 业务入侵较少

    • 实时性较好

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

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

注意,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://www.toymoban.com/news/detail-766450.html

到了这里,关于JAVA面试题分享二百五十五:mysql 和 es 的5个一致性方案,你知道吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android12之如何查看hidl服务(一百五十五)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:An

    2024年02月09日
    浏览(41)
  • ES6——ES6相关面试题分享

    文章目录 前言 一、什么是ES6,以及引入ES6的原因 二、let,var,const三者的区别。 三、运用ES6如何合并两个对象? 四、for...in 和for...of有什么区别。 五、 箭头函数的this和普通函数的this的区别。 六、Es6中如何定义模板字符串,有什么好处。 七、Array的扩展方法map和filter相同

    2024年02月15日
    浏览(42)
  • java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM

    目录 基础篇 一、Get 和 Post 的区别 二、Java 多态的具体体现 三、StringBuffer StringBuilder String 区别 四、==和 equals 区别 五、重写 equals 需要重写 hashCode 吗 六、java 的基本数据类型 七、List, Set, Collection, Collections   八、ArrayList 和 LinedList 区别 九、HashMap 和 Hashtable 区别 十、Forward

    2023年04月20日
    浏览(121)
  • 后端面试话术集锦第 十五 篇:java线程面试话术

    这是后端面试集锦第十五篇博文—— java 线程面试话术❗❗❗ 首先呢, Thread 类本质上是实现了 Runnable 接口,代表一个线程的实例。 所以, 我们可以编写一个类,继承Thread类,或者直接实现Runnable接口 。然后,再重写下~run方法就行了。启动线程的方式就是调用类里边的 s

    2024年02月10日
    浏览(27)
  • 架构设计内容分享(二百一十):设计一个大并发、大数据的系统架构,说说设计思路

    目录 大并发/大数据的软件有如下特点 大并发/大数据的架构目标有如下几个 大并发/大数据的设计思路与原则 大并发/大数据的分层架构 1 接入层的架构方案: 第二三层:应用层/服务层架构方案 第四层:数据层架构方案 第五层:基础设施层架构 高并发核武器:单元化+异地

    2024年02月21日
    浏览(48)
  • 架构设计内容分享(二百零一):什么是数据仓库的架构?企业数据仓库架构如何建设?

    目录 企业数据仓库架构 单层架构(直连) 两层数据架构(数据集市层) 三层架构(OLAP) 数据仓库数据库 1、采用传统关系型数据库,或经过功能扩展的MPP数据库 2、大数据平台架构:Hadoop+Hive 采集、收集、清洗和转换工具(ETL) 1、抽取 2、清洗 3、转化和加载 前端应用工具

    2024年02月21日
    浏览(45)
  • 美团面试:ES+Redis+MySQL高可用,如何实现?

    在40岁老架构师 尼恩的 读者交流群 (50+)中,尼恩一直在指导大家改造简历、指导面试。指导很多小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、美团的面试资格,拿到大厂offer。 前几天,指导了一个40岁老伙伴拿到年薪100W offer,

    2024年02月03日
    浏览(45)
  • 【教程分享】Docker搭建Zipkin,实现数据持久化到MySQL、ES

    指定版本,在git查看相应版本,参考: https://github.com/openzipkin/zipkin 如2.21.7 Zipkin默认端口为9411。启动时通过-e server.port=xxxx设置指定端口 --restart=always 可以让容器在退出后自动重启,保证可用性 -p 9411:9411 是端口映射,将容器内部默认的 9411 端口映射到宿主机的 9411 端口,方便访问

    2024年02月11日
    浏览(60)
  • MySQL 到 Elasticsearch 实时数据同步实操分享,Python进阶面试资料无偿分享

    测试连接,提示测试通过 测试通过后保存连接即可。 第二步:配置 Elasticsearch 连接 1.同第一步操作,点击左侧菜单栏的【连接管理】,然后点击右侧区域【连接列表】右上角的【创建连接】按钮,打开连接类型选择页面,然后选择 Elasticsearch 2.在打开的连接信息配置页面依次

    2024年04月10日
    浏览(38)
  • 架构设计内容分享(一百三十三):ES+Redis+MySQL高可用,如何试实现?

    目录 背景: ES 高可用方案: ES 双中心主备集群架构 ES 流量隔离三集群架构 ES 集群深度优化提升 会员 Redis 缓存方案: ES 近一秒延时导致的 Redis 缓存数据不一致问题的解决方案 Redis 双中心多集群架构 高可用会员主库方案: MySQL 双中心 Partition 集群方案 会员主库平滑迁移方

    2024年02月22日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包