假设我有5个数据节点。然后我保存了一份Person
文件。现在有几个问题:
如何找到保存到保存文档的节点?
将一个Person
文档保存到具有两个副本的节点后,如何查询此Person
并获取哪个副本/节点得到的答案来自哪个?
如何检查文档在节点的两个副本中的可用速度?
修改
用例如下: 一般来说,如果主分片已写入新数据但数据尚未与副本同步,如何确保一致性。同时,正在查询副本以查找在查询副本时仅在主分片处出现的新数据。我几乎想知道 DETAILS 在最后一段of the distributed read documentation ===>中描述的情况的一致性。另一方面但 here the doc says about query phase查询每个主要副本和副本并构建稍后合并的优先级队列,因此主要分片的结果将包含在基于全局排序结果集的合并队列构建协调节点上的所有优先级队列。
换句话说。
我想确保整个分布式ES集群的数据一致性。现在我想测试是否可以发生以下情况。假设我有一个包含5个节点的集群,并且数据只放在一个节点上(例如node2
带有主要分片)。在数据有时间复制到剩余的副本之前,我向node3
查询了这个新数据,理论上它应该具有数据的副本,但在node2
之后还没有得到它。变了因此,在这种情况下,向请求新数据的node3
提交的查询将不会返回新数据,即使它们已被放入“节点2”。
node3
?答案 0 :(得分:2)
如何找到保存到保存文档的节点?
更正确的问题是文档保存到哪个分片,因为分片可以在群集中移动。您可以使用_search_shards
API并提供文档的ID:
GET /index/type/_search_shards?routing=4
将一个Person文档保存到具有两个副本的节点后,如何查询此Person并获取哪个副本/节点得到的答案来自哪个?
我认为你不能轻易做到。您可以降低slowlogs的阈值并检查搜索请求的特定fetch
阶段的slowlog文件,以查看某个节点是否记录该日志。如果您发现慢速日志中的fetch
意味着结果(如果它只是一个文档)来自该节点的分片。
如何检查文档在节点的两个副本中的可用速度?
从运行索引操作返回的响应时间是包含对分片的所有副本(主分区及其副本)的索引的响应时间:https://www.elastic.co/guide/en/elasticsearch/guide/current/distrib-write.html#distrib-write
如果可能发生这种情况,我如何控制复制阶段/状态,以便判断复制是否完成?
我认为您可以尝试使用consistency: all
(https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-consistency),这意味着仅当所有其他分片副本已将文档编入索引时,索引操作才会返回。但我不认为这会阻止在正确的时间对其中一个副本进行查询,该副本仍在从主数据库索引文档的过程中。
如何判断复制品是否与主要碎片一致,这是不是很困难。
我认为只有通过查询这两个碎片副本的数据,您才能看到副本是否未经同步。
如果我无法控制此复制流程和数据一致性,如何消除潜在的不一致性
如果您发现不一致,我认为唯一的选择是将副本计数设置为0(删除副本),然后再返回初始值。基本上,从主服务器重新创建副本。