Logstash elasticsearch MySQL数据同步以及遇到问题解决

使用Logstash将MySQL数据同步到elasticsearch:

input {
    stdin {
    }
    jdbc {
        jdbc_driver_library => "mysql-connector-java-5.1.46-bin.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"

        #B表示你的MySQL的ip+3306,A表示某个数据库
        jdbc_connection_string => "jdbc:mysql://B/A"

        #MySQL用户名
        jdbc_user => "****"

        #密码
        jdbc_password => "*****"
        jdbc_paging_enabled => "true"
        jdbc_page_size => "100000"

        #这个参数表示你在开启Logstash同步数据时需不需要clean掉上次的记录
        clean_run => true

        #use_column_value 设置为true,表示按照增量更新模式更新数据
        use_column_value => true

        #这个参数表示将id作为每次增量更新所依照的参数
        tracking_column => "id"

        #这是存放上一次执行之后id的值
        last_run_metadata_path => "/usr/YEE/logstash-6.3.2/MySqlYee/****/*****.txt"

        #sql语句可以按照脚本(路径)或者sql语句给出
        #statement_filepath => "/usr/YEE/logstash-6.3.2/MySqlYee/****.sql"

        #sql_last_value每次读取last_run_metadata_path中存放的值,下面语句增量更新是按照id值递增的顺序同步mysql中的内容
        statement => "select * from story where id > :sql_last_value"

        该参数按照 分 时 日 月 年 来设置多久更新一次数据,不设置表示仅更新一次;全* 表示每分钟更新一次
        #schedule => "* * * * *"
   }
}
filter {
        json {
           source => "message"
           remove_field => ["message"]
        }
        #下面:当使用Logstash自动生成的mapping模板时过滤掉@timestamp和@version字段
         mutate {
                remove_field =>
                ["@timestamp","@version"]
                }
   output {
        elasticsearch {
                #hosts:一般是localhost:9200
                hosts => ["****:9200"]
                index => "*****"

                #表示按照id同步mysql数据
                document_id => "%{id}"
                document_type => "****"

                #下面两个参数表明加载我自己配置的Mapping模板,包括可以自行设置中文分词等
                template_overwrite => true
                template => "/usr/YEE/logstash-6.3.2/MySqlYee/*****/template/*****_test1_ik.json"
        }

   stdout {
        codec => json_lines
   }
}


同步数据时可能遇到的一些问题:

  • 对于全量更新,不用考虑数据更新的问题,但是数据量大的话需很长时间(我所描述的是每次都从elasticsearch删除数据从零的更新,否则就会有数据重复的问题了)
  • 增量更新对于某条已经存在数据内容修改的问题:
    • 通过在MySQL数据库中添加一列用于记录实时修改时间,然后上面增量更新的参数就设置为这个updatetime,每次数据有一点改动都要更新这个updatime的值,这样就可以把每一次修改的值都更新;
  • 增量更新对于数据删除的问题:
    • 设置两个参数:updatetime记录当前更新数据时间;Delete_flag:表示这条数据有没有被删掉
  • 当使用自己的template时遇到问题:elasticsearch每新增加一个index都会使用这个template中提供的mapping。Logstash同步数据时包括创建新的mapping时,都先查看已经已经存在的template:GET /_cat/templates,然后就会看到一条记录如下:
    这里写图片描述
    通过代码:DELETE /_template/logstash删掉这个template,然后在添加新的index
  • Logstash could not be started because there is already another instance using the configured data directory.
    • 解决办法:
    • 1、添加新的路径
    • 2、 ps aux|grep logstash 查询运行中的Logstash进程
      • kill -9 xxx kill进程

猜你喜欢

转载自blog.csdn.net/yiyiholic/article/details/82352236
今日推荐