logstash-input-jdbc插件实现关系型数据库和ES增量同步

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/g1969119894/article/details/80250114

环境安装

官网下载你要部署环境的相应安装包,这里以linux系统为例。
选择与你的ES相同版本的logstash的tar.gz包,上传解压,进入解压目录下测试下。
使用bin/logstash -e 'input { stdin { } } output { stdout {} }',启动后输入任意内容后,如果有返回则表示安装成功
这里写图片描述

使用logstash-input-jdbc插件

先使用bin/logstash-plugin list查看下已安装好的插件一般5.X以后的版本都会默认安装好此插件。
这里写图片描述

下面罗列一下,要实现增量同步需要的东西,以orcal为例:

  • orcal连接jar包
  • 能搜索新增值的sql
    我的sql: :sql_last_value是上次同步的最后值
select *
from drc_policy_publish p
where record_no > :sql_last_value  
order by record_no

接下类创建一个启动的conf文件,vi conf/orcal.conf,里面配置如下

input {
    jdbc {
        jdbc_connection_string => "jdbc:oracle:thin:@//ip:1521/orcl"
        # 用户名和密码
        jdbc_user => "user"
        jdbc_password => "password"
        # 驱动,准备的连接jar包位置
        jdbc_driver_library => "/opt/elk/logstash-5.6.8/orcal/ojdbc-6.jar"
        # 驱动类名
        jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
        #配置一次同步的最大数量
        jdbc_paging_enabled => "true"
        jdbc_page_size => "50000"

        # 执行的sql 文件路径+名称
        statement_filepath => "/opt/elk/logstash-5.6.8/orcal/sql/policy.sql"

        # 设置监听间隔  各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
        schedule => "* * * * *"

        # 是否记录上次执行结果, 如果为真,将会把上次执行到的 tracking_column 字段的值记录下来,保存到 last_run_metadata_path 指定的文件中
        record_last_run => "true"

        # 是否需要记录某个column 的值,如果record_last_run为真,可以自定义我们需要 track 的 column 名称,此时该参数就要为 true. 否则默认 track 的是 timestamp 的值.
        use_column_value => "true"

        # 如果 use_column_value 为真,需配置此参数. track 的数据库 column 名,该 column 必须是递增的. 一般是mysql主键
        tracking_column => "record_no"
        #用于保存上次同步的最后值,先新建,输入0比较好,不然是使用null去比较
        last_run_metadata_path => "/opt/elk/logstash-5.6.8/orcal/last_id"

        # 是否清除 last_run_metadata_path 的记录,如果为真那么每次都相当于从头开始查询所有的数据库记录
        clean_run => "false"

        # 是否将 字段(column) 名称转小写
        lowercase_column_names => "true"

    }
}

filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
}

output {
    elasticsearch {
        hosts => "ip:9200"
        index => "orcal"
        document_type => "drc_polic_publish"
        # 将"_id"的值设为数据库主键
        document_id => "%{record_no}"
    }
}

如果你的表数据中没有递增的列,那也可以使用默认的timestamp 值,不过你需要将es中_id的值也设置成timestamp的值。如果让es自己来创建_id,则会一直插入数据,因为它无法判断哪些是新值。

在启动前,你需要先在ES中创建好索引的映射,不然就都要使用默认映射了。

接下来启动使用bin/logstash -f config/orcal.conf 命令启动,可以看到两次的搜索参数是不同的
这里写图片描述
可以看到数据已经放进去了
这里写图片描述
也可以去Discover,把主键字段排下序,查看最新的同步数据是什么
这里写图片描述

上述的启动方式,会占用命令行,如果验证好自己的配置没有问题后,可以修改schedule参数,比如schedule => “* 8 * * *”,每八小时同步一次,然后使用nohup命令后台运行logstash nohup bin/logstash -f conf/orcal.conf &

展开阅读全文

没有更多推荐了,返回首页