假设我有5个数据节点。然后保存一个Person
文档。现在有几个问题:
-
我如何找到保存的文档保存到哪个节点?
-
将一个
Person
文档保存到具有两个副本的节点后,我如何查询此Person
并获取结果答案来自哪个副本/节点的信息? -
如何检查文档在节点的两个副本中可用的速度有多快?
编辑
用例如下:在主分片写入新数据但数据尚未与副本同步的情况下,如何确保一致性。同时在副本上查询在查询副本时只存在于主分片上的新数据。差不多我想知道关于细节的情况最后一段中描述的一致性的分布式阅读文档= = => , 另一方面这里的医生说查询阶段,每个主数据网格和副本查询和构建优先队列后合并,因此结果形式主碎片在全球被包括在合并基于队列的排序结果集构建协调所有优先级队列的节点。
- 问题X那么在搜索时是否返回主分片的独占文档,以防它没有被复制到剩余的副本?
换句话说。我想确保我的分布式ES集群的数据一致性。现在我想测试一下以下情况是否可以发生。假设我有一个有5个节点的集群,数据只放在一个节点上(例如,带有主分片的node2
)。在数据有时间复制到剩余的副本之前,我得到了对node3
的新数据的查询,理论上应该有数据的副本,但在node2
更改后还没有得到它。因此,在这种情况下,向请求新数据的node3
提交的查询将不会返回新数据,即使它们已被放置到'node2'。
- 问题A)如果这种情况可能发生,我如何控制复制阶段/状态,以便我可以判断复制是否完成?
- 问题B)我如何知道副本是否与主分片一致,以及它处于什么状态(副本的数据与主分片一致或不一致)?
- 问题C)如果我不能控制这个复制流和数据我如何消除查询中潜在的不一致致力于
node3
? - 问题D)我如何观察添加文档到主分片的行为,而不是将其存储在副本分片(例如,我可以减慢/自定义复制的时间,或者我可以测试这种行为以其他方式)?
如何找到保存的文档保存到哪个节点?
更正确的问题是文档保存到哪个分片,因为分片可以在集群中移动。您可以使用_search_shards
API并提供文档的ID:
GET /index/type/_search_shards?routing=4
我认为你做这件事不容易。您可以降低慢日志的阈值,并检查搜索请求的特定将一个Person文档保存到具有两个副本的节点后,我如何查询此Person并获取结果答案来自哪个副本/节点的信息?
fetch
阶段的慢日志文件,以查看某个节点是否记录了该慢日志。如果您在慢日志中发现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),这意味着只有当所有其他分片副本都索引了文档时,索引操作才返回。但我不认为这将阻止在正确的时间对副本之一进行查询,因为副本仍在从主数据库索引文档。
我怎么知道副本是否与主分片一致?这很难。
我认为只有通过查询这两个shard副本上的数据才能看到副本是否未同步。
如果我不能控制这个复制流和数据一致性,我怎么能消除潜在的不一致性
如果您注意到不一致,我认为唯一的选择是将副本计数设置为0(删除副本),然后返回到初始值。基本上,从主数据库重新创建副本。