elasticsearch,optimization,Node.js,Amazon Web Services,elasticsearch,Optimization" /> elasticsearch,optimization,Node.js,Amazon Web Services,elasticsearch,Optimization" />

Node.js 弹性搜索:了解如何优化写操作,以便读取isn';t撞击

Node.js 弹性搜索:了解如何优化写操作,以便读取isn';t撞击,node.js,amazon-web-services,elasticsearch,optimization,Node.js,Amazon Web Services,elasticsearch,Optimization,我们有一个NodeJS应用程序,它有一个弹性搜索后端,90%的时间都是很少使用的,偶尔也会被完全拒绝。例如,典型情况下,它可能在一小时内收到50-100个读取请求,以及1-2个写入请求。在高峰期,它可能会收到50000个读取请求和30000个写入请求 在这些高峰期,我们遇到了这样一种情况:有太多的写请求,需要重新编制索引,等等;甚至连读取请求都会爬行;这使得网站没有反应。要处理这种类型的负载,我们显然需要以某种方式优化弹性搜索或重新构建应用程序,我正在尝试找出最好的方法 我想更好地理解的是: 1

我们有一个NodeJS应用程序,它有一个弹性搜索后端,90%的时间都是很少使用的,偶尔也会被完全拒绝。例如,典型情况下,它可能在一小时内收到50-100个读取请求,以及1-2个写入请求。在高峰期,它可能会收到50000个读取请求和30000个写入请求

在这些高峰期,我们遇到了这样一种情况:有太多的写请求,需要重新编制索引,等等;甚至连读取请求都会爬行;这使得网站没有反应。要处理这种类型的负载,我们显然需要以某种方式优化弹性搜索或重新构建应用程序,我正在尝试找出最好的方法

我想更好地理解的是:

1) 写操作中发生了什么似乎会杀死一切,为了优化或加速写操作,有什么可用的方法

2) 我可以从代码的角度看,通过使用批量操作,我可以更快地插入更多记录,但我想知道弹性搜索索引的方式在系统上是否实际效率较低。如果我们放弃批量插入,或者至少使插入的大小更小,我是否应该看到显著更好的性能(特别是在读取方面)?任何有助于我理解这一变化可能对事情产生的影响的东西都会很有帮助

3) 是否存在划分读/写操作的方法,以便即使备份了写操作,读操作仍能继续工作

e、 g.我曾考虑使用消息队列而不是直接弹性搜索插入,但再次回到问题#2,我不确定如何优化该队列以使读取操作继续工作

e、 g.是否有办法将插入操作插入到不同的集群中,而不是读取,然后合并数据?这会更有效还是效率更低

谢谢你的帮助

  • 查看不同的-包括索引、搜索和批量。其思想是批量不应该阻止查询
  • 一定要使用批量请求-您将节省大量网络开销。但是,我们需要找到基准。如上所述,还可以找到一个合理的刷新间隔,尽管这是一个折衷方案,即在数据可搜索之前需要多长时间
  • 如果有基于时间的数据,可以尝试不同的节点类型。但是如果你所有的写和读都指向相同的索引,那你就倒霉了。目前无法将同一索引拆分为读节点和写节点
  • 对于队列来说,具有非常尖利的负载可能是一个很好的用例,但它增加了更多的运动部件和复杂性。根据您的情况,这可能是正确的选择,或者简单地为峰值负载过度提供Elasticsearch集群可能更便宜
  • 确保索引和碎片的数量正确。这适用于每个集群,但却是一个常见的痛点

  • PS:如果您发现任何调整建议,请确保它们适用于您的Elasticsearch版本。随着时间的推移,某些设置已更改或已完全删除。而且更多最新的Elasticsearch版本通常会表现更好-如果您不在最新的次要版本上

    您可以添加关于Elasticsearch集群的更多详细信息吗?有多少节点?有多少指数?引线节点(如果有)?碎片?副本?根据经验,使用
    \u bulk
    并增加
    刷新间隔
    这是同步内存和硬盘的间隔。如果您的数据与时间有某种关联,您可以测试
    热-温体系结构
    ,并使用“Curator感谢您的帮助”,我们将了解所有这些。