• 电商类面试问题--01Elasticsearch与Mysql数据同步问题


    在实现基于关键字的搜索时,首先需要确保MySQL数据库和ES库中的数据是同步的。为了解决这个问题,可以考虑两层方案。

    1. 全量同步:全量同步是在服务初始化阶段将MySQL中的数据与ES库中的数据进行全量同步。可以在服务启动时,对ES库进行全量数据同步操作,以确保数据的一致性。而在停止服务时,可以清空ES的缓存库,以便下次启动服务时进行全量同步。
    2. 增量同步:为了实现热同步,即在不重启服务的情况下保持数据的同步,可以使用增量同步来处理新的或修改过的数据。有几种增量同步的实现方式可供选择。
    • 同步双写:最初的方案是通过同步双写的方式,在MySQL中有数据插入或修改时,同时对ES中的数据进行同步更新或插入。然而,由于这种方式会导致代码的耦合性较高,这是个劣势,面试可以点一下。
    • 异步双写:为了解决代码耦合性的问题,引入了RabbitMQ作为中间件。在数据写入ES之前,数据先被发送到RabbitMQ中,然后RabbitMQ消费数据并将其写入ES。如果写入失败,可以采取熔断降级策略,将数据发送到死信队列,并进行重试,直到成功写入ES为止。虽然这种方式可能会存在一些延时,但相对于保证数据一致性而言,是可以容忍的。

    优化方案: 为了进一步优化数据同步的性能和可靠性,还可以考虑了以下方案:

    • 批量同步:将多条记录批量写入ES,而不是每条记录都发送一次请求,可以减少网络开销并提高写入性能。
    • 并发同步:使用多线程或异步任务来并行处理同步操作,从而提高同步速度和吞吐量。
    • 数据过滤:根据需求过滤需要同步的数据,避免同步无关的数据,减少同步工作量和资源消耗。
    • 监控和重试机制:实现监控和报警机制,及时发现同步异常或失败,并进行相应的重试或错误处理。

    另外,还考虑到每次关闭和重启服务时全量同步时间逐渐增长的问题。

    解决方案是设置两个ES服务器副本。一个服务器(A节点)一直进行同量写入,并将数据同时写入主节点(A节点)和备份节点(B节点)。当需要升级A节点时,可以切换请求到B节点,暂停A节点的服务进行升级,而B节点继续提供服务。这样就实现了数据的无缝衔接,在不需要大量同步时间的情况下完成搜索服务的执行。待A节点完成升级后,再将其与B节点进行数据同步,然后切回A节点。

    通过上述优化措施,可以进一步提高数据同步的性能、效率和可靠性。
    喜欢关注一下呀

  • 相关阅读:
    java计算机毕业设计web家教管理系统源码+mysql数据库+系统+lw文档+部署
    跳跃游戏(贪心思想)
    【游戏开发实战】【UI框架】【处理界面上图片异步加载导致的突兀变化】
    【java_wxid项目】【第九章】【Apache Mybatis集成】
    软航H5 PDF签章产品经nginx代理之后浏览器中PDF盖章时提示:签章失败:网络错误 的问题排查及解决办法
    【1024 | 程序员节】浅谈前端开发中常用的设计模式——适配器模式、工厂模式、单例模式等
    带你玩转Redis 的String 数据类型
    《HelloGitHub》第 80 期
    如何执行建设项目的时间影响分析?
    安装libX11过程记录
  • 原文地址:https://blog.csdn.net/qq_37154446/article/details/132655792