概括
我们需要提高渗滤器性能(吞吐量)。
最有可能的方法是扩展到多台服务器。
问题
如何正确扩展?
1) 增加底层索引中的分片数量是否允许并行运行更多的渗透请求?
2) 如果 ElasticSearch 服务器只进行渗透,它需要多少内存?
拥有 2 台 4GB 内存的服务器还是一台 16GB 内存的服务器更好?
3) 拥有 SSD 会显着地帮助过滤器的性能,还是增加 RAM 和/或节点数量更好?
我们现在的情况
我们的工作索引中有 200,000 个查询(工作搜索提醒)。我们能够运行 4 个调用 percolator 的并行队列。每个查询能够在大约 35 秒内过滤 50 个作业的批次,因此我们可以过滤:
4 个队列 * 每批 50 个作业 / 35 秒 * 每分钟 60 秒 = 每分钟 343 个作业
我们需要更多。
我们的工作索引有 4 个分片,我们正在使用位于该工作索引之上的 .percolator。
硬件: 2 个处理器服务器,总共 32 个内核。32GB 内存。我们为 ElasticSearch 分配了 8GB RAM。
当 percolator 工作时,我上面提到的 4 个 percolation queue 消耗了大约 50% 的 CPU。
当我们尝试将并行渗透队列的数量从 4 个增加到 6 个时,CPU 利用率跃升至 75% 以上。更糟糕的是,percolator 开始因 NoShardAvailableActionException 而失败:
[2015-03-04 09:46:22,221][DEBUG][action.percolate][Cletus Kasady][jobs][3] 碎片多渗透失败 org.elasticsearch.action.NoShardAvailableActionException: [jobs][3] null
该错误似乎表明我们应该增加分片的数量并最终添加专用的 ElasticSearch 服务器(+ 稍后增加节点的数量)。