Logstash导入mysql数据到es慢的解决方法

有一个千万级别的数据库存放在Mysql中,由于直接在Mysql中使用语句查询,一次的时间要十几分钟,无法满足应用的需求,因此考虑将其导入到elasticsearch中进行倒排索引查询。

使用的工具是Logstash,但是Logstash的导入速度随着导入数据量的增大变得越来越慢。查询后发现在数据量增大时变慢的原因是因为mysql的深度分页达到了瓶颈。因为logstash在我们自己写的的sql上又加了一层作为封装

在logstash的导入conf配置文件中的statement代码

SELECT * FROM xxx 

Logstash的实际执行代码(设置了jdbc的分页大小为10000)

SELECT * FROM (SELECT * FROM xxx) AS `t1` LIMIT 10000 OFFSET 510000

这样做造成的结果就是,从数据库中先取出510000条数据,再对这些数据进行分页,丢弃掉前500000条,保留最后10000条。因此随着OFFSET的增大,一次的查询时间也随着增大。在自己踩的坑中,当OFFSET达到300多W时一次查询的时间可能就需要半小时之久,一天才能入库几十万条,这明显达不到我们导入的要求。

其中也尝试了对logstash进行配置上的设置,比如调整pipeline.worker的数量、增大分配给Logstash的内存大小等,虽然有提高速度,但还是远远不够。 

因此最终的解决方案是:按照数据库中的id使用偏移量来进行全量入库,避免logstash自己进行分页

最终配置文件代码如下

input {
  jdbc {
     # 指明jdbc驱动包位置和要使用的驱动包类。
    jdbc_driver_library => "D:/tools/elasticsearch-7.6.2/logstash-7.6.2/mysql-connector-java-8.0.19.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
     # myqsl数据库的连接信息
    jdbc_connection_string => "jdbc:mysql://localhost:3306/xxxx?serverTimezone=UTC"
    jdbc_user => "user"
    jdbc_password => "password"
    # 设置分页的部分
	record_last_run => true
	use_column_value => true
    tracking_column => "id"
    #info.txt用于存放上次查询id的偏移量
	last_run_metadata_path => "D:\tools\elasticsearch-7.6.2\logstash-7.6.2\自己的info.txt的路径"
    #每分钟执行一次该语句
	schedule => "* * * * *"
    statement => "SELECT * from xxx where id > :sql_last_value limit 10000"
  }
}

output {
  # 将数据输出到ElasticSearch中
    elasticsearch {
    hosts => ["127.0.0.1:9200"]
    # es文档索引和文档数据的id
    index => "xxxx"
	document_id => "%{id}"
  }
}

最后的运行效果如图所示,基本上CPU的占用率是跑满了,600多W条数据只用了几个小时,相较于之前200多W条数据跑两天,速度得到了很大的提升。

Kibana上检测的数据变化情况

 参考内容

[elk]-logstash导入mysql越来越慢_爷来辣的博客-CSDN博客

logstash7.0.1将数据从mysql5.7同步至es7.0.1大数据量下同步慢的问题_java_xxxx的博客-CSDN博客

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用LogstashMySQL导入数据到Elasticsearch的步骤: 1. 安装Logstash: ```shell sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch sudo yum install logstash ``` 2. 安装Logstash插件: ```shell cd /usr/share/logstash/bin/ sudo ./logstash-plugin install logstash-input-jdbc sudo ./logstash-plugin install logstash-output-elasticsearch ``` 3. 将MySQL的Java连接器复制到Logstash的目录: ```shell scp mysql-connector-java-8.0.13.tar.gz [email protected]:~/ tar -zxvf mysql-connector-java-8.0.13.tar.gz ``` 4. 创建Logstash配置文件,例如`mysql_to_elasticsearch.conf`,并将以下内容添加到文件中: ```shell input { jdbc { jdbc_driver_library => "/path/to/mysql-connector-java-8.0.13.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/database_name" jdbc_user => "username" jdbc_password => "password" statement => "SELECT * FROM table_name" } } output { elasticsearch { hosts => ["localhost:9200"] index => "index_name" document_type => "document_type" } } ``` 请注意,你需要将`/path/to/mysql-connector-java-8.0.13.jar`替换为实际的MySQL连接器的路径,`localhost:3306`替换为实际的MySQL主机和端口,`database_name`替换为实际的数据库名称,`username`和`password`替换为实际的数据库用户名和密码,`table_name`替换为实际的表名,`index_name`替换为要创建的Elasticsearch索引名称,`document_type`替换为要创建的文档类型。 5. 启动Logstash并指定配置文件: ```shell sudo ./logstash -f mysql_to_elasticsearch.conf ``` Logstash将会从MySQL中查询数据,并将其导入到Elasticsearch中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值