mysql-elasticsearch数据同步方案

es数据同步方案

  • 前言
    • 方案对比
  • logstash方式
    • 安装
    • 配置
    • 启动
    • 测试
  • canal方式
  • MQ方式

前言

上两篇文章介绍过EL的安装和使用,接下来,我们面临的问题是怎么把数据同步到es里,比如,商城的商品数据,商品需要搜索,所以在添加商品的同时,除了往数据库添加一份,同时还要把这些数据同步到es里才行。

方案对比

解决方案,目前比较流行的可分为以下几种:

1. 程序同步
直接在代码里写逻辑,数据在增删改查进数据库的同时,也往es里同步一份。
优点:方便,无需集成其他的技术;
缺点:代码耦合性太高,增加接口的处理时间;
2. logstash
定时查询数据库,查询到数据有变化就发送到es中。
优点:解耦,官方推荐。
缺点:
1、不支持同步删除,当然可以在数据库用逻辑删除代替物理删除,对于logstash来说就是更新操作了;
2、大数据量有性能问题,在对数据库的压力上,logstash的原理是定时扫描变动的表,所以对数据库有一定压力,并且如果有其他程序在进行某条语句更新,锁住了这条行数据,那logstash读取数据时,就会被“卡住”,如果这个时间过长,可能会影响服务器卡死。
3、无法做到实时同,只能秒级同步。

如果实时性要求不高,并且定时时间内数据变化量不大,推荐使用这个,学习维护成本比较低,毕竟是官方推荐,ELK全家桶。
3. canal
利用数据库的binlog同步变化数据,然后将数据发送给es,当然也可以通过java代码监听拿到数据,再发送到es或做其他处理。
优点:解耦,实时同步,没有大数据性能压力。
缺点:学习和维护成本高,要求对数据库有创建用户的权限,毕竟要用到数据库同步功能,开启binlog数据库的压力也会增加。
4. MQ中间件
有数据变化的时候,就通知mq,然后监听mq实现数据同步到mq。
优点:解耦,适合高并发。
缺点:如何保证消息可靠性,需要在业务代码中加入发送消息到MQ的代码。

logstash方式

演示同步mysql数据到es。

安装

官网下载
在这里插入图片描述
下载之后解压即可。

配置

本文安装的版本是logstash-7.12.1,准备测试的数据库表结构
在这里插入图片描述

  • 创建自己的专属 配置
    进入解压好的文件夹logstash-7.12.1,创建自定义配置文件夹,用来存放配置文件。
mkdir mysqlnote

创建核心配置文件,名字自定义,主要用来配置mysql和logstash的数据映射和数据转换等等信息。

touch logstash-sync.conf

配置详情

input {jdbc {# 设置 MySql/MariaDB 数据库url以及数据库名称jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&allowMultiQuerie=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"# 用户名和密码jdbc_user => "root"jdbc_password => "root"# 数据库驱动mysql-connector-java-8.0.19.jar所在位置,可以是绝对路径或者相对路径jdbc_driver_library => "/usr/local/logstash/logstash-7.12.1/mysqlnote/mysql-connector-java-8.0.27.jar"# 驱动类名jdbc_driver_class => "com.mysql.cj.jdbc.Driver"# 是否开启分页,ture为开启jdbc_paging_enabled => false# 分页每页数量jdbc_page_size => "50"# 设置时区jdbc_default_timezone =>"Asia/Shanghai"# 执行的sql文件路径statement_filepath => "/usr/local/logstash/logstash-7.12.1/mysqlnote/mysql.sql"#使用这个可以直接写sql语句,但是复杂的语句最好是写在文件内#statement =>""# 设置定时任务间隔  含义:分、时、天、月、年,全部为*默认含义为每分钟跑一次任务schedule => "*/5 * * * * *"#是否需要记录某个字段值,如果为true,我们可以自定义要记录的数据库某个字段值,例如id或date字段。如果为false,记录的是上次执行的标记,默认是一个timestampuse_column_value => true#记录上次执行字段值路径。我们可以在sql语句中这么写:WHERE ID > :last_sql_value。其中 :sql_last_value 取得就是该文件中的值,这个last_time会以文件形式存在last_run_metadata_path => "/usr/local/logstash/logstash-7.12.1/mysqlnote/last_time"#如果use_column_value为真,需配置此参数. 指定增量更新的字段名。当然该字段必须是递增的,比如id或date字段。tracking_column => "updateTime"# tracking_column 对应字段的类型,只能选择timestamp或者numeric(数字类型),默认numeric。tracking_column_type => "timestamp"#如果为true,每次会记录所更新的字段的值,并保存到 last_run_metadata_path 指定的文件中record_last_run => true# 是否清除 last_run_metadata_path 的记录,true则每次都从头开始查询所有的数据库记录clean_run => false# 是否将字段名称转小写。默认是true。这里注意Elasticsearch是区分大小写的lowercase_column_names => false} 
}
output {elasticsearch {# es地址 集群数组hosts => ["127.0.0.1:9200","127.0.0.1:9201"]     hosts => ["127.0.0.1:9200"] # 同步的索引名必须要有@timestamp  不然yyyyMM不起效index => "user"# 设置_docID和数据相同document_id => "%{id}"#自定的模板名称#template_name => "ps_seal_log"#自定义的模板配置文件#template => "/usr/local/logstash/logstash-7.12.1/mysqlnote/ps_test_log_template.json"#是否重写模板#template_overwrite => true }# 日志输出形式设置stdout {codec => json_lines#codec => rubydebug}
}

注意:output 中的映射模板注释掉了,原因是找了一圈不知道怎么写这个文件,网上的案例也是众说纷纭,所以,最好是直接用kibana直接先定义好,例如下边:

PUT /user
{"mappings": {"properties": {"id": {"type": "keyword"},"userName": {"type": "text","analyzer": "ik_max_word"},"age": {"type": "integer","index" : false},"sex": {"type": "integer"},"address": {"type": "text"},"price": {"type": "double","index" : false},"createTime": {"type": "date","index" : false},"updateTime": {"type": "date","index" : false},"status": {"type": "keyword"}}}
}

这个配置满足一般的需求了,如果有更多的需求,此配置无法满足,可以使用logstash的过滤配置,input和output中间还有一个filter配置,可以用来过滤和转换数据,有需求的可以自行研究,这里因为暂时没需要,就没有去研究了。

  • 准备资源

接下来,准备上边配置所需要的东西,本次配置需要下边的文件和jar包。
在这里插入图片描述
创建时间记录文件,文件内容会在logstash启动连上数据库之后自动创建。

touch last_time

创建sql文件,查询出你要映射到es中的数据,我这里演示最简单的查询全部

vim mysql.sql

文件内容


select id,user_name as userName,age,sex,address,price,create_time as createTime,update_time as updateTime,status
from user
where update_time > :sql_last_value;

这个sql_last_value就是上边last_time文件中记录的值。

下载数据库驱动jar包。
官网地址
注意,5版本和8版本设置驱动类名(jdbc_driver_class)是有区别的:
5版本:com.mysql.jdbc.Driver。
8版本:com.mysql.cj.jdbc.Driver。

启动

进入logstash文件夹

./bin/logstash -f ./mysqlnote/logstash-sync.conf

测试

往数据库里添加数据,每5秒之后logstash就会查询数据库,增加添加数据到es中。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
由此可见,因为同步数据是依赖查询mysql,所以logstash不支持同步删除操作,当然,就像我开头说的,可以设置逻辑删除字段status,以更新代替删除。
如果实在不想用逻辑删除,可以用下边两种方式。

  • 其他
    多表同步或者海量数据初同步方法,请参考这篇文章的后半部分

canal方式

canal分为三个组件构成,deployer服务端,adapter客户端、admin web管理端,有集群高可用的一套解决方案,官方文档也比较详细,大项目推荐使用。

canal同步MySQL数据到Elasticsearch

MQ方式

MQ有很多种,此处采用kafka来实现。
利用springboot集成kafka,随后接口收到消息,直接将增删改的消息扔进kafka,在消费端处理信息,之后同步到ES即可,缺点就是需要维护一套kafka以及消息处理的逻辑代码。
kafka的安装和整合springboot,参考下方的文章即可:
Linux安装kafka
springboot集成整合kafka

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

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

相关文章

1、数据同步方案设计

数据同步要解决2个问题,1是存量数据同步,2是增是数据同步。存量同步只需要进行一次,所以又叫离线同步,或批处理同步。增量同步要解决每时每刻的数据变化同步,要运行多次,所以又叫实时同步,流处理同步。 数据准实时复制(CDC)是目前数据同步中大量使用的技术,随着国产化…

几种常见的数据同步方式

数据仓库的特性之一是集成,即首先把未经过加工处理的、不同来源的、不同形式的数据同步到ODS层,一般情况下,这些ODS层数据包括日志数据和业务DB数据。对于业务DB数据而言(比如存储在MySQL中),将数据采集并导入到数仓中(通常是Hive…

DP1.4接口的PCB布局布线要求

DP接口即为DisplayPort接口,是由视频电子标准协会发布的显示接口。DP接口将在传输视频信号的同时加入对高清音频信号传输的支持,并且同时支持更高的分辨率以及刷新率。DP1.4通信端口规范新标准基于DP1.3规范,宽度不变但加入了显示压缩流技术&…

LoadRunner(2)

一、Controller 1.1场景设计 1.通过VUG打开 施压机器:发起请求的角色(用户本地电脑) 被压机器:处理请求的角色(服务器) 2.直接双击Controller 场景设计:需要关注三个部分 第一部分: 第二部分: 2.1运行场景…

[每周一更]-(第58期):选购佳能变焦镜头 EF-S 18-200mm F/3.5-5.6 IS的心得

参考地址: https://www.canon.com.cn/purchase/onlinesale/index3.html?typejdhttps://www.canon.com.cn/overview/efwidezoom.html 讲在买之前 由于没有买全画幅,买了残幅,好处是能选的镜头有限,不用太费钱了,需要…

教程 | 10分钟掌握手帐入门技能

亲,今天你画简笔画了吗? 如果没有在画纸上画,那就一起在手帐本上一展身手吧。 我先提供一点简笔素材: 1 2 3 手帐 有人说一入手帐深似海,从此笔纸要随行。 在日本,很多人都会随身带着一个被称为“手帐”的笔…

医院如何选择HIS及电子病历系统

近来有朋友来信问我:如何选择HIS及电子病历系统?我就从我个人的经历来浅谈这个问题,我是一名医护工作者,仅供参考。 如果是新建的医院首先对自身有一个清晰的定位,包括:品牌,价值,文化,理念。我们做成为一家什么样的医院?我们的品牌路线是什么线的?我们的核心价值观是什么?…

医院信息管理云平台源码 云HIS系统源码 4级电子病历系统

基层医院云HIS系统源码 高端商业his源码 有演示,可直接项目运营。 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务,提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规…

大型EMR电子病历源码三甲医院医疗信息管理系统软件网络版

详情请点击查看 开发环境 :VS2010 C# ORACLE系统简介:1各种记录的书写,并可保留修改痕迹 在各种记录的书写过程中,根据系统提供的首次护理记录、一般护理记录、术前术后护理记录等模板,可方便、轻松地完成书写。上级…

医疗记录系统

医疗管理系统 | Dorian 项目介绍 📖 👉基于Springbootvueuni-app的医疗管理系统. 含平台主体微信小程序和web后台数据管理平台. 项目技术栈 ⭐️ 微信小程序(MedicalSystem_uniapp):uni-app Vue.js 后台管理系统(MedicalSystem_Web)&…

HIS医院EMR电子病历系统源码

1.新制作的电子病历添加到相应机构的病历模板列表中,默认是启用的,即该机构对应的一体化电子病历系统可以直接调用该模板运行相关业务。运营和管理用户可对已有的病历模板进行管理,对已有的病历模板进行查询、重新编辑、停用/启用、删除操作 …

住院管理系统

开发工具(eclipse/idea/vscode等):vs2017 数据库(sqlite/mysql/sqlserver等):sqlserver 功能模块(请用文字描述,至少200字):基于ASP.net的住院管理系统 (1)用户注册:用户首次登录该系统时需要提交用户注册。(2)用户登录:用户可以登…

医院病例管理系统

技术:Java、JSP等摘要:随着计算机技术、网络技术和通信技术的不断发展和普及,医院很多领域都运用这些先进的技术实现了数字化、信息化和网络化[1]。通过这些技术可以很大程度的提高工作效率,节省人力、物力资源,减少错…

asp医院病历管理系统

病历管理系统主要完成患者的信息输入和病历的查看等相关操作,并实现医生对患者信息的快速查看。本设计主要完成了四个方面的内容,其作用如下: 1)系统管理。在本部分,根据管理员的权限的不同,不同的管理员可…

SaaS电子病历系统源码

SaaS电子病历系统:现代医疗的新趋势 SaaS电子病历系统是一种基于云计算技术的电子病历服务平台,它将传统的病历记录存储在云端,使用者可以通过互联网随时随地访问和查询病历信息。 相比于传统的医疗信息系统,SaaS电子病历系统具…

大型三甲医院云HIS系统源码 强大的电子病历+完整文档

医院HIS系统源码云HIS系统:SaaS运维平台多医院入驻强大的电子病历完整文档 有源码,有演示 一、系统概述 采用主流成熟技术,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同&am…

智能病案管理系统

摘要 计算机网络如果结合使用信息管理系统,能够提高管理员管理的效率,改善服务质量。优秀的智能病案管理系统能够更有效管理病案业务规范,帮助管理者更加有效管理病案,可以帮助提高克服人工管理带来的错误等不利因素。所以一个优…

医院电子病历系统

一、什么是电子病历? 电子病历是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图表、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的医疗记录,是病历的一种记录形式。 医院通过电子病历以电子化方式记录患者就诊的信息&…

医院电子病历系统信息安全解决方案

引自 http://mp.weixin.qq.com/s?__bizMjM5NTYxNDUzMA&mid2650800877&idx1&sn21f1139bbc50487b7d38780c6ab4c5cf&scene23&srcid0616vhwOwxkLA0i1oLZ3u0hz#rd 一、需求分析 随着电子病历系统在医院的普遍使用,病历无纸化存储再也不是空谈概念&…

华为年终奖,小员工分百万!任正非:钱给多了,不是人才也变成了人才!

华为今年又提前发了巨额年终奖,并公布了新的奖金方案,23级奖金额有近百万,并且宣称“上不封顶、绝不拖欠”,一时间引起热议。 任正非签发的内部文件: 华为不搞按资排辈,只要做出突出贡献,在新方…