数据同步-Mysql同步到ElasticSearch

news2024/11/26 4:45:37

Mysql同步到ElasticSearch

  • 数据同步
    • 1、定时任务
    • 2、双写
    • 3、MQ异步写入
    • 4、Logstash
    • 5、Canal

数据同步

一般情况下,如果做查询搜索功能,使用 ES 来模糊搜索,但是数据是存放在数据库 MySQL 里的,所以说我们需要把 MySQL 中的数据和 ES 进行同步,保证数据一致(以 MySQL 为主)。

数据同步包含:全量同步 (首次) + 增量同步(新数据)。

首次安装完 ES,把 MySQL 数据全量同步到 ES 里,写一个单次脚本。

public class FullSyncPostToEs implements CommandLineRunner {

    @Resource
    private PostService postService;

    @Resource
    private PostEsDao postEsDao;

    @Override
    public void run(String... args) {
        List<Post> postList = postService.list();
        if (CollectionUtils.isEmpty(postList)) {
            return;
        }
        List<PostEsDTO> postEsDTOList = postList.stream().map(PostEsDTO::objToDto).collect(Collectors.toList());
        final int pageSize = 500;
        int total = postEsDTOList.size();
        log.info("FullSyncPostToEs start, total {}", total);
        for (int i = 0; i < total; i += pageSize) {
            int end = Math.min(i + pageSize, total);
            log.info("sync from {} to {}", i, end);
            postEsDao.saveAll(postEsDTOList.subList(i, end));
        }
        log.info("FullSyncPostToEs end, total {}", total);
    }
}

增量同步有五种方式:

1、定时任务

  • 定时任务:比如1 分钟 1 次,找到 MySQL 中过去几分钟内(至少是定时周期的 2 倍)发生改变的数据,然后更新到 ES。
public class IncSyncPostToEs {

    @Resource
    private PostMapper postMapper;

    @Resource
    private PostEsDao postEsDao;

    /**
     * 每分钟执行一次
     */
    @Scheduled(fixedRate = 60 * 1000)
    public void run() {
        // 查询近 5 分钟内的数据
        Date fiveMinutesAgoDate = new Date(new Date().getTime() - 5 * 60 * 1000L);
        List<Post> postList = postMapper.listPostWithDelete(fiveMinutesAgoDate);
        if (CollectionUtils.isEmpty(postList)) {
            log.info("no inc post");
            return;
        }
        List<PostEsDTO> postEsDTOList = postList.stream()
                .map(PostEsDTO::objToDto)
                .collect(Collectors.toList());
        final int pageSize = 500;
        int total = postEsDTOList.size();
        log.info("IncSyncPostToEs start, total {}", total);
        for (int i = 0; i < total; i += pageSize) {
            int end = Math.min(i + pageSize, total);
            log.info("sync from {} to {}", i, end);
            postEsDao.saveAll(postEsDTOList.subList(i, end));
        }
        log.info("IncSyncPostToEs end, total {}", total);
    }
}

优点:简单易懂、占用资源少、不用引入第三方中间件;
缺点:有时间差;
应用场景:数据时间内不同步影响不大、或者数据几乎不发生修改;

2、双写

  • 双写:写数据的时候,必须去写入到ES,更新、删除都需要操作ES(加事务:可能存在写入某一方出现失败,形成脏数据)。

3、MQ异步写入

  • MQ异步写入:在写入数据库时,通过MQ异步写入ES,同样可能存在数据写入不一致问题。

4、Logstash

  • ES的Logstash数据同步管道:Logstash 事件处理管道有三个阶段:输入过滤器输出

下载地址:https://www.elastic.co/guide/en/logstash/7.17/installing-logstash.html
inputs 模块负责收集数据,filters 模块可以对收集到的数据进行格式化、过滤、简单的数据处理,outputs 模块负责将数据同步到目的地,Logstash的处理流程,就像管道一样,数据从管道的一端,流向另外一端。

inputs 和 outputs 支持编解码器,使您能够在数据进入或离开管道时对数据进行编码或解码,而无需使用单独的过滤器。
在这里插入图片描述
启动Logstash,添加一个conf配置文件,便可完成同步任务。

 C:\Windows\system32> cd C:\logstash-7.17.23\
 C:\logstash-7.17.23> .\bin\logstash.bat -f .\config\syslog.conf

syslog.conf:数据同步的配置文件。

举个例子:

输入事件:

input {
  jdbc {
    jdbc_driver_library => "mysql-connector-java-5.1.36-bin.jar"  //数据库驱动
    jdbc_driver_class => "com.mysql.jdbc.Driver"                 //连接数据库
    jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
    jdbc_user => "mysql"
     jdbc_password => "mysql"
     statement => "SELECT * from songs where artist = :favorite_artist"  //执行sql语句
    parameters => { "favorite_artist" => "Beethoven" }   //预编译  
    schedule => "* * * * *"    //corn表达式,多久进行同步
  }
}

:sql_last_value 可以设置每次查询结果中updatetime为最后的时间,作为下次增量同步的开始时间(需要对时间进行排序才能保证最后一条数据为时间最大的)。

input {
  jdbc {
    statement => "SELECT id, mycolumn1, mycolumn2 FROM my_table WHERE updatetime > :sql_last_value order  by updatetime desc"
    use_column_value => true
    tracking_column => "updatetime "
    # ... other configuration bits
  }
}

输出事件:

output {
stdout { codec => rubydebug }
elasticsearch {
hosts => "127.0.0,1:9200"  //写入到ES
index => "post_v1"        //ES对应的索引
document_id => "%{id)"	    //取数据库查询出的id作为ES中的唯一id
}
}

过滤事件:

filter {
mutate {
rename => {
"updatetime" =>"updateTime"    //给字段重命名
"userid"     => "userId"
"createtime" =>"createTime"
"isdelete"   =>"isDelete"
remove_field =>["thumbnm""favournum"]   //移除不需要同步到ES中的字段

更多参数,可参考官方文档进行配置:https://www.elastic.co/guide/en/logstash/7.17/output-plugins.html。

5、Canal

  • Canal

优点:实时同步,实时性非常强;
原理:数据库每次修改时,会修改 binlog 文件,只要监听该文件的修改,就能第一时间得到消息并处理;
canal: 帮你监听 binlog,并解析 binlog 为你可以理解的内容,它伪装成了 mysql 的从节点,获取主节点给的 binlog。

在这里插入图片描述

参考文档:https://github.com/alibaba/canal/wiki/QuickStart

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

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

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

相关文章

身份证识别及信息核验 API 对接说明

身份证识别及信息核验 API 对接说明 本文将介绍一种 身份证识别及信息核验 API 对接说明&#xff0c;它可以通过输入身份证图片 或 姓名和身份证号码&#xff0c;来校验姓名和身份证号的真实性和一致性。本接口用于校验姓名和身份证号的真实性和一致性&#xff0c;您可以通过输…

SOMEIP_ETS_098: SD_ClientService_subscribe_without_method_call

测试目的&#xff1a; 验证当测试器激活DUT的ETS客户端服务模式并发送OfferService消息时&#xff0c;DUT不会尝试订阅每个接收到的OfferService&#xff0c;因为测试器没有发送必要的clientServiceSubscribeEventgroup消息。 描述 本测试用例旨在确保DUT在没有收到clientSe…

SuiNS的成就与未来愿景

是Sui上领先的域名服务&#xff0c;通过用用户友好、易记的域名替换复杂的钱包地址&#xff0c;提升了链上交互。在过去的两年中&#xff0c;SuiNS经过了多次改进和优化&#xff0c;致力于创建易于理解的链上身份。 借鉴社交媒体的常见用法&#xff0c;SuiNS更进一步&#xff…

这样的接口幂等实现我认为最为优雅(防重复提交)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 这样的接口幂等实现我认为最为优雅 基于token(和网上大部分不一样)对比构思需要幂等性的场景不需…

【无人机设计与控制】用于四轴飞行器仿真和控制系统设计的参数驱动的 Simulink 模型

摘要 本文介绍了一种用于四轴飞行器仿真和控制系统设计的参数驱动Simulink模型。该模型通过参数化设置&#xff0c;允许用户对四轴飞行器的关键性能参数&#xff08;如质量、转动惯量、推力系数等&#xff09;进行调整&#xff0c;从而研究不同参数对飞行器性能的影响。通过此…

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…

论文学习:常用的遥感参数

文章目录 归一化植被指数&#xff08;NDVI&#xff09;归一化红外指数7&#xff08;NDII7&#xff09;温度植被干旱指数&#xff08;TVDI&#xff09;归一化燃烧指数&#xff08;NBR&#xff09;差分归一化燃烧指数&#xff08;dNBR&#xff09;植被覆盖率&#xff08;VFC&…

2万字长文,如何成为一个“懂”AI 的产品经理?

产品经理比起大模型产品&#xff0c;更应该关注大模型本身。 注&#xff1a;随着时间推移&#xff0c;文章中的结论可能会发生变化。 此外&#xff0c;本文面向的读者是非算法团队的产品经理&#xff0c;为了保障文章的可读性&#xff0c;可能会省略部分细节&#xff0c;同时…

值得入手的 5 大数据恢复软件,数据恢复那是又快又全!

在日常工作与生活中&#xff0c;数据丢失的情况屡见不鲜。诸如重要文件的不慎误删、电脑系统的骤然崩溃、存储设备受病毒侵袭、格式化操作的失误等&#xff0c;此类突发状况常令人猝不及防。在此情形下&#xff0c;数据恢复软件便成为挽救重要数据的关键利器。 今天&#xff0c…

GMT绘图笔记:在地图上绘制直线而不是大圆弧

问题&#xff1a;利用GMT地图上绘制两点之间的直线&#xff0c;如果跨度过大会出现大圆弧线&#xff0c;而通常在备注地图图例的时候&#xff0c;通常需要强制绘制为直线。 在GMT&#xff08;Generic Mapping Tools&#xff09;中&#xff0c;使用plot命令绘制大跨度的范围线段…

全球数字化转型的前沿指南:企业架构师的TOGAF必备手册

领先数字化转型的权威声音 作为数字化转型领域的先驱&#xff0c;The Open Group 与 AZone 联手为全球的数字化专业人才提供了一本无与伦比的参考指南。《信息架构&#xff1a;商业智能&分析与元数据管理参考模型》不仅汇集了全球最先进的数据管理与信息架构理念&#xff0…

【生日视频制作】集装箱红色货车大卡车身AE模板AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程集装箱红色货车大卡车身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】集装箱红色货车大卡车身AE模板AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 下载AE模板 安装AE软件 把AE模板导…

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言&#xff1a;快速排序的实现最重要的是找基准值&#xff0c;下面让我们来了解如何实现找基准值 基准值的注释&#xff1a;在快排的过程中&#xff0c;每一次我们要取一个元素作为枢纽值&#xff0c;以这个数字来将序列划分为两部分。 在此我们采用三数取中法&#xff0c;也…

滑动窗口——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 目录 一.滑动窗口算法原理&#xff1a; 二.无重复字符的最长子串 1.题目解析​编辑 2.算法原理 3.代码编写 三.长度最小的子数组 1.题目解析 2.算法原理 3.代码编…

小米红米系列机型 机型代码查询总目录 adb指令查询步骤

小米机型型号与代码 小米系列机型 型号众多。有时候我们在刷机或者下载固件的时候对一些 同型号分版本的机型不太注意下错固件刷机会导致系统故障。手机设备代码虽然在一般情况下用处不大&#xff0c;不过真正到你需要它的时候&#xff0c;又苦于不知道它是什么&#xff0c;以…

Acrobat Pro DC 2023 for Mac/Win:全能型PDF编辑器深度解析

Adobe Acrobat Pro DC 2023作为一款跨平台的PDF编辑器&#xff0c;无论是对于Mac还是Windows用户&#xff0c;都提供了极为全面且强大的PDF处理功能。该软件凭借其卓越的性能和丰富的特性&#xff0c;成为了全球范围内用户处理PDF文档的首选工具。 一、强大的编辑功能 Acroba…

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题&#xff0c;本文将一起从代码层去分析为什么没有建立索引&#xff1f; 开源ERP项目地址&#xff1a;…

Windows系统引入全新 Android 体验?快来尝鲜!

听说微软 Windows 11 操作系统引入全新体验 &#xff1a;实时访问 Android 设备图片。 意思就是在Android 设备上捕获了新照片或屏幕截图时&#xff0c;Windows 上立刻收到通知&#xff0c;且可以不用插数据线就能访问。 用Windows连接手机的功能其实早在Windows10就已经有的了…

【进阶篇】应届毕业生必备:机器学习面试题指南【2】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

总线概述

CPU能通过地址总线给主存、硬盘、打印机通过地址总线发送地址&#xff0c;CPU可以通过数据总线和其他的部件进行信息传输&#xff0c;地址总线和数据总线可以并行传输很多位信息&#xff0c;为什么呢&#xff1f;因为每个总线可能由很多跟信号线组成的。CPU可以通过控制总线给其…