Logstash连接Mysql数据源,从mysql数据库同步到es,并设置IK分词器

本文详细介绍如何使用Logstash从MySQL数据库同步数据至Elasticsearch,包括环境搭建、配置文件编辑、常见错误处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、现在服务器上传logstash 和mysql驱动。 logstash 要与es版本一致。

2、将logstash  解压到 /usr/local  将mysql 驱动复制到 /usr/local 

命令: tar -zxvf logstash-6.4.3.tar.gz  -C /usr/local/

命令: cp mysql-connector-java-5.1.41.jar  /usr/local/

3、进去/usr/local/logstash-6.4.3 创建一个文件夹 叫sync , 所有的配置都放在sync里面

命令: mkdir sync

4、进去 sync  创建:logstash-db-sync.conf 文件夹

命令:vim  logstash-db-sync.conf  

:wq 保存。

5、将以下内容 复制到 logstash-db-sync.conf  文件里面 , 再保存

input {
    jdbc {
      #设置 mysql/mariaDB 数据库url及数据库名称
      jdbc_connection_string => "jdbc:mysql://IP:3306/数据库?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"
      #用户名
      jdbc_user => "用户名"
      #密码
      jdbc_password => "密码"
      #数据库驱动所在的位置,可以是绝对路径或者相对路径
      jdbc_driver_library => "/usr/local/logstash-6.4.3/sync/mysql-connector-java-5.1.41.jar"
      #驱动类名
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      # 开启分页
      jdbc_paging_enabled => "true"
      #分页每页数量,可以自定义
      jdbc_page_size => "10000"
      # 执行的sql文件路径
      statement_filepath => "/usr/local/logstash-6.4.3/sync/data.sql"
      # 设置定时任务间隔,含义 分,时,天,月,年,全部为* 默认含义为每分钟跑一次
      schedule => "* * * * *"
      # 索引类型
      type => "_doc"
      # 是否开启记录上次追踪的结果,也就是上次更新的时间,这个会记录到 last_run_metadata_path 的文件
      use_column_value => true
      #记录上一次追踪的结果值
      last_run_metadata_path => "/usr/local/logstash-6.4.3/sync/track_time"
      # 如果 use_column_value 为true, 配置本参数,追踪的column 名,可以是自增id或者时间
      tracking_column => "updated_time"
      # tracking_column 对应字段的类型
      tracking_column_type => "timestamp"
      # 是否清除 last_run_metadata_path 的记录,true 则每次都从头开始查询所有
      clean_run => false
      # 数据库字段名称大写转小写
      lowercase_column_names => false
    }
}
output {
    elasticsearch {
        # es 地址配置
        hosts => ["es IP:9200"]
        #同步的索引名
        index => "索引库名称"
        # 设置_doc的 id 和数据相同
        document_id => "%{id}"
    }
    #日输出
    stdout {
       codec => json_lines
    }
}

6. 在sync  创建:data.sql 文件夹,

复制同步数据的语句,

比如: select itemsId, name,create_time,updated_time from 表名 where  updated_time >=:sql_last_value

再保存: wq

7、在sync  创建:logstash-ik.json 文件

vim logstash-ik.json 

将以下内容 复制到 logstash-ik.json  文件里面 , 再保存

{
    "template": "*",
    "version": 1,
    "settings": {
        "index.refresh_interval": "5s"
    },
    "mappings": {
        "_default_": {
            "_all": {
                "enabled": true,
                "norms": false
            },
            "dynamic_templates": [
                {
                    "message_field": {
                        "path_match": "message",
                        "match_mapping_type": "string",
                        "mapping": {
                            "type": "text",
                            "norms": false
                        }
                    }
                },
                {
                    "string_fields": {
                        "match": "*",
                        "match_mapping_type": "string",
                        "mapping": {
                            "type": "text",
                            "norms": false,
                            "analyzer": "ik_max_word",#只需要添加这一行即可设置分词器为ik_max_word
                            "fields": {
                                "keyword": {
                                    "type": "keyword"
                                }
                            }
                        }
                    }
                }
            ],
            "properties": {
                "@timestamp": {
                    "type": "date",
                    "include_in_all": false
                },
                "@version": {
                    "type": "keyword",
                    "include_in_all": false
                }
            }
        }
    }
}

8、在 logstash-db-sync.conf  文件添加

template_name => "ik"
template => "/usr/local/logstash-6.4.3/sync/logstash-ik.json"
template_overwrite => true
manage_template => false

9、cd  bin目录:执行命令: ./logstash -f /usr/local/logstash-6.4.3/sync/logstash-db-sync.conf

10:创建了索引为ik分词

可以参考文章: https://www.pianshen.com/article/7085303599/

11、启动的时出现报错:Native memory allocation (mmap) failed to map 986513408 bytes for committing reserved memory.

 

解决方案:

vi /etc/security/limits.conf 修改如下:
* hard nofile 65536
* soft nofile 65536

vi /etc/security/limits.d/20-nproc.conf修改如下:
*          soft    nproc     4096
root       soft    nproc     unlimited

vi /etc/sysctl.conf添加:
vm.max_map_count = 655360
并执行:
[root@localhost security]# sysctl -p
vm.overcommit_memory = 1
vm.max_map_count = 655360

再次启动: ./logstash -f /usr/local/logstash-6.4.3/sync/logstash-db-sync.conf

 

问题一:logstash启动报配置文件错误Expected one of #, input, filter, output at line 1, column 1 (byte 1)

可以参考改文章:https://blog.csdn.net/weixin_39183543/article/details/90547342

具体操作:其中文件里面前面不能使用 tab键移动,需要按空格才可以。

最后运行成功:

问题二:同步时候发现只有同步一条数据,并且id的值为 %{id}

解决是id的值为 %{id}

将logstash-db-sync.conf 文件里面的 

    #document_id => "%{id}" 改为  document_id => "%{itemsId}"  itemsId 是data.sql 文件SQL预计id

解决只有一条数据同步的问题:

通过SQL语句:UPDATE 表名 SET updated_time = DATE_ADD(updated_time,INTERVAL 12 MONTH)

问题三,在启动logstash时候,提示报错:

报错:An unknown error occurred sending a bulk request to Elasticsearch. We will retry indefinitely {:error_message=>"\"\\xAD\" from ASCII-8BIT to UTF-8", :error_class=>"LogStash::Json::GeneratorError", 

An unknown error occurred sending a bulk request to Elasticsearch. We will retry indefinitely {:error_message=>"\"\\xE6\" from ASCII-8BIT to UTF-8", :error_class=>"LogStash::Json::GeneratorError",

解决办法是:

logstash-db-sync.conf里面设置每个字段为UTF-8,在es官网有说明:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html#plugins-inputs-jdbc-columns_charset    设置columns_charset 参数。

columns_charset => {
        "id"=> "UTF-8"
        "name"=> "UTF-8"
        等等
      }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值