我有一个简单的设置,其中包含一个绿色集群(v7.5.2)的1个实例,其中1个索引(副本0)具有8个分片。
已索引61,500个文档。
如果我使用这些查询(POST查询)创建8个 slice

http://localhost:9202/products_dev/_search?scroll=10m: {'slice': {'field': 'created_at', 'id': 0, 'max': 8}, 'size': 1000}
http://localhost:9202/products_dev/_search?scroll=10m: {'slice': {'field': 'created_at', 'id': 1, 'max': 8}, 'size': 1000}
...
http://localhost:9202/products_dev/_search?scroll=10m: {'slice': {'field': 'created_at', 'id': 7, 'max': 8}, 'size': 1000}
对于每个 slice ,我收集每个 slice 的初次点击并获得这些长度:[1000, 0, 0, 0, 0, 0, 0, 0]仅1个 slice 的结果等于首先不对索引进行 slice 。
我用这些命令最多尝试了32个:
http://localhost:9202/products_dev/_search?scroll=10m: {'slice': {'field': 'created_at', 'id': 0, 'max': 32}, 'size': 1000}
http://localhost:9202/products_dev/_search?scroll=10m: {'slice': {'field': 'created_at', 'id': 1, 'max': 32}, 'size': 1000}
...
http://localhost:9202/products_dev/_search?scroll=10m: {'slice': {'field': 'created_at', 'id': 31, 'max': 32}, 'size': 1000}
对于每个 slice ,我收集每个 slice 的初次点击并获得这些长度:[1000, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 0, 0, 0]这样,我可以使用4个不同的(非空) slice 滚动索引,但是我不得不创建32个不理想的上下文。
我究竟做错了什么?
我试图将日期用作slice.field
"slice": {
        "field": "created_at",
但这没有帮助。

最佳答案

要添加更多信息和背景:
当您想水平扩展系统时,更多数量的主碎片会更有用,而当同一节点上有多个主碎片或在不同的物理节点上部署了主碎片时,如果在同一节点上存在足够的资源,则可以提高性能。 ,分片和副本被视为Elasticsearch的主干。
有关更多信息,请引用opster's shards and replicas guide;由于主要分片的配置不正确,请引用real time case-study,它们导致严重的性能和难以调试的问题。
而且在您的情况下,由于您没有太多数据,因此仅将其集中在几个分片上,如果您使用自己的路由算法,并且未将数据散布到所有分片中,则可能会发生这种情况(如果您选择了默认值)算法,那么您就不会有少数分片拥有所有数据,而其他分片只是空的情况,如您的响应所示。
请引用official Elasticsearch blog on routing the data efficiently,它将避免将来出现这些奇怪的问题,并且将对 flex 搜索如何决定哪个分片将保存数据提供很多很好的见解。

关于elasticsearch - Elasticsearch:将带有滚动条的api用作空切片,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62691510/

10-16 12:29