如果logstash需要读取数据库,首先需要下载对应的Mysql数据库驱动包

mysql-connector-java-5.1.46.jar

可以查看mysql-connector-java驱动包与mysql数据库版本的对应关系

根据实际使用的数据库版本找到自己所需要的Mysql数据库驱动包,maven仓库下载对应的驱动包地址

https://repo1.maven.org/maven2/mysql/mysql-connector-java/两者版本的对应关系官网文档地址:
https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-versions.html (MySQL Connector/J 5.1 Developer Guide)

es冻结索引配置 es索引存储_bc

https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-versions.html (MySQL Connector/J 8.0 Developer Guide)

es冻结索引配置 es索引存储_mysql_02

如果linux不可联外网,进入官网地址找自己所需要的版本下载压缩包

https://www.elastic.co/cn/downloads/past-releases#logstash

下载所需要对应的linux版本的logstash压缩包到本地,然后使用rz命令上传压缩文件到linux服务器上

可以联网的情况下,使用wget命令直接在服务器上下载压缩包,然后解压

wget https://artifacts.elastic.co/downloads/logstash/logstash-7.9.2.zip

进入解压后的config目录下

cd /usr/local/elk/logstash/config

可自定义创建一个新的文件或者在原本的logstash-sample.conf文件上做修改

自定义一个jdbc的配置文件

vim jdbc.conf

内容如下:

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
    stdin {
	
    }
    jdbc {
        type => "test_user"
         # 数据库连接地址
        jdbc_connection_string => "jdbc:mysql://192.168.1.1:3306/test_database?characterEncoding=utf8&useSSL=false&Asia/Shanghai&rewriteBatchedStatements=true&tinyInt1isBit=false"
         # 数据库连接账号密码;
        jdbc_user => "test"
        jdbc_password => "123456"
         # MySQL依赖包路径;
        jdbc_driver_library => "/usr/local/elk/mysql/mysql-connector-java-5.1.46.jar"
         # the name of the driver class for mysql
        jdbc_driver_class => "com.mysql.jdbc.Driver"
         # 数据库重连尝试次数
        connection_retry_attempts => "3"
         # 判断数据库连接是否可用,默认false不开启
        jdbc_validate_connection => "true"
         # 数据库连接可用校验超时时间,默认3600S
        jdbc_validation_timeout => "60000"
         # 开启分页查询(默认false不开启);
        jdbc_paging_enabled => "true"
         # 单次分页查询条数(默认100000,若字段较多且更新频率较高,建议调低此值);
        jdbc_page_size => "5000"
         # statement为查询数据sql,如果sql较复杂,建议配通过statement_filepath配置sql文件的存放路径;
         # sql_last_value为内置的变量,存放上次查询结果中最后一条数据tracking_column的值,此处即为ModifyTime;
        #statement => "SELECT id,user_id,user_name,
		#### 以下sql中DATE_FORMAT的操作为了数据库时间字段按照字符串的格式存储数据到ES索引,避免存储变成UTC时区格式
		# DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%s') AS create_time,
		# DATE_FORMAT(update_time,'%Y-%m-%d %H:%i:%s') AS update_time FROM test_user WHERE update_time>= :sql_last_value order by update_time asc"
		# 由于设定sql查询返回字段值,使用自定义sql文件地址,test_user.sql文件就是一个select * from test_user类似的查询操作
		statement_filepath => "/usr/local/elk/mysql/test_user.sql"
         # 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false);
        lowercase_column_names => false
         # Value can be any of: fatal,error,warn,info,debug,默认info;
        sql_log_level => error
         #
         # 是否记录上次执行结果,true表示会将上次执行结果的tracking_column字段的值保存到last_run_metadata_path指定的文件中;
        record_last_run => true
         # 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
        use_column_value => true
         # 需要记录的字段,用于增量同步,需是数据库字段
        tracking_column => "update_time"
         # Value can be any of: numeric,timestamp,Default value is "numeric"
        tracking_column_type => timestamp
         # record_last_run上次数据存放位置
		 # test_user_update_time.txt文件保存最后的更新时间,但数据库update_time字段更新时间大于该文件中的时间时,自动触发同步操作
        last_run_metadata_path => "/usr/local/elk/mysql/test_user_update_time.txt"
         # 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false;
        clean_run => false
         #
         # 同步频率(分 时 天 月 年),默认每分钟同步一次;该时间表达式根据实际需求自定义
        schedule => "*/10 * * * *"
    }

    jdbc {
        type => "test_role"
         # 数据库连接地址
        jdbc_connection_string => "jdbc:mysql://192.168.1.1:3306/test_database?characterEncoding=utf8&useSSL=false&Asia/Shanghai&rewriteBatchedStatements=true&tinyInt1isBit=false"
         # 数据库连接账号密码;
        jdbc_user => "test"
        jdbc_password => "123456"
         # MySQL依赖包路径;
        jdbc_driver_library => "/usr/local/elk/mysql/mysql-connector-java-5.1.46.jar"
         # the name of the driver class for mysql
        jdbc_driver_class => "com.mysql.jdbc.Driver"
         # 数据库重连尝试次数
        connection_retry_attempts => "3"
         # 判断数据库连接是否可用,默认false不开启
        jdbc_validate_connection => "true"
         # 数据库连接可用校验超时时间,默认3600S
        jdbc_validation_timeout => "60000"
         # 开启分页查询(默认false不开启);
        jdbc_paging_enabled => "true"
         # 单次分页查询条数(默认100000,若字段较多且更新频率较高,建议调低此值);
        jdbc_page_size => "500"
         # statement为查询数据sql,如果sql较复杂,例如有join关联查询,需要一个索引冗余另一个索引一部分数据的情况,避免有些项目页面查询时需要查询两个索引
		 # 建议配通过statement_filepath配置sql文件的存放路径;
         # sql_last_value为内置的变量,存放上次查询结果中最后一条数据tracking_column的值,此处即为ModifyTime;
        #statement => "SELECT id,role_id,role_name,
		#DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%s') AS create_time,
		#DATE_FORMAT(update_time,'%Y-%m-%d %H:%i:%s') AS update_time FROM `test_role` WHERE update_time>= :sql_last_value order by update_time asc"
		statement_filepath => "/usr/local/elk/mysql/test_role.sql"
         # 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false);
        lowercase_column_names => false
         # Value can be any of: fatal,error,warn,info,debug,默认info;
        sql_log_level => error
         #
         # 是否记录上次执行结果,true表示会将上次执行结果的tracking_column字段的值保存到last_run_metadata_path指定的文件中;
        record_last_run => true
         # 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
        use_column_value => true
         # 需要记录的字段,用于增量同步,需是数据库字段
        tracking_column => "update_time"
         # Value can be any of: numeric,timestamp,Default value is "numeric"
        tracking_column_type => timestamp
         # record_last_run上次数据存放位置;
        last_run_metadata_path => "/usr/local/elk/mysql/test_role_update_time.txt"
         # 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false;
        clean_run => false
         #
         # 同步频率(分 时 天 月 年),默认每分钟同步一次;
        schedule => "*/10 * * * *"
    }
}
output {
    if [type] == "test_user" {
		elasticsearch {
			hosts => ["http://192.168.1.1:9200"]
			# 配置ES集群地址
			#hosts => ["192.168.1.1:9200", "192.168.1.2:9200", "192.168.1.3:9200"]
			# 索引名字,必须小写
			index => "test_user"
			# 数据唯一索引(建议使用数据库KeyID)
			document_id => "%{id}"
		}
    }
    if [type] == "test_role" {
		elasticsearch {
			hosts => ["http://192.168.1.1:9200"]
			# 配置ES集群地址
			#hosts => ["192.168.1.1:9200", "192.168.1.2:9200", "192.168.1.3:9200"]
			# 索引名字,必须小写
			index => "test_role"
			# 数据唯一索引(建议使用数据库KeyID)
			document_id => "%{id}"
		}
    }
    stdout {
        codec => rubydebug
    }
}

配置好后保存该文件

启动logstash,指定jdbc.conf配置文件启动
nohup ./logstash -f /usr/local/elk/logstash/config/jdbc.conf &