【发布时间】:2017-10-20 16:23:50
【问题描述】:
我们有一个带有 Elastic Search 后端的 NodeJS 应用程序,它 90% 的时间都非常轻松地使用,偶尔会被猛烈抨击。例如,在典型情况下,它可能在一小时内收到 50-100 个读取请求,以及 1-2 个写入请求。在高峰期,它可能会收到 50,000 个读取请求和 30,000 个写入请求。
在这些高峰时期,我们遇到了这样一种情况,即有太多的写入请求需要重新索引等;甚至读取请求都在爬行;这使网站无响应。为了处理这种类型的负载,我们显然需要以某种方式优化 Elastic Search 或重新构建应用程序,而我正在尝试找出最好的方法。
我想更好地理解的是:
1) 似乎会杀死所有内容的写入操作发生了什么,有什么可用于优化或加速该操作?
2) 从代码的角度来看,我可以通过使用批量操作更快地插入更多记录,但我想知道 Elastic Search 的索引方式是否实际上在系统上效率较低。如果我们摆脱批量插入,或者至少使插入的大小更小,我是否应该看到明显更好的性能(特别是在读取方面)?任何有助于我了解此更改可能会如何影响事物的内容都会有所帮助。
3) 有没有办法将读/写操作分开,这样即使写操作被备份,读操作仍然可以继续工作?
例如我正在考虑使用消息队列而不是直接 Elastic Search 插入,但再次回到问题 #2,我不肯定如何优化它以使读取操作继续工作。
例如有没有办法将插入插入到与读取不同的集群中,然后合并数据?这会或多或少有效吗?
感谢您的帮助。
【问题讨论】:
-
你能添加更多关于弹性搜索集群的细节吗?多少个节点?多少指数?领导节点,如果有的话?碎片?副本?
-
根据经验使用
_bulk并增加refresh interval这是同步内存和硬盘的间隔。如果您的数据与时间有某种关联,您可以测试hot-warm architecture并使用 `curator
标签: node.js amazon-web-services elasticsearch optimization