刚接触 Elasticsearch。我读了很多资料,但我希望 SO 上的专家能够评估我的集群配置,看看我是否遗漏了什么。
目前,我正在使用 ES (1.7.3) 为每个文件索引一些非常大的文本文件 (约 7 亿行),并希望每个文件都有一个索引。我使用 logstash (V2.1) 作为索引文件的首选方法。我的第一个索引的配置文件如下:
input {
file {
path => "L:/news/data/*.csv"
start_position => "beginning"
sincedb_path => "C:/logstash-2.1.0/since_db_news.txt"
}
}
filter {
csv {
separator => "|"
columns => ["NewsText", "Place", "Subject", "Time"]
}
mutate {
strip => ["NewsText"]
lowercase => ["NewsText"]
}
}
output {
elasticsearch {
action => "index"
hosts => ["xxx.xxx.x.xxx", "xxx.xxx.x.xxx"]
index => "news"
workers => 2
flush_size => 5000
}
stdout {}
}
我的集群包含 3 个在 Windows 10 上运行的盒子,每个盒子运行一个节点。ES 未作为服务安装,我只建立了一个主节点:
主节点:8GB RAM,ES_HEAP_SIZE = 3500m,单核 i7
数据节点 #1:8GB RAM,ES_HEAP_SIZE = 3500m,单核 i7
此节点当前正在运行 logstash 实例,LS_HEAP_SIZE= 3000m
数据节点 #2:16GB RAM,ES_HEAP_SIZE = 8000m,单核 i7
我目前将 ES 配置为每个索引默认 5 个分片 + 1 个重复。
目前,每个节点都配置为将数据写入外部硬盘并将日志写入另一个硬盘。
在我的测试运行中,我使用 Logstash 平均每秒处理 10K 个事件。我的主要目标是优化这些文件加载到 ES 的速度。根据我所读到的内容,我认为应该更接近 80K。
我尝试过改变工人数量和刷新大小,但似乎无法超越这个阈值。我想我可能忽略了一些基本的东西。
我的问题有两个:
1)我的集群配置中是否存在什么可疑之处,或者是否有一些可以改进该过程的建议?
2)如果我在每个数据节点上运行一个 logstash 实例来索引单独的文件,这会有帮助吗?
非常感谢您提前提供的所有帮助以及花时间阅读。
—津加
答案1
我的集群配置是否存在什么可疑之处,或者有什么建议可以改进这个过程?
我认为在主节点上运行 Logstash,这样它可以更好地利用其拥有的资源(RAM),而数据节点则主要负责在 ES 中进行索引。
您可能首先会受到 CPU 限制,但根据数据节点上磁盘的速度和类型,我可能错了。您提到您write data to an external HD
。如果它是通过 USB 连接的,它可能无法处理索引所有文档所需的高 IO 速率。
如果我在每个数据节点上运行一个 Logstash 实例并索引单独的文件,这会有帮助吗?
我不这么认为。你没有在 Logstash 中做很多工作(没有摸索,只有基本的变异),所以你最终会受到数据节点速度的限制,要求它们做比它们已经做的更多的事情很可能不会有帮助。
至于其他指针,也许可以尝试将分片数量减少到 3 个,并且不设置任何副本,因为这样可以稍微加快速度。索引完成后,您可以随时重新配置索引以设置副本。
最后,您应该在索引时观察系统的资源监视器,以了解哪些资源的负担最重(CPU、RAM、磁盘、网络?),努力解决瓶颈并重复,直到您对索引性能满意为止。