利用logstash从mysql同步数据到ElasticSearch
前面一篇已经把logstash和logstash-input-jdbc安装好了。
下面就说下具体怎么配置。
1.先在安装目录bin下面(一般都是在bin下面)新建两个文件jdbc.conf和jdbc.sql

2.配置jdbc.conf
 input {
       stdin {
        }
       jdbc {
         # 连接的数据库地址和哪一个数据库,指定编码格式,禁用SSL协议,设定自动重连
         jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/microstorage_backend?characterEncoding=UTF-8&useSSL=false&autoReconnect=true"
         jdbc_user => "root"
         jdbc_password => "123456"
         # 下载连接数据库的驱动包,建议使用绝对地址
        jdbc_driver_library => "/usr/local/Cellar/logstash/6.5.4/libexec/logstash-core/lib/jars/mysql-connector-java-5.1.42.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_paging_enabled => "true"
        jdbc_page_size => "50000"
        codec => plain { charset => "UTF-8"}
         #使用其它字段追踪,而不是用时间
       #use_column_value => true   //这里如果是用时间追踪比如:数据的更新时间或创建时间等和时间有关的这里一定不能是true, 切记切记切记,我是用update_time来追踪的
         #追踪的字段
      tracking_column => update_time
      record_last_run => true
      #上一个sql_last_value值的存放文件路径, 必须要在文件中指定字段的初始值  这里说是必须指定初始值,我没指定默认是1970-01-01 08:00:00
      last_run_metadata_path => "/usr/local/opt/logstash/lastrun/.logstash_jdbc_last_run"  //这里的lastrun文件夹和.logstash_jdbc_last_run是自己创建的
       jdbc_default_timezone => "Asia/Shanghai"   //设置时区
       #statement => SELECT * FROM goods  WHERE update_time > :last_sql_value  //这里要说明一下如果直接写sql语句,前面这种写法肯定不对的
27                                                 ,加上引号也试过也不对,所以我直接写在jdbc.sql文件中
       statement_filepath => "/usr/local/Cellar/logstash/6.5.4/bin/jdbc.sql"
      #是否清除 last_run_metadata_path 的记录,如果为真那么每次都相当于从头开始查询所有的数据库记录
      clean_run => false
        # 这是控制定时的,重复执行导入任务的时间间隔,第一位是分钟 不设置就是1分钟执行一次
        schedule => "* * * * *"
        type => "std"
      }
  }
  filter {
     json {
         source => "message"
         remove_field => ["message"]
     }
 }
 output {
     elasticsearch {
         # 要导入到的Elasticsearch所在的主机
         hosts => "127.0.0.1:9200"
         # 要导入到的Elasticsearch的索引的名称
         index => "goods"
         # 类型名称(类似数据库表名)
         document_type => "spu"
         # 主键名称(类似数据库主键)
         document_id => "%{id}"
     }
     stdout {
         # JSON格式输出
         codec => json_lines
     }
 }
3.配置jdbc.sql
select id,goods_name,goods_no,price,account_id,create_time,update_time from goods where update_time > :sql_last_value
4.我们来看下 .logstash_jdbc_last_run文件中的内容(网上讲述该配置的时候都没讲到里面具体的内容写法,导致很多人很迷惑,其中我就是)

前面的---具体什么意思,我也不太清楚。
5.启动jdbc.conf配置,开始同步数据

第一次:因为时间是从1970年开始的所以会全部同步一遍。相当于全量同步了

从第二次开始,会从上次最新的一次时间同步,既新增和修改都会同步

遇到的问题:
1.ES中8小时时差的问题?
解决方法:从源头解决问题
在jdbc.conf配置文件中只要是有关时间的字段都手动+8小时
 39 filter {
 40     json {
 41         source => "message"
 42         remove_field => ["message"]
 43     }
 44    // date类型不能省略,不然会报错,       就是把当前字段+8小时后赋值给新的字段,然后再取新字段的值赋值给老的字段,再把新的字段删除
 45     date {
 46       match => ["message","UNIX_MS"]
 47       target => "@timestamp"
 48        }
 49          ruby {
 50                 code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
 51          }
 52         ruby{
 53                 code => "event.set('@timestamp',event.get('timestamp'))"
 54         }
 55         mutate{
 56                remove_field => ["timestamp"]
 57         }
 58
 59    date {
 60     match => ["message","UNIX_MS"]
 61     target => "create_time"
 62          }
 63          ruby {
 64                  code => "event.set('@create_time', event.get('create_time').time.localtime + 8*60*60)"
 65          }
 66         ruby {
 67                  code => "event.set('create_time',event.get('@create_time'))"
 68          }
 69         mutate {
 70          remove_field => ["@create_time"]
 71         }
 72
 73         date {
 74         match => ["message","UNIX_MS"]
 75         target => "update_time"
 76          }
 77          ruby {
 78                  code => "event.set('@update_time', event.get('update_time').time.localtime + 8*60*60)"
 79          }
 80         ruby {
 81                  code => "event.set('update_time',event.get('@update_time'))"
 82          }
 83         mutate {
 84          remove_field => ["@update_time"]
 85         }
 86   }
总结:主要是配置,有什么问题,先检查配置文件。
利用logstash从mysql同步数据到ElasticSearch的更多相关文章
- elasticsearch -- Logstash实现mysql同步数据到elasticsearch
		配置 安装插件由于这里是从mysql同步数据到elasticsearch,所以需要安装jdbc的入插件和elasticsearch的出插件:logstash-input-jdbc.logstash-o ... 
- mysql 同步数据到 ElasticSearch 的方案
		MySQL Binlog 要通过 MySQL binlog 将 MySQL 的数据同步给 ES, 我们只能使用 row 模式的 binlog.如果使用 statement 或者 mixed forma ... 
- 使用Logstash同步数据至Elasticsearch,Spring Boot中集成Elasticsearch实现搜索
		安装logstash.同步数据至ElasticSearch 为什么使用logstash来同步,CSDN上有一篇文章简要的分析了以下几种同步工具的优缺点:https://blog.csdn.net/la ... 
- 利用TPC-H为MYSQL生成数据
		## 利用TPC-H为MYSQL生成数据 导言 这篇文章是看了joyee写的TPC-H数据导入MySQL教程以及另一篇网上的MySQL TPCH测试工具简要手册 后写的,有些内容是完全转载自以上两篇文 ... 
- 安装配置elasticsearch、安装elasticsearch-analysis-ik插件、mysql导入数据到elasticsearch、安装yii2-elasticsearch及使用
		一.安装elasticsearch 获取elasticsearch的rpm:wget https://download.elastic.co/elasticsearch/release/org/ela ... 
- 如何通过 Docker 部署 Logstash 同步 Mysql 数据库数据到 ElasticSearch
		在开发过程中,我们经常会遇到对业务数据进行模糊搜索的需求,例如电商网站对于商品的搜索,以及内容网站对于内容的关键字检索等等.对于这些高级的搜索功能,显然数据库的 Like 是不合适的,通常我们采用 E ... 
- ElasticSearch(1)---Mysql同步数据到ElSearch
		ElasticSearch同步Mysql 先讲项目需求:对于资讯模块添加搜索功能 这个搜索功能我就是采用ElasticSearch实现的,功能刚实现完,所以写这篇博客做个记录,让自己在记录下整个步骤和 ... 
- 关于MySQL导入数据到elasticsearch的小工具logstash
		logstash核心配置文件pipelines.yml #注:此处的 - 必须顶格写必须!!! - pipeline.id: invitation #下面路径配置的是你同步数据是的字段映射关系 pat ... 
- Android之网络编程利用PHP操作MySql插入数据(四)
		因为最近在更新我的项目,就想着把自己在项目中用到的一些的简单的与网络交互的方法总结一下,所以最近Android网络编程方面的博文会比较多一些,我尽量以最简单的方法给大家分享,让大家明白易懂.如果有什么 ... 
随机推荐
- Codeforce 697A - Pineapple Incident
			Ted has a pineapple. This pineapple is able to bark like a bulldog! At time t (in seconds) it barks ... 
- How to solve the problem that BMW Icom A2 A3 host can’t be connected?
			Aftre the BMW ICOM host is connected to the car via a 16PIN connector, and the other side is connect ... 
- 在html中引入css、js和jQuery的方法
			在html中引入css代码 在html中插入CSS样式表的方法有三种: 1.外部样式表(External style sheet):即所有的样式单独写在一个.css文件中,在html文件的head部分 ... 
- 同级div设置display:inline-block,父级div强制不换行
			同级div设置display:inline-block,父级div强制不换行 <html> <head></head> <body> <div i ... 
- 2、pandas的value_counts()和describe()
			一.value_counts pandas 的value_counts()函数可以对Series里面的每个值进行计数并且排序. value_counts是计数,统计所有非零元素的个数,默认以降序的方式 ... 
- bzoj 4810 由乃的玉米田 - bitset - 莫队算法
			由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题 这个题是这样的: 给你一个序列a,长度为n,有m ... 
- eval()、exec()与execfile()
			eval(expression[, globals[, locals]]) eval()函数执行一个python表达式字符串并返回表达式执行后的结果: >>> x = 1 >& ... 
- CEF 添加F5刷新快捷键
			Keyboardcodes:https://www.androidos.net.cn/android/4.3_r1/xref/external/webkit/Source/WebCore/platfo ... 
- maven项目出现红色感叹号报错
			背景 在eclipse部署maven项目的时候,项目出现红色的感叹号导致项目无法启动. 解决步骤 1.右键项目——>Maven——>Update Project ,弹出下框: 点击OK. ... 
- 如何查看linux程序被何种版本的编译器编译的?
			答: 使用vi工具之间搜索关键字"GCC"即可找出编译该程序的编译器版本号! 
