mysql获取最好成绩对应数据的其他项_开源数据同步神器——canal

前言

如今大型的IT系统中,都会使用分布式的方式,同时会有非常多的中间件,如redis、消息队列、大数据存储等,但是实际核心的数据存储依然是存储在数据库,作为使用最广泛的数据库,如何将mysql的数据与中间件的数据进行同步,既能确保数据的一致性、及时性,也能做到代码无侵入的方式呢?如果有这样的一个需求,数据修改后,需要及时的将mysql中的数据更新到elasticsearch,我们会怎么进行实现呢?

数据同步方案选择

针对上文的需求,经过思考,初步有如下的一些方案:

  • 代码实现
  • 针对代码中进行数据库的增删改操作时,同时进行elasticsearch的增删改操作。
  • mybatis实现
  • 通过mybatis plugin进行实现,截取sql语句进行分析, 针对insert、update、delete的语句进行处理。显然,这些操作如果都是单条数据的操作,是很容易处理的。但是,实际开发中,总是会有一些批量的更新或者删除操作,这时候,就很难进行处理了。
  • Aop实现
  • 不管是通过哪种Aop方式,根据制定的规则,如规范方法名,注解等进行切面处理,但依然还是会出现无法处理批量操作数据的问题。
  • logstash
  • logstash类似的同步组件提供的文件和数据同步的功能,可以进行数据的同步,只需要简单的配置就能将mysql数据同步到elasticsearch,但是logstash的原理是每秒进行一次增量数据查询,将结果同步到elasticsearch,实时性要求特别高的,可能无法满足要求。且此方案的性能不是很好,造成资源的浪费。

代码实现:技术难度低,侵入性强,实时性高。

基于mybatis:有一定的技术难度,但是无法覆盖所有的场景

Aop实现:技术难度低,半侵入性,需要规范代码,依然无法覆盖所有的场景

logstash:技术难度低,无侵入性,无需开发,但会造成资源浪费。

那么是否有什么更好的方式进行处理吗?mysql binlog同步,实时性强,对于应用无任何侵入性,且性能更好,不会造成资源浪费,那么就有了我今天的主角——canal

canal

介绍

canal 是阿里巴巴的一个开源项目,基于java实现,整体已经在很多大型的互联网项目生产环境中使用,包括阿里、美团等都有广泛的应用,是一个非常成熟的数据库同步方案,基础的使用只需要进行简单的配置即可。

canal是通过模拟成为mysql 的slave的方式,监听mysql 的binlog日志来获取数据,binlog设置为row模式以后,不仅能获取到执行的每一个增删改的脚本,同时还能获取到修改前和修改后的数据,基于这个特性,canal就能高性能的获取到mysql数据数据的变更。

70d78ad88c168f6af331ebbca8f011bc.png

使用

canal的介绍在官网有非常详细的说明,如果想了解更多,大家可以移步官网(https://github.com/alibaba/canal)了解。我这里补充下使用中不太容易理解部分。

canal的部署主要分为server端和client端。

server端部署好以后,可以直接监听mysql binlog,因为server端是把自己模拟成了mysql slave,所以,只能接受数据,没有进行任何逻辑的处理,具体的逻辑处理,需要client端进行处理。

client端一般是需要大家进行简单的开发。https://github.com/alibaba/canal/wiki/ClientAPI 有一个简单的示例,很容易理解。

canal Adapter

为了便于大家的使用,官方做了一个独立的组件Adapter,Adapter是可以将canal server端获取的数据转换成几个常用的中间件数据源,现在支持kafka、rocketmq、hbase、elasticsearch,针对这几个中间件的支持,直接配置即可,无需开发。上文中,如果需要将mysql的数据同步到elasticsearch,直接运行 canal Adapter,修改相关的配置即可。

常见问题

  • 无法接收到数据,程序也没有报错?
  • 一定要确保mysql的binlog模式为row模式,canal原理是解析Binlog文件,并且直接中文件中获取数据的。
  • Adapter 使用无法同步数据?
  • 按照官方文档,检查配置项,如sql的大小写,字段的大小写可能都会有影响,如果还无法搞定,可以自己获取代码调试下,Adapter的代码还是比较容易看懂的。

canal Adapter elasticsearch 改造

因为有了canal和canal Adapter这个神器,同步到elasticsearch、hbase等问题都解决了,但是自己的开发的过程中发现,Adapter使用还是有些问题,因为先使用的是elasticsearch同步功能,所以对elasticsearch进行了一些改造:

elasticsearch初始化

一个全新的elasticsearch无法使用,因为没有创建elasticsearch index和mapping,增加了对应的功能。 elasticsearch配置文件mapping节点增加两个参数:

 enablefieldmap: true fieldmap: id: "text" BuildingId: "text" HouseNum: "text" Floors: "text" IdProjectInfo: "text" HouseDigitNum: "text" BuildingNum: "text" BuildingName: "text" Name: "text" projectid: "text" bIdProjectInfo: "text" cinitid: "text" pCommunityId: "text"

enablefieldmap 是否需要自动生成fieldmap,默认为false,如果需要启动的时候就生成这设置为true,并且设置 fieldmap,类似elasticsearch mapping中每个字段的类型。

esconfig bug处理

代码中获取binlog的日志处理时,必须要获取数据库名,但是当获取binlog为type query时,是无法获取 数据库名的,此处有bug,导致出现 "Outer adapter write failed" ,且未输出错误日志,修复此bug.

后续计划

  • 增加rabbit MQ的支持
  • 增加redis的支持

源码

源码地址:https://github.com/itmifen/canal

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

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

相关文章

java怎么使用floor_Java floor() 方法

floor() 方法可对一个数进行下舍入,返回给定参数最大的整数,该整数小于或等给定的参数。语法该方法有以下几种语法格式:double floor(double d)double floor(float f)参数double 或 float 的原生数据类型。返回值返回 double 类型数组&#x…

python外部库是什么_如何使用Portable Python安装外部库?

由于管理员权限,我无法在我的机器上安装Python,但我成功下载/打开了Portable Python.我在Windows 7 64位机器上.我怎样才能使用以前的外部库,比如Numpy或Gmpy?解决方法:easy_install正在尝试从源代码安装. gmpy和gmpy2是C扩展,需要兼容的C编译器和其他库(GMP;以及gm…

java创建目录时带权限_java – 无法在外部存储中创建目录,尽管权限显然设置正确...

我有在我的清单文件中,但是尝试创建一个目录时我失败了Log.d(LOG_STRING, android.os.Environment.getExternalStorageState() );java.io.File folder new java.io.File(Environment.getExternalStorageDirectory() java.io.File.separator "test");boolean succe…

window访问不到linux的activemq_springboot整合开源项目测试拦截接口访问的频率

本节目标本篇文章主要是介绍以下springboot整合开源项目,实现反爬虫接口防刷的demo,额外的介绍一下axios的基本用法;所以本篇文章阅读起来相对轻松。OK,下面开始整合.引入项目依赖cn.keking.project kk-anti-reptile …

java 数据库外键查询_oracle中查询所有外键引用到某张表的记录

其实查找这篇文章 我主要用的sql 是这句 select * from user_cons_columns t where t.constraint_name like FK_CTS_CONT_REINS__CRR;起因:系统测试的时候发现如果某条记录已经被引用了,这个时候删除这条记录会引起数据不一致,系统会报错。…

sql server限制查询条数_18. Django 2.1.7 查询集 QuerySet

上一篇Django 2.1.7 模型 - 条件查询 F对象 Q对象 聚合查询讲述了关于Django模型的介绍F对象、Q对象、聚合查询等功能。不管什么查询,返回的结果都基本是查询集QuerySet,如下:In [16]: MiddlewareInfo.objects.all()Out[16]: 1)>, 2)>,…

python文件传输socket_树莓派采用socket方式文件传输(python)

两个树莓派,在同一个局域网内,传输文件,采用socket方式。client端代码:import socketimport osimport hashlibclient socket.socket() # 生成socket,连接serverip_port ("192.168.137.210",12346) # server…

java 过滤列表_Java 8 Stream过滤列表中列表的值

我有一个看起来如下的对象class MyObject {String type;List subTypes;}是否有可能,给定一个MyObject列表,使用Java 8流来过滤类型和子类型?到目前为止我有myObjects.stream().filter(t -> t.getType().equals(someotherType).collect(Collections.toList());但在…

python实现程序重启_python实现自动重启本程序的方法

#!/usr/local/bin/python#-*- coding: UTF-8 -*-##################################################################### python 自动重启本程序#####################################################################import os,time#def close():# print "程序重启&a…

java调用 restapi 乱码_Java HttpURLConnection模拟请求Rest接口解决中文乱码问题

public staticString PostRequest(String URL,String obj) {String jsonString"";try{//创建连接URL url newURL(URL);HttpURLConnection connection(HttpURLConnection) url.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connectio…

python惰性求值的特点_C#教程之C#函数式编程中的惰性求值详解

https://www.xin3721.com/eschool/python.html惰性求值在开始介绍今天要讲的知识之前,我们想要理解严格求值策略和非严格求值策略之间的区别,这样我们才能够深有体会的明白为什么需要利用这个技术。首先需要说明的是C#语言小部分采用了非严格求值策略&am…

工厂模式java界面_java – 工厂模式动态方法

我正在努力了解工厂模式.如果有很多实现,那么我的工厂模式将会有很多如果还是开关的情况.而且每次我介绍一个新的实现,我应该更改我的工厂代码像下面的例子,如果让我们假设狗鸭正在实施宠物界面,如果许多动物实现宠物界面,我的工厂会很长时间,如果有其他的代码或开关案例,那么明…

ecs 云服务器 管理控制台_阿里云ECS服务器监控资源使用情况

阿里云Ecs服务器运维过程中,无论是Centos系统还是Windows系统,有时候我们需要监控分析最新的服务器资源利用率等运行情况,例如最近3个小时CPU使用率情况、内存使用率、网络流入带宽、网络流出带宽、服务器TCP连接数等数据状况。上述提到的这些…

python创建提示用户输入查询条件_python流程控制练习

‘’’if条件‘’’示例sex ‘female’age19is_beautifulTrueis_successfulTrueheight1.70if sex ‘female’ and age > 18 and age <20 and is_beautiful \and height > 1.6 and height < 1.8 :print(“001”)if is_successful :print(‘ok’)else:print(‘sb’)e…

svg 地图_找地图素材?有这个网站就够了!

文 | 孙宁使用地图类的素材最担心什么&#xff1f;答案是&#xff1a;地图数据的准确性&#xff01;设想&#xff0c;你辛辛苦苦找来的地图素材&#xff0c;却被人发现是一个假的地图&#xff0c;那可是要犯错误滴~今天给大家推荐一个地图网站&#xff0c;完全不用担心这个问题…

hadoop设置java环境_hadoop安装(3)_Linux配置JDK环境

hadoop分布式集群安装的过程中要先给Linux系统配置好JDK环境&#xff0c;因为hadoop是基于Java开发的。所以本文主要介绍如何在centos上安装jdk环境&#xff0c;主要步骤如下&#xff1a;1、去Oracle官网下载Linux版本的jdk&#xff0c;地址如下&#xff1a;笔者下载的是JDK1.8…

python巩固函数和模块_Python学习教程6:函数,模块和类的使用

Python函数定义函数是组织好的,可重复利用的,用来实现单一,或相关联功能的代码片段. 函数能提高应用的模块行,使代码逻辑更加的条理清晰.内建函数内建函数是Python中自带的,可供用户重复使用的一类单一功能的函数,比如我们常用的print函数,就属于内建函数.自定义函数Python中除…

compact php,php内置函数使用 compact()

这篇文章介绍的内容是关于php内置函数使用 compact() &#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下今天在使用tpshop时发现一个的php内置函数&#xff0c;叫compact()&#xff0c;该函数创建一个由参数所带变量组成的数组。…

python网格搜索核函数_(转载)Python机器学习笔记GridSearchCV(网格搜索)

转载声明介绍在机器学习模型中&#xff0c;需要人工选择的参数称为超参数。比如随机森林中决策树的个数&#xff0c;人工神经网络模型中隐藏层层数和每层的节点个数&#xff0c;正则项中常数大小等等&#xff0c;他们都需要事先指定。超参数选择不恰当&#xff0c;就会出现欠拟…

java国际规范标准,国际化 - Java Servlet 3.1 规范

Servlet 应设置响应的 locale 和字符集。使用ServletResponse.setLocale 方法设置 locale。该方法可以重复的调用&#xff1b;但响应被提交后调用该方法不会产生任何作用。如果在页面被提交之前 servlet 没有设置 locale&#xff0c;容器的默认 locale 将用来确定响应的locale&…