mysql数据同步到elasticsearch数据解决方案

news2024/12/23 22:08:57

mysql数据同步到elasticsearch数据解决方案

问题场景

1.分库分表后多关联或者多条件查找效率低下,例如2b场景的查询,导出等需要多条件查询,继续用分库分表话效率低下。

2.数据量太多需要转移非关系型数据库elasticsearch存储

3.其他数据转移场景等

这两种场景都涉及到mysql数据同步到es数据解决方案,解决起来分总体两步走,一是存量数据的同步,二是增量数据的同步。这里利用的是canal的方案去同步数据,方案如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B4O20Nep-1670764868135)(C:\Users\煎饼果子\AppData\Roaming\Typora\typora-user-images\image-20221211172233164.png)]

这个是不停机的方案,首先同时开启存量的数据的导入和增量数据的监听,待存量数据导入完成,开启java服务消费mq消息,对数据进行更新或者插入,若数据存在则进行更新,若数据不存在,是新插入则插入,是更新则保存到定时任务重试。这里只是理想方案,实际过程中和存量数据的大小,数据的增长率等有关系,具体实施肯定较为复杂。

若要执行停机方案,则比较简单,数据不再更新后,将存量数据插入到es后,再开启增量数据监听服务以及消费服务,这样es就能实时同步数据了,下面实践下canal adapter的mysql存量数据导入elasticsearch中。

增量数据导入elasticsearch

实践版本:

elasticsearch &kibana:7.12.1

canal.client-adapter:1.1.7-SNAPSHOT

mysql :8.0 主从

以这个分表的数据为例

CREATE TABLE `pay_parent_1` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `user_id` int NOT NULL,
  `status` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL,
  `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  `tenant_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '租户id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1571152425171070978 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

在kibana中建立索引

PUT /pay_parent_0

  {
    "mappings":{
        "properties":{
          "id": {
            "type": "long"
          },
          "user_id": {
            "type": "long"
          },
          "status": {
            "type": "text"
          },
          "creator": {
            "type": "text"
          },
          "create_time": {
            "type": "date",
            "formats" : ["yyyy-MM-dd HH:mm:ss"],
        "timezone" : "Asia/Shanghai"
          },
          "updater": {
            "type": "text"
          },
          "update_time": {
            "type": "date",
            "formats" : ["yyyy-MM-dd HH:mm:ss"],
            "timezone" : "Asia/Shanghai"
          },
          "deleted": {
            "type": "long"
          },
          "tenant_id": {
            "type": "text"
          }
      }
    }
  }

client-adapter 配置 表和es索引的映射

dataSourceKey: defaultDS #数据源
destination: pay_parent_0 #也可以从监听的数据源取数据 mq或者canal
outerAdapterKey: es #对应的适配器的key
groupId: g1 #对应适配器的分组
esMapping:
  index: pay_parent_0 #es索引名称
  id: id #数据库主键对应es文档id 插入数据时一定要填写
  #  upsert: true  #是否更新 以主键id作为更新条件
  sql: "select id, user_id, status, creator, create_time, updater, update_time, deleted, tenant_id
        from pay_parent_0 as a"
  etlCondition: "where a.id={}"   # etl 的条件参数 接口请求
  commitBatch: 3000  # 提交批大小

下载canal源码,启动lanucher 模块,client-adapter 启动配置

  srcDataSources:
    defaultDS:
      url: jdbc:mysql://xxx:3306/demo0?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT
      username: root
      password: xxx
  canalAdapters:
  - instance: canal.test.queue # canal instance Name or mq topic name
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: es7
        key: es
        hosts: http://xxx:39200  # 127.0.0.1:9200 for rest mode
        properties:
          mode: rest # or rest
          cluster.name: elasticsearch

启动后执行,先测试第一条数据插入

http://127.0.0.1:8081/etl/es7/es/payParent0.yml?params=1571052632021184514

插入后查看kibana,以创建时间搜索,如图所示,值得注意的是elasti存储时默认将时间转化为UTC时间存储,即0时区,内部默认是个长整型。所以这里的date格式的时间都时零时区的,但是搜索的时候kibana会进行时区转换。搜出来的结果是准确的。

另外,重复请求时,指定了id插入的数据会覆盖原来的数据,这个是es内部api的功能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMCarsm3-1670764868137)(C:\Users\煎饼果子\AppData\Roaming\Typora\typora-user-images\image-20221211205348844.png)]

简单测试完后,测试下10w的数据插入,这里只需要把请求中的参数去掉就行,执行http://127.0.0.1:8081/etl/es7/es/payParent0.yml

可以看到性能还是不错,10w的数据准确无误的插入,花了41ms,外网和硬件条件一般的情况,内网的花更快。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aIYF7y5c-1670764868138)(C:\Users\煎饼果子\AppData\Roaming\Typora\typora-user-images\image-20221211211008920.png)]

总结

利用canal adpter的es插件可以实现mysql 同步的数据的功能,存量数据批量更新或者批量插入,非常方便。里面的源码插件的实现,配置文件分离,插入实例的实现以及mysql数据的批量插入都可以借鉴。若后续业务中有设计数据迁移到es中,参考实现是非常有帮助的。

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

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

相关文章

AI 实战篇 |基于 AI开放平台实现 【植物识别】 功能,成为行走的百科全书

🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 &…

代码随想录刷题记录day40 爬楼梯+零钱兑换+完全平方数·

代码随想录刷题记录day40 爬楼梯零钱兑换完全平方数 参考:代码随想录 70. 爬楼梯 思想 当作完全背包问题,物品是1,2,可以无限次取用,背包的容量是n 1.dp[j]表示容量为j的背包,装满有dp[j]次 2.dp[j]dp…

【图像处理】opencv | 图像的二值化操作| cv2.threshold() | cv2.adaptiveThreshold()

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、cv2.threshold()阈值操作函数1.1、初见1.2、阈值不同时的效果二、cv2.adaptiveThreshold()自适应阈值操作函数2.1、初见2.2、固定blocksize,改变C值大小的实…

104-127-linux-vim-shell基础

104-linux-shell: 1.shell基础 分类:linux使用Bash,可通过vi /etc/shells查看linux支持的shell类型。 1、echo [rootlocalhost ~]#echo [选项] [输出内容] 选项:-e:支持反斜线控制的字符转换(具体百度吧)-n:取消输出后行末的换行符号&…

Python实现ALO蚁狮优化算法优化支持向量机分类模型(SVC算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁狮优化(Ant Lion Optimizer,ALO)算法是Mirjalili于2015提出的一种新型元启发式群智能算法…

185.基于Django的富文本编辑器安装与使用

1.DjangoUeditor 1.1 概述 富文本编辑器,在web开发中必不可少,但是django没有自带富文本编辑器,因此我们需要使用第三方库,这里使用DjangoUeditor DjangoUditor是百度开源的在线HTML编辑器,功能非常强大,像…

VUEElement简单介绍。

目录 一、VUE 1、基本介绍 2、Vue 指令 3、生命周期 二、Element 1、基本介绍 2、Element 布局 一、VUE 1、基本介绍 ▶ 概述 Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写。 我们之前也学习过后端的框架 Mybatis ,My…

Linux下C/C++实现类似netstat命令(列出TCP和UDP连接)

网络连接一般包括最基本的五元组信息(源地址、目标地址、源端口、目标端口、协议号)再加上所属进程信息pid, exe, cmdline等。其中这两项数据大多可直接读取linux /proc目录下的网络状态连接文件/proc/net/tcp、/proc/net/udp), 进程状态目录(/proc/pid/xx)。 Linux 下的/proc…

Java基于JSP的报刊订阅管理系统

随着人类的发展,人们对信息的获取方式也越来越多,虽然很多时候人们习惯了通过手机来获取各类信息,但是手机也逐渐的成为了危害人类健康的杀手之一,为了能够让大家回归到健康的生活中来,我开发了本系统,旨在…

基于jsp+mysql+ssm医药进销存管理系统-计算机毕业设计

项目介绍 为了减少传统医药进销存管理的繁杂的工作量,提高医药进销存管理的效率而设计开发了此系统。本系统综合各方面的需求决定采用B/S架构,并利用clipse搭建java开发平台。从而共同完成整个医药的设计开发。系统实现的功能主要包括:用户在…

java 通过InetAddress获取ip 计算机名称操作

本文属于java网络编程部分 需要你的网络编程三要素 有所了解 如果您尚未了解 可以先查看我的文章 java网络编程三要素 而 为了更好的获取和使用IP地址 java提供了InetAddress类 来到文档 首先 他在 java的net包下 所以 想用它 是需要导包的 根据文档叙述 InetAddress就是一个…

python数据分析及可视化(十七)聚宽(双均线分析、因子选股策略、多因子选股策略、均值回归理论、布林带策略、PEG策略、权重收益策略)

聚宽 聚宽是一个做金融量化的网站,https://www.joinquant.com,登录注册,如果你写的文章、策略被别人采纳,增加积分,积分用于免费的回测时长。在我的策略,进入策略列表,里面有做好的策略模板可以…

Web前端105天-day40-GIT

git--版本控制系统(VCS) 目录 前言 一、版本控制系统(VCS) 二、Git中的常用概念 三、Git中的常用命令 四、分支 五、远程仓库(代码托管平台) 总结 前言 day40学习开始 一、版本控制系统(VCS) 用于项目中文件的存储、共享、历史回退、合并、代码追踪文件历史常用版本控制…

acwing基础课——spfa

由数据范围反推算法复杂度以及算法内容 - AcWing 常用代码模板3——搜索与图论 - AcWing 基本思想: 一般单源最短路我们都可以用spfa算法来做,如果过不了再尝试其他算法。 spfa算法就是在bellman-ford算法的基础上就行优化,bellman-算法是每…

微信小程序|小程序事件

首先,我们在index.wxml中与index.js中添加如下代码: <button bindtap="alert">bindtap</button>Page({data: {},alert: function (event) {wx.showToast({title: 触发成功, // 标题icon: success, // 图标类型,默认successduration: 1500 // 提示窗停…

贪吃蛇复现-CoCube

需要完成下面所提及博文中里面所有前序案例&#xff1a; 从开环到闭环的旅程-CoCube 在完成如上代码之后&#xff0c;添加一个彩蛋&#xff0c;贪吃蛇的案例。 蓝桥ROS之半自动贪吃龟turtlesim版 基本上就是上述代码复现一下&#xff0c;完全没有难度的。 贪吃蛇复现-CoCubep…

程序员最关心的问题,我都帮你们问AI了

前言 最近几天互联网刮起了一阵ChatGPT风&#xff0c;起因是OpenAI发布了一个全新的聊天机器人模型—— ChatGPT&#xff0c;可以像人类交谈般回答大部分问题甚至还能直接帮你写代码。 我们先来试试让它帮我们写个代码&#xff1a; 有一丝丝的恐惧&#xff0c;害怕过两年就会失…

redis—主从,哨兵,集群

redis常见的使用方式 Redis的几种常见使用方式包括: Redis单副本;Redis多副本(主从) ;Redis Sentinel (哨兵) ;Redis Cluster;Redis自研。 使用场景: 如果数据量很少&#xff0c;主要是承载高并发高性能的场景&#xff0c;比如缓存一般就几个G的话&#xff0c; 单机足够了。…

Qt扫盲-QPushButton 理论总结

QPushButton 理论总结一、简述二、常用要点1. 快捷键相关2. 信号相关3. 默认按钮3. 推荐使用4. 重复功能5. 菜单功能一、简述 PushButton 按钮或CommandButton 按钮应该是图形用户界面中最常用的小部件。按下&#xff08;单击&#xff09;一个按钮就可以命令计算机执行某些操作…

【1691. 堆叠长方体的最大高度】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你 n 个长方体 cuboids &#xff0c;其中第 i 个长方体的长宽高表示为 cuboids[i] [widthi, lengthi, heighti]&#xff08;下标从 0 开始&#xff09;。请你从 cuboids 选出一个 子集 &#xff0c…