• 电商类面试问题--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节点。

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

  • 相关阅读:
    低代码到底是什么?
    开源在医疗健康领域的应用
    Github每日精选(第42期):web前端自定义Alert窗口sweetalert
    MongoDB 全文检索
    CCE云原生混部场景下的测试案例
    AutoDL使用手册
    日志巡检内容
    矩阵初等变换与矩阵乘法的联系
    Linux网络编程系列之服务器编程——多路复用模型
    视觉SLAM第五讲
  • 原文地址:https://blog.csdn.net/qq_37154446/article/details/132655792