从MySQL导入海量数据到Elasticsearch

时间:2018-08-15 07:09:39

标签: mysql elasticsearch logstash

我正在尝试使用Logstash从MySQL导入32m行到Elasticsearch,它可以正常工作,但在达到3,5m时会中断。检查过MySQL,Logstash正常运行,Elasticsearch中的问题请查看日志:

[2018-08-14T23:06:44,299][WARN ][o.e.x.s.a.s.m.NativeRoleMappingStore] [4OtmyM2] Failed to clear cache for realms [[]]
[2018-08-14T23:06:44,345][INFO ][o.e.l.LicenseService     ] [4OtmyM2] license [23fbbbff-0ba9-44f5-be52-7f5a6498dbd1] mode [basic] - valid
[2018-08-14T23:06:44,368][INFO ][o.e.g.GatewayService     ] [4OtmyM2] recovered [1] indices into cluster_state
[2018-08-14T23:06:46,120][INFO ][o.e.c.r.a.AllocationService] [4OtmyM2] Cluster health status changed from [RED] to [YELLOW] (reason: [shards started [[clustername][2]] ...]).
[2018-08-14T23:55:55,780][INFO ][o.e.m.j.JvmGcMonitorService] [4OtmyM2] [gc][2953] overhead, spent [378ms] collecting in the last [1s]

我已将堆大小增加到2GB,但仍然无法处理。用于迁移的配置文件如下:

input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql://localhost:3306/clustername?useCursorFetch=true"
        jdbc_user => "USER"
        jdbc_password => "PSWD"
        jdbc_validate_connection => true
        jdbc_driver_library => "/usr/share/java/mysql-connector-java-5.1.42.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_paging_enabled => "true"
        #jdbc_fetch_size => "50000"
        jdbc_page_size => 100000
        statement => "SELECT * FROM `video` ORDER by `id` ASC LIMIT 100000 OFFSET 3552984"
    }
}

谢谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

您没有提供足够的数据来帮助诊断问题。要正确索引大量数据,您必须真正了解数据是什么,将要占用多少存储空间以及将要使用多少内存。

Elasticsearch不是魔术。如果您要超越简单的概念证明,就必须了解一些事情。当您看到诸如gc开销之类的事情花费大量时间时,您必须假设您没有正确调整Elasticsearch集群的大小。

您需要考虑的事情:

  • 我需要多少个碎片?
    • elasticsearch配置文件5中的默认#可能有效,或者可能太多 或太少。
    • 碎片太多会导致Elasticsearch内存不足。分片太少会导致性能下降。
    • 为帮助群集恢复,您的分片不应太大-2 GB至4GB范围内的某个部分应视为“大”
    • Elasticsearch提供的API可以查看您正在使用的分片以及它们的大小
  • elasticsearch需要多少内存?

    • 对于数据节点,建议的使用量是系统RAM的50%
    • 50%的建议与允许操作系统将其他50%用于磁盘缓存有关
    • 如果您正在节点上运行其他内容,则可能需要重新架构或调整性能是否允许
    • 如果数据是基于时间序列的,则您可能应该使用时间序列命名的索引(频率是每年/每月/每周/每天,具体取决于每天生成的记录的数量
  • 您需要多少个节点

    • 没有第二个节点,您将没有副本。
    • 没有副本,您最终将丢失数据
    • 您需要具有奇数个符合条件的主节点(否则,您将陷入集群已分区的裂脑情况)
    • 越多的节点越好-尤其是在您需要大量分片的情况下
  • 您的数据有多大
    • 您可以通过将字段配置为仅关键字字段来减小大小(即,如果您不需要搜索某些字段,或者只需要基于_all搜索)
    • 每个记录使用多少个字段-更多的字段=每行更多的内存

您还需要考虑很多其他事情,但是作为一般规则,请尝试找出错误所在的位置,即通过生成一些看起来像您的随机数据来从混合中删除SQL Server / logstash真实数据,以便您收集适当调整集群大小所需的指标。