logstash同步mysql数据到ES

104 阅读3分钟

项目中,主流的数据存储方案还是MYSQL,虽然MYSQL中也提供了类似ES的关键词全局搜索的方法(待填坑\color{red}{待填坑}),但是在有资源且环境已经搭建对接方便的情况下,使用ES的强大搜索能力还是比较主流的一个方案,因此需要解决如何把Mysql中的数据导入到ES中,下面介绍通过logstash异步的将mysql同步到ES中。

一、logstash对接mysql Demo

对接前的准备:jdbc驱动下载

下载地址mvnrepository.com/artifact/my…

image.png

logstash配置

ES和Logstash的搭建教程可以点这边

在Logstash中,主要有三个核心模块:input、filter、output。它们分别负责以下作用:

  1. Input(输入)

    • Input模块负责从不同来源收集数据。这些来源可以是文件、网络服务、数据库、消息队列等。Input模块的作用是将这些数据获取并传送给Logstash处理流水线。
  2. Filter(过滤)

    • Filter模块用于处理从input模块获取的数据。它允许对数据进行各种转换、处理和增强操作,例如解析数据、移除或重命名字段、过滤或增加数据、应用条件逻辑等。Filter模块的存在允许Logstash灵活地对数据进行预处理,使得输出数据更符合要求或更易于分析。
  3. Output(输出)

    • Output模块负责将经过输入和过滤处理后的数据发送到目标位置。这些目标可以是Elasticsearch索引、文件、消息队列、数据库、远程服务等。Output模块的主要作用是将处理后的数据传送到最终的存储或使用位置,以供后续查询、分析或其他操作使用。

我们在pipeline下创建一个新的mysql包用来存放conf以及驱动、sql脚本文件

input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql://mysql_ip:3306/db_name?characterEncoding=UTF-8&autoReconnect=true"
        # 数据库连接账号密码:
        jdbc_user => "root"
        jdbc_password => "pw"
        # MySQL 驱动路径:
        jdbc_driver_library => "/usr/share/logstash/pipeline/mysql/mysql-connector-java-8.0.20.jar"
        jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
        connection_retry_attempts => "3"
        jdbc_validate_connection => "true"
        jdbc_validation_timeout => "6000"
        #开启分页查询 默认不开启
        jdbc_paging_enabled => "true"
        jdbc_page_size => "500" 

        #statement为查询数据SQL
        #sql_last_value为内置的变量,存放上次查询结果中最后一条数据tracking_column的值,此处即为modifyTime;
        #statement_filepath => "/data/logstash/pipeline/mysql/jdbc.sql"
        statement => "SELECT id,type,fullName,position,createdTime,modifyTime FROM shop WHERE modifyTime >= :sql_last_value order by modifyTime asc"
        # 是否将字段名转化为小写,默认为true
        lowercase_column_names => false
        sql_log_level => warn

       	# 是否记录上次执行结果,true表示会将上次执行结果的tracking_column字段的值保存到last_run_metadata_path指定的文件中;
        record_last_run => true 

         # 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
         use_column_value => true
         #需要记录的字段,用于增量同步,需要是数据库的字段
         tracking_column => "modifyTime"
         tracking_column_type => timestamp
         #record_last_run 上次数据存放位置
         last_run_metadata_path => "/usr/share/logstash/pipeline/mysql/last_id.txt"

         # 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false
         clean_run => false
        # 同步频率 默认每分钟同步一次 分 时 天 月 年
        schedule => "* * * * *"
    }
}

filter {}

output {
	elasticsearch {
		 # 配置ES地址
		hosts => ["elasticsearch:9200"]
		 # 索引名字
		index => "shop"
		 # 数据唯一索引
		document_id => "%{id}"
	}
	stdout {
		codec => json_lines
	}
}

注意上面的驱动以及日志路径都需要是容器内对应的位置,在logstash启动的时候需要把你要分享的位置给挂载出来。

然后我们来到usr/share/logstash/config目录下(挂载的到主机对应位置下),找到conf下的pipeline.yml配置文件,添加扫描的路径。

# 默认的
- pipeline.id: main
  path.config: "/usr/share/logstash/pipeline"

# 我们新创建的 id需要唯一 config指定到.conf为止,如果只指定到mysql下启动时会发生Not utf-8的错误
- pipeline.id: read-mysql-crm
  path.config: "/usr/share/logstash/pipeline/mysql/mysql.conf"
~                                                                 

到这里其实重新启动elk之后就会开始同步了。

二、针对多表、多数据库的配置

。。。。。待填坑