Logstash
简略介绍:
Logstash是elastic技术栈中的一员。它是一个数据采集引擎,可以从数据库采集数据到es中。我们可以通过设置自增id主键或者时间来控制数据的自动同步,这个id或者时间就是用于给logstash进行识别哪些数据需要同步的。
-
使用ID的方式,假设表中有1000条数据,Logstatsh第一次同步完毕后会记录id为1000。以后表中新增数据时,主键id自动累加。Logstatsh的定时任务在扫描表数据时发现最大的id和自身记录的不一样,就会再次做增量同步。
-
使用时间的方式,假设表中有1000条数据,每一条数据都有一个时间(创建时间或更新时间)。在初次同步完毕以后,Logstatsh会记录最大的那个时间值。定时任务在扫描时会判断表中的数据时间值是否超过了自身所记录的时间,如果超过了就做增量更新。
使用ID的弊端:修改数据无法同步到es。包括做逻辑删除。无论采用哪一种方式,物理删除是不会同步到es的。
也可以在操作数据库的同时,手动对es索引进行修改。不使用Logstatsh。
安装与配置Logstatsh:
https://www.elastic.co/cn/downloads/past-releases/logstash-6-4-3,注意Logstatsh版本和es版本相一致。
解压缩后的目录结构:
bin CONTRIBUTORS Gemfile lib logs logstash-core-plugin-api NOTICE.TXT tools x-pack config data Gemfile.lock LICENSE.txt logstash-core modules vendor
示例脚本——抓取数据库中的数据并推送到Elasticsearch:
新建文件夹,存放数据同步的配置文件:
mkdir sync
1.配置文件——启动Logstash时使用
新建配置文件 vim logstash-db-sync.conf #添加如下内容 input { jdbc { # 设置 MySql/MariaDB 数据库url以及数据库名称 jdbc_connection_string => "jdbc:mysql://192.168.1.6:3306/foodie-shop-dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true" # 用户名和密码 jdbc_user => "root" jdbc_password => "root" # 数据库驱动所在位置,可以是绝对路径或者相对路径 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/foodie-items.sql" # 设置定时任务间隔 含义:分、时、天、月、年,全部为*默认含义为每分钟跑一次任务 schedule => "* * * * *" # 索引类型 #受重写模板的影响,最终数据同步后type的值要以实际为准。(7.x版本后没这个问题,都是_type) 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 => ["192.168.1.187:9200"] # 同步的索引名 index => "foodie-items" # 设置_docID和数据相同 document_id => "%{id}" # 设置中文分词器 # 定义模板名称 template_name => "myik" # 模板所在位置 template => "/usr/local/logstash-6.4.3/sync/logstash-ik.json" # 重写模板 template_overwrite => true # 默认为true,false关闭logstash自动管理模板功能,如果自定义模板,则设置为false manage_template => false } # 日志输出 stdout { codec => json_lines } }
2.修改Logstash的mappings模板,配置中文分词器
#新建json文件,重写模板 vim logstash-ik.json; { "order": 0, "version": 1, "index_patterns": ["*"], "settings": { "index": { "refresh_interval": "5s" } }, "mappings": { "_default_": { "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", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } ], "properties": { "@timestamp": { "type": "date" }, "@version": { "type": "keyword" }, "geoip": { "dynamic": true, "properties": { "ip": { "type": "ip" }, "location": { "type": "geo_point" }, "latitude": { "type": "half_float" }, "longitude": { "type": "half_float" } } } } } }, "aliases": {} }
启动logstatsh:
./logstash -f /usr/local/logstash-6.4.3/sync/logstash-db-sync.conf
过程较慢,耐心等待。
如有错误,恳请指出。