[elasticsearch同步数据库]Mysql数据同步Elasticsearch方案总结

  【推荐阅读】微服务还能火多久?>>>

  要通过elasticsearch实现数据检索,首先要将数据导入elasticsearch,并实现数据源与elasticsearch数据同步.这里使用的数据源是Mysql数据库.目前mysql与elasticsearch常用的同步机制大多是基于插件实现的,常用的插件包括:logstash-input-jdbc,go-mysql-elasticsearch, elasticsearch-jdbc。

  logstash官方插件,集成在logstash中,下载logstash即可,通过配置文件实现mysql与elasticsearch数据同步

  优点

  能实现mysql数据全量和增量的数据同步,且能实现定时同步.

  版本更新迭代快,相对稳定.

  作为ES固有插件logstash一部分,易用

  缺点

  不能实现同步删除操作,MySQL数据删除后Elasticsearch中数据仍存在.

  同步最短时间差为一分钟,一分钟数据同步一次,无法做到实时同步.

  go-mysql-elasticsearch 是国内作者开发的一款插件

扫描二维码关注公众号,回复: 11082172 查看本文章

  优点

  能实现mysql数据增加,删除,修改操作的实时数据同步

  缺点

  无法实现数据全量同步Elasticsearch

  仍处理开发、相对不稳定阶段

  目前最新的版本是2.3.4,支持的ElasticSearch的版本为2.3.4, 未实践

  优点

  能实现mysql数据全量和增量的数据同步.

  缺点

  目前最新的版本是2.3.4,支持的ElasticSearch的版本为2.3.4

  不能实现同步删除操作,MySQL数据删除后Elasticsearch中数据仍存在.

  logstash5.x之后,集成了logstash-input-jdbc插件。安装logstash后通过命令安装logstash-input-jdbc插件

  在logstash-6.4.2/config文件夹下新建jdbc.conf,配置内容如下

  在logstash-6.4.2/config 目录下新建jdbc.sql文件

  --config.reload.automatic: 会自动重新加载配置文件内容

  在kibana中创建索引后查看同步数据

  go-mysql-elasticsearch通过mysql中binlog日志实现数据增加,删除,修改同步elasticsearch

  mysql的binlog日志主要用于数据库的主从复制与数据恢复。binlog中记录了数据的增删改查操作,主从复制过程中,主库向从库同步binlog日志,从库对binlog日志中的事件进行重放,从而实现主从同步。

  mysql binlog日志有三种模式,分别为:

  要通过mysql binlog将数据同步到ES集群,只能使用ROW模式,因为只有ROW模式才能知道mysql中的数据的修改内容。

  以UPDATE操作为例,ROW模式的binlog日志内容示例如下:

  STATEMENT模式下binlog日志内容示例为:

  从ROW模式和STATEMENT模式下UPDATE操作的日志内容可以看出,ROW模式完整地记录了要修改的某行数据更新前的所有字段的值以及更改后所有字段的值,而STATEMENT模式只单单记录了UPDATE操作的SQL语句。我们要将mysql的数据实时同步到ES, 只能选择ROW模式的binlog, 获取并解析binlog日志的数据内容,执行ES document api,将数据同步到ES集群中。

  查看,修改binlog模式

  go/src/github.com/siddontang/go-mysql-elasticsearch/etc/river.toml

  NiFi之前是在美国国家安全局(NSA)开发和使用了8年的一个可视化、可定制的数据集成产品。2014年NSA将其贡献给了Apache开源社区,2015年7月成功成为Apache顶级项目。

  Apache NiFi 是一个易于使用、功能强大而且可靠的数据处理和分发系统。Apache NiFi 是为数据流设计,它支持高度可配置的指示图的数据路由、转换和系统中介逻辑,支持从多种数据源动态拉取数据。简单地说,NiFi是为自动化系统之间的数据流而生。 这里的数据流表示系统之间的自动化和受管理的信息流。 基于WEB图形界面,通过拖拽、连接、配置完成基于流程的编程,实现数据采集、处理等功能。

  Apache NiFi 基于 java 开发,要求运行环境为 JDK 8.0 以上。

  Apache NiFi 下载地址:http://nifi.apache.org/download.html

  常用配置在 conf 目录下的 nifi.properties 和 bootstrap.conf 文件中,详见:NiFi System Administrator's Guide

  web 控制台端口在 nifi.proerties 文件中的 参数修改,默认值

  命令行进入 Apache NiFi 目录,运行命令

  Apache NiFi 的常用命令:

  命令

  说明

  run

  交互式启动

  start

  后台启动

  stop

  停止

  status

  查看服务状态

  访问 http://localhost:8080/nifi

  数字图书馆有一套基于 MySQL 的电子书管理系统,电子书的基本信息保存在数据库表中,书的数字内容以多种常见的文档格式(PDF、Word、PPT、RTF、TXT、CHM、EPUB等)保存在存储系统中。现在需要利用 ElasticSearch 实现一套全文检索系统,以便用户可以通过对电子书的基本信息和数字内容进行模糊查询,快速找到相关书籍。

  字段

  意义

  id

  主键

  title

  书名

  desc

  介绍

  path

  存储路径

  create_time

  创建时间

  update_time

  更新时间

  逻辑约束:创建书籍记录时,create_time 等于 update_time,即当前时间,每次更新书籍时,更新 update_time 时间。全文检索系统根据 update_time 时间更新书籍索引。

  

  基本思路:

  定期扫描 MySQL 中的 book 表,根据字段 update_time 批量抓取最新的电子书数据。

  从 path 字段获取电子书数字内容的文档存储路径。从存储系统中抓取电子书文档并进行 BASE64编码。

  将从 book 表批量抓取的数据转换为 JSON 文档,并将 BASE64编码后的电子书文档合并入 JSON,一同写入 ElasticSearch,利用 ElasticSearch 的插件 Ingest Attachment Processor Plugin 对电子书文档进行文本抽取,并进行持久化,建立全文索引。

  ElasticSearch只能处理文本,不能直接处理二进制文档。要利用 ElasticSearch 实现附件文档的全文检索需要 2 个步骤:

  对多种主流格式的文档进行文本抽取。

  将抽取出来的文本内容导入 ElasticSearch ,利用 ElasticSearch强大的分词和全文索引能力。

  Ingest Attachment Processor Plugin 是一个开箱即用的插件,使用它可以帮助 ElasticSearch 自动完成这 2 个步骤。

  基本原理是利用 ElasticSearch 的 Ingest Node 功能,此功能支持定义命名处理器管道 pipeline,pipeline中可以定义多个处理器,在数据插入 ElasticSearch 之前进行预处理。而 Ingest Attachment Processor Plugin 提供了关键的预处理器 attachment,支持自动对入库文档的指定字段作为文档文件进行文本抽取,并将抽取后得到的文本内容和相关元数据加入原始入库文档。

  因为 ElasticSearch 是基于 JSON 格式的文档数据库,所以附件文档在插入 ElasticSearch 之前必须进行 Base64 编码。

  当然,Attachment Processor Plugin 不是唯一方案。如果需要深入定制文档抽取功能,或基于功能解耦等考量,完全可以利用 Apache Tika http://tika.apache.org 实现独立的文档抽取应用。

  以上,我们建立了 一个 pipeline 命名 attachment,其中定义了 2 个预处理器 "attachment" 和 "remove" ,它们按定义顺序对入库数据进行预处理。

  "attachment" 预处理器即上文安装的插件 "Ingest Attachment Processor Plugin" 提供,将入库文档字段 "data" 视为文档附件进行文本抽取。要求入库文档必须将文档附件进行 BASE64编码写入 "data" 字段。

  文本抽取后, 后续不再需要保留 BASE64 编码的文档附件,将其持久化到 ElasticSearch 中没有意义,"remove" 预处理器用于将其从源文档中删除。

  ElasticSearch 是文档型数据库,以 JSON 文档为处理对象。文档结构以 mapping 形式定义,相当于关系型数据库建立表结构。以下,我们建立 MySQL 的 book 表在 ElasticSearch 中的文档结构映射。

  除了 book 表中的原有字段外,我们在 ElasticSearch 中增加了 "attachment" 字段,这个字段是 "attachment" 命名 pipeline 抽取文档附件中文本后自动附加的字段。这是一个嵌套字段,其包含多个子字段,包括抽取文本 content 和一些文档信息元数据。

  在本文的应用场景中,我们需要对 book 的 title、desc 和 attachment.content 进行全文检索,所以在建立 mapping 时,我们为这 3 个字段指定分析器 "analyzer" 为 "ik_max_word",以让 ElasticSearch 在建立全文索引时对它们进行中文分词。

  Apache NiFi 支持将配置好的流程保存为模板,鼓励社区开发者之间分享模板。本文及使用的流程模板在开源项目:

  https://gitee.com/streamone/full-text-search-in-action

  模板文件在 /nifi/FullText-mysql.xml

  下载模板文件 FullText-mysql.xml ,然后点击控制台左侧 "Operate" 操作栏里的 "Upload Template" 上传模板。

  

  拖拽控制台顶部一排组件图标中的 "Template" 到空白网格区域,在弹出的 "Add Template" 窗口中选择刚刚上传的模板 "FullText-mysql",点击 "Add"。空白网格区域将出现如下下图的 "process group",它是一组 "processor" 的集合,我们的处理流程就是由这组 "processor" 按照数据处理逻辑有序组合而成。

  NiFi模板

  双击此 "process group" 进入,将看到完整的流程配置,如下图:

  NiFi process group

  运行这个流程之前需要完成几个配置项:

  配置并启动数据库连接池

  在空白网格处点击鼠标右键,在弹出菜单中点击 "configure",在弹出的 "FullText-mysql Configuration" 窗口中打开 "controller services" 标签页如下图,点击表格中 "DBCPConnectionPool" 右侧 "Configure" 图标,进行数据库连接池配置。 NiFi controller services

  在弹出的 "Configure Controller Service" 窗口中打开 "PROPERTIES" 标签页,在表格中填写 MySQL数据库相关信息,如下图: 配置数据库连接池

  其中的 "Database Driver Location(s)" 填写我们下载的 "mysql-connector-java-5.1.46-bin.jar" 路径。 配置好数据库连接池以后点击 "APPLY" 回到 "controller services" 标签页,点击表格中 “DBCPConnectionPool” 右侧 “Enable” 图标启动数据库连接池。

  修改变量

  在空白网格处点击鼠标右键,在弹出菜单中点击 "variables",打开 "Variables" 窗口,修改表格中的 "elasticSearchServer" 参数值为 ElasticSearch 服务地址,修改表格中的 "rootPath" 参数为电子书数字文档在文件系统中的根路径。

  回到 "process group" 流程页面,在空白网格处点击鼠标右键,在弹出菜单中点击 "start" 菜单,启动流程。

  至此,我们完成了本文应用场景中 Apache NiFi 的流程配置。Apache NiFi 每隔 10 秒扫描 MySQL 的 book 表,抓取最新的电子书数据,处理后导入 ElasticSearch。

  book表数据

  

  全文检索语句

  查询结果

  https://www.jianshu.com/p/c3faa26bc221

  https://www.jianshu.com/p/96c7858b580f

  https://my.oschina.net/streamone/blog/1825807

 数据库同步软件

猜你喜欢

转载自www.cnblogs.com/sqlserver-mysql/p/12763472.html