Logstash - Linux 实现MySQL与ES数据同步

目录

环境准备

搭建Logstash

Logstash下载

配置Logstash

同步脚本配置

 sql文件配置

 脚本测试

 启动脚本

自定义es创建索引模板

多索引同步

后台运行


环境准备

  • Elasticsearch 7.4.2
  • MySQL 8.0.15
  • logstash-7.4.2.tar.gz
  • mysql-connector-java-8.0.15.jar

搭建Logstash

  • 版本与Elasticsearch必须保持一致7.4.2,在ES官网下载

Logstash下载

es收不到 logstash数据 logstash连接es_自定义

es收不到 logstash数据 logstash连接es_Mr.chenyb_02

 

es收不到 logstash数据 logstash连接es_Mr.chenyb_03

配置Logstash

同步脚本配置

  • 进入/usr/local/目录,将安装文件解压到这里
  • /usr/local/
  • tar -zxvf /home/chenyb/software/logstash-7.4.2.tar.gz
  • 进入logstash,创建自定义文件夹
  • cd logstash-7.4.2/
  • mkdir sync
  • 进入sync文件夹,创建数据同步配置文件
  • cd sync/
  • vi logstash-db-sync.conf
  • input:元数据输入
  • jdbc:连接
  • jdbc_connection_string:# 设置 MySql/MariaDB 数据库url以及数据库名称
  • jdbc_user:数据库连接用户名
  • jdbc_password:数据库连接密码
  • jdbc_driver_library:数据库驱动所在位置,可以是绝对路径或者相对路径
  • 驱动包一定要放在./logstash-7.4.2/logstash-core/lib/jars文件夹下,否则插件无法加在
  • jdbc_driver_class:驱动类名
  • jdbc_paging_enabled:开启分页
  • jdbc_page_size:分页每页数量,可以自定义,建议不要太大,影响性能,根据计算机硬件1000-5000之间为好
  • statement_filepath:执行的sql文件路径
  • schedule:设置定时任务间隔,时间表达式
  • type:索引类型,区分input与output对应关系
  • use_column_value:是否开启记录上次追踪的结果,也就是上次更新的时间,这个会记录到 last_run_metadata_path 的文件
  • last_run_metadata_path:记录上一次追踪的结果值
  • tracking_column:如果 use_column_value 为true, 配置本参数,追踪的 column 名,可以是自增id或者时间,tracking_column 对应数据库的类型与名称,监听该数据变化而同步
  • tracking_column_type:es中的属性类型
  • clean_run:是否清除 last_run_metadata_path 的记录,true则每次都从头开始查询所有的数据库记录
  • lowercase_column_names:数据库字段名称大写转小写
  • output:数据目的地配置
  • elasticsearch:目的地为es
  • hosts:es地址,注意端口是客户端端口
  • index:同步到索引名下
  • document_id:设置_docID和数据相同,"%{dilm_id}",id推荐为逐渐,注意字段名称对应,这里为dilm_id,查询结果必然也是dilm_id
  • stdout:控制台输出日志
  • codec => json_lines:以JSON形式输出
input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql://192.168.50.160:3306/sakila?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true"
        jdbc_user => "root"
        jdbc_password => "root"
        jdbc_driver_library => "/usr/local/logstash-7.4.2/logstash-core/lib/jars/mysql-connector-java-8.0.15.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_paging_enabled => "true"
        jdbc_page_size => "10000"
        statement_filepath => "/usr/local/logstash-7.4.2/sync/sakila-film.sql"
        schedule => "* * * * *"
        type => "_doc"
        use_column_value => true
        last_run_metadata_path => "/usr/local/logstash-7.4.2/sync/track_time"
        tracking_column => "last_update"
        tracking_column_type => "timestamp"
        clean_run => false
        lowercase_column_names => false
    }
}
output {
    elasticsearch {
        hosts => ["192.168.50.201:9200"]
        index => "film"
        document_id => "%{film_id}"
    }
    stdout {
        codec => json_lines
    }}

es收不到 logstash数据 logstash连接es_Mr.chenyb_04

 sql文件配置

  • >= :sql_last_value:监听该字段变化
  • film_id:与同步脚本中的 film_id 名称一致
  • last_update:与同步脚本中的监听属性一致

es收不到 logstash数据 logstash连接es_json_05

SELECT 
	film_id,
	title,
	description,
	release_year,
	language_id,
	original_language_id,
	rental_duration,
	rental_rate,
	length,
	replacement_cost,
	rating,
	special_features,
	last_update
 FROM 
	film
WHERE 
	last_update >= :sql_last_value

 脚本测试

  • 在ES中创建film索引,与同步脚本中配置的名称一致
  • 测试脚本能否执行
/usr/local/logstash-7.4.2/bin/logstash -f /usr/local/logstash-7.4.2/sync/logstash-db-sync.conf -t
  • 通过

es收不到 logstash数据 logstash连接es_自定义_06

  • 表示配置不正确,有错误的关键字,或者编码格式不是单纯的UTF-8
  • 如果是格式的问题,将文件重新编码即可(在win环境,利用Notepad ++是个好主意)

es收不到 logstash数据 logstash连接es_自定义_07

 启动脚本

  • 启动
/usr/local/logstash-7.4.2/bin/logstash -f /usr/local/logstash-7.4.2/sync/logstash-db-sync.conf
  • 报错
  • mysql驱动位置放的不对,无法加在到插件,将驱动放置./logstash-7.4.2/logstash-core/lib/jars文件夹下即可,注意修改同步配置脚本驱动的位置

es收不到 logstash数据 logstash连接es_Mr.chenyb_08

  • 驱动类名不匹配,在同步配置文件中修改即可

es收不到 logstash数据 logstash连接es_json_09

  •  成功

es收不到 logstash数据 logstash连接es_json_10

  •  改动及时同步

es收不到 logstash数据 logstash连接es_json_11

自定义es创建索引模板

  • 在es中查看默认模板
GET    http://192.168.50.201:9200/_template/logstash

es收不到 logstash数据 logstash连接es_es收不到 logstash数据_12

  • 可以通过手动创建索引指定分词器
  • 也可以通过自定义模板,让同步的数据按模板配置生成mappings对应关系
  • 创建模板
cd ./logstash-7.4.2/sync

vi 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": {}
}
  • 在同步配置文件中引入自定义模板
  • template_name:自定义模板名称
  • template:模板所在位置
  • template_overwrite:重写模板
  • manage_template:默认为true,false关闭logstash自动管理模板功能,如果自定义模板,则设置为false
output {
    elasticsearch {
        hosts => ["192.168.50.201:9200"]
        index => "film"
        document_id => "%{film_id}"

    
        template_name => "myik"
        template => "/usr/local/logstash-6.4.3/sync/logstash-ik.json"
        template_overwrite => true
        manage_template => false
    }
    stdout {
        codec => json_lines
    }}

多索引同步

input {
    jdbc {
      #省略
      type => "user"
    }
    jdbc {
      #省略
      type => "kill"
    }
}

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

output {
    if[type] == "user" {
        elasticsearch {
            #省略,与type => "user"中的属性配置对应即可
        }
    }
    if[type] == "kill" {
        elasticsearch {
             #省略,与type => "kill"中的属性配置对应即可
        }
    }
    stdout {
        codec => json_lines
    }
}

后台运行

nohup /usr/local/logstash-7.4.2/bin/logstash -f /usr/local/logstash-7.4.2/sync/logstash-db-sync.conf &