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

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下载

 

配置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
    }}

 sql文件配置

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

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
  • 通过

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

 启动脚本

  • 启动
/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创建索引模板

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

  •  默认的模板没有指定分词器,对中文很不友好
    • 可以通过手动创建索引指定分词器
    • 也可以通过自定义模板,让同步的数据按模板配置生成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 &

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值