ElasticSearch 中令人难以置信的缓慢索引
Unbelievably slow indexing in ElasticSearch
我们决定在我们的产品中加入搜索引擎。并比较 ElasticSearch 和 Solr。
当我们开始使用 Elastic 2.3.3 时。我们面临索引速度慢的问题。我们使用 Logstash 为 elastic 提供数据,用 4000000 条记录索引 table 花费了 8 个多小时。 table 的物理大小接近 40GB。我们使用硬盘...是的,很遗憾。但是在同一台PC上,我们测试了Solr,同样的操作耗时3个小时。
也许我们在 elastic 的配置上犯了错误?
elastic 的另一时刻索引大小是 table 大小的两倍多,而 solr 索引仅为 DB 大小的 8%。
当我们使用 logstash 输出文件中的数据时,速度非常快。
这里我们配置了 elastic 的 logstash 的 jdbc 模块:
input {
jdbc {
jdbc_driver_library => "F:\elasticsearch-2.3.3\lib\sqljdbc_4.0\enu\sqljdbc4.jar"
jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc_connection_string => "jdbc:sqlserver://s_tkachenko\mssql2014:49172;databaseName=work"
jdbc_user => "sa"
jdbc_password => "__masked_password__"
statement => "SELECT id, name FROM Contact"
}
}
我们只设置了 1 个分片,没有副本。
亲爱的社区,也许您有任何建议,因为对弹性的支持只有在我们购买订阅后才会对我们有帮助。但是购买订阅的产品一点效果都不好,我认为这不是一个好主意。
感谢您的关注,等待您的想法。
- 我觉得1个分片太少了。根据您的硬件配置增加那个。
- 使elasticsearch使用一半内存:https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html#_give_less_than_half_your_memory_to_lucene
- 增加刷新间隔(默认:1s):
index.refresh_interval: 30s
- 增加索引缓冲区(默认值:%10):
indices.memory.index_buffer_size: 30%
同时您也可以在 logstash 中进行一些更改:
- 指定工人数:-w {WORKER_COUNT}。 cpu count * 2 在我的实验中是最好的。
- 指定缓冲区大小:-u {BUFFER_SIZE}。 512 最适合我。
您还可以为 elasticsearch 输出插件指定输出工作器计数和刷新缓冲区:
output {
elasticsearch {
# elasticsearch hosts
hosts => ["127.0.0.1"]
# bulk message size
flush_size => 512
# output worker cpu core * 2
workers => 8
}
}
希望其中的一些帮助。
我们决定在我们的产品中加入搜索引擎。并比较 ElasticSearch 和 Solr。 当我们开始使用 Elastic 2.3.3 时。我们面临索引速度慢的问题。我们使用 Logstash 为 elastic 提供数据,用 4000000 条记录索引 table 花费了 8 个多小时。 table 的物理大小接近 40GB。我们使用硬盘...是的,很遗憾。但是在同一台PC上,我们测试了Solr,同样的操作耗时3个小时。 也许我们在 elastic 的配置上犯了错误? elastic 的另一时刻索引大小是 table 大小的两倍多,而 solr 索引仅为 DB 大小的 8%。 当我们使用 logstash 输出文件中的数据时,速度非常快。
这里我们配置了 elastic 的 logstash 的 jdbc 模块:
input {
jdbc {
jdbc_driver_library => "F:\elasticsearch-2.3.3\lib\sqljdbc_4.0\enu\sqljdbc4.jar"
jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc_connection_string => "jdbc:sqlserver://s_tkachenko\mssql2014:49172;databaseName=work"
jdbc_user => "sa"
jdbc_password => "__masked_password__"
statement => "SELECT id, name FROM Contact"
}
}
我们只设置了 1 个分片,没有副本。
亲爱的社区,也许您有任何建议,因为对弹性的支持只有在我们购买订阅后才会对我们有帮助。但是购买订阅的产品一点效果都不好,我认为这不是一个好主意。 感谢您的关注,等待您的想法。
- 我觉得1个分片太少了。根据您的硬件配置增加那个。
- 使elasticsearch使用一半内存:https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html#_give_less_than_half_your_memory_to_lucene
- 增加刷新间隔(默认:1s):
index.refresh_interval: 30s
- 增加索引缓冲区(默认值:%10):
indices.memory.index_buffer_size: 30%
同时您也可以在 logstash 中进行一些更改:
- 指定工人数:-w {WORKER_COUNT}。 cpu count * 2 在我的实验中是最好的。
- 指定缓冲区大小:-u {BUFFER_SIZE}。 512 最适合我。
您还可以为 elasticsearch 输出插件指定输出工作器计数和刷新缓冲区:
output {
elasticsearch {
# elasticsearch hosts
hosts => ["127.0.0.1"]
# bulk message size
flush_size => 512
# output worker cpu core * 2
workers => 8
}
}
希望其中的一些帮助。