当前位置:首页 > ELK > 正文内容

logstash中同步mysql到elastic常见问题总结

phpmianshi2年前 (2019-07-20)ELK465

1. mysql查询字段中有 type字段

问题原因

select语句中查到了type, 但es中会默认有一个type, 这使得两个type冲突.会导致同步失败,且没有报错

GET my_index/_mapping

返回的数据中包含一个type字段如下:

"type" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
          }
      }
}

解决办法
去掉type或者改名为其它字段table_type即可, 问题解决


2.当配置了保存最后更新记录的情况下,直接删除不能重新同步

record_last_run => true
last_run_metadata_path => "/usr/local/logstash/config/run/run_last_record_id"

当配置是上面这种情况时,如果直接删掉/usr/local/logstash/config/run/run_last_record_id是无法直接重新同步的,还是需要重启下


3.logstash向es中导入mysql数据,tinyint字段导入过程中抛出mapper_parsing_exception类型异常

场景:

使用logstash向elasticsearch导入mysql数据,有一个is_top的字段,数据库类型为tinyint(1),在logstash导入过程中,报错

错误信息为:

Current token (VALUE_FALSE) not numeric, can not use numeric value accessors\n at 
[Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@4ad19246; line: 1, column: 355]

es中的mapping为:

{
    "is_top": {
        "type": "long"
    }
}

解决方案:

mysql的导出Jar会默认将tinyint(1)转换为boolean,0则为false,大于0则为true。
解决方法是 将tinyint(1)数据库改为tinyint(2),tinyint(2)就会默认转成数字,es的mapping用long接受即可。
 另:如果无法改动数据库字段,我查看其它帖子,说是查询时将tinyint(1)字段乘以1后,再作为结果输出


4.logstash如何测试配置文件是否改动正确

如果是想测试配置文件写的是否正确,用下面这个方式启动测试一下

/usr/share/logstash/bin/logstash -t -f /etc/logstash/conf.d/nginx.conf  #测试配置文件
Configuration OK
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/nginx_access.conf  #启动logstash


5.logstash启动参数-f的含义

启动时 -f 参数指定 .conf的配置文件,不是指定yml配置,这块 我用-f指定.yml文件,一直提示配置文件有问题,困扰了我很久


6.要测试logstash安装是否成功

请运行最基本的 Logstash 管道。

/usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'

7.logstash.yml注意事项

配置参数后面是不是加了空格(一定要空格)例如:queue.type: persisted  #放到磁盘,可以保证数据不丢失 (冒号后面需要一个空格)


8.logstash配置之自动重载配置文件

为了可以自动检测配置文件的变动和自动重新加载配置文件,需要在启动的时候使用以下命令

./bin/lagstash -f configfile.conf --config.reload.automatic

默认,检测配置文件的间隔时间是3秒,可以通过以下命令改变

--config.reload.interval <second>

9.logstash配置秒级同步

网上的很多教程都说最小间隔是1min,实际上是可以做到秒级的

schedule => "*/5 * * * * *"

只要在前面再加一个* 单位就是秒,这里就是每5s执行一次

10.时区问题,每次只能同步8小时前更新的东西

为什么 @timestamp 比我们早了 8 个小时?怎么修改成北京时间?

其实,Elasticsearch 内部,对时间类型字段,是统一采用 UTC 时间,存成 long 长整形数据的!对日志统一采用 UTC 时间存储,是国际安全/运维界的一个通识

对于页面查看,ELK 的解决方案是在 Kibana 上,读取浏览器的当前时区,然后在页面上转换时间内容的显示

所以,建议大家接受这种设定。否则,即便你用 .getLocalTime 修改,也还要面临在 Kibana 上反过去修改,以及 Elasticsearch 原有的 ["now-1h" TO "now"] 这种方便的搜索语句无法正常使用的尴尬。


存储UTC时区也没什么问题,但是我们的问题是,同步数据只能同步到8小时前的,也就是最新修改的没法同步

咱们的input jdbc同步部分配置如下:

tracking_column => update_time
tracking_column_type => "timestamp"
record_last_run => true
last_run_metadata_path => "/usr/local/logstash/config/igp/run/live_v4_run"

查看  /usr/local/logstash/config/igp/run/live_v4_run 发现最后更新时间都是 UTC格式: --- 2021-02-24 10:46:56.000000000 Z


解决方案,我们只需要给插件设置利用本地时区就好了,新增配置

plugin_timezone => "local"

重新同步,再次查看  /usr/local/logstash/config/igp/run/live_v4_run 显示当前时区:--- 2021-02-25 11:37:42.000000000 +08:00

版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

elasticsearch7.X Mapping常见字段类型整理

一、核心数据类型字符串:text, keyword数值型:long, integer, short, byte, double, float...

elasticsearch中mapping全解实战

Mapping简介#mapping 是用来定义文档及其字段的存储方式、索引方式的手段,例如利用mapping 来定义以下内容:哪些字段需要被定义为全文检索类型哪些字段包含number、dat...

elasticsearch中如何分析慢查询

elasticsearch中如何分析慢查询

背景首先,Elasticsearch中有两个版本的慢速日志:索引慢速日志(index slow logs )和搜索慢速日志( search slow logs)。 由于我们试图解决的问题涉及慢查询...

ELK的安装与配置

Elasticsearch 安装安装 JDK这里选择 openjdk$ yum install java-11-openjdk-devel获取 elasticsearch ...

block b-tree.jpg

elasticsearch中字符串类型text vs keyword的选择

关于ES字符串类型的选择ElasticSearch 5.0以后,string类型有重大变更,移除了string类型,string字段被拆分成两种新的数据类型: text用于全文搜索的,而ke...

elasticsearch中store设置true和false的区别

概念设置索引的时候,我们给某些字段的store属性设置为true,在查询时,请求中可以携带stored_fields参数,指定某些字段,最后,这些字段会被包含在返回的结果中。如果请求中携带的字段没有被...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。