MST

星途 面试题库

面试题:ElasticSearch中PrimaryTerms和SequenceNumbers在数据一致性保障场景下的作用

在ElasticSearch的ElasticSearch SequenceIDs机制里,PrimaryTerms和SequenceNumbers是如何协同保障数据一致性的,请详细阐述。
13.0万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

1. 基本概念

  • PrimaryTerm
    • 它是一个自增的数字,每当主分片重新选举时就会递增。在Elasticsearch集群中,主分片负责处理文档的写入操作。当主分片发生故障,集群需要重新选举新的主分片时,PrimaryTerm会增加。这个概念类似于关系型数据库中的事务ID,但作用于分片层面。
    • 例如,假设当前主分片的PrimaryTerm为3,发生故障重新选举后,新的主分片PrimaryTerm会变为4。
  • SequenceNumber
    • 是一个单调递增的数字,每当在主分片上成功执行一次写操作(创建、更新、删除文档等),这个值就会增加。它用于标记每个写操作的顺序。每个文档在其元数据中都保存了对应的SequenceNumber。
    • 比如,第一次写入文档时SequenceNumber为1,第二次为2,以此类推。

2. 协同保障数据一致性的原理

  • 写入过程中的协同
    • 当客户端向Elasticsearch集群发送一个写请求到主分片时,主分片会将此次写操作对应的SequenceNumber和当前的PrimaryTerm记录下来,并随着写操作一起传播到所有的副本分片。
    • 例如,客户端发送一个创建文档的请求,主分片记录下当前的PrimaryTerm为5和SequenceNumber为10(假设当前是第10次写操作),然后将该文档以及这两个编号发送给副本分片。
  • 副本分片的处理
    • 副本分片接收到来自主分片的写操作及相关编号后,会首先检查PrimaryTerm。如果副本分片当前保存的PrimaryTerm小于主分片发送过来的PrimaryTerm,说明主分片已经更新换代,副本分片会丢弃之前保存的状态,并从主分片同步最新的数据。
    • 若PrimaryTerm一致,副本分片会检查SequenceNumber。如果接收到的SequenceNumber大于当前副本分片保存的最大SequenceNumber,说明这是一个新的写操作,副本分片会应用这个写操作,并更新自己保存的SequenceNumber。
    • 例如,副本分片当前PrimaryTerm为4,SequenceNumber为8,收到主分片的写操作,PrimaryTerm为5,SequenceNumber为10,它会先更新PrimaryTerm,然后丢弃当前状态同步数据。若PrimaryTerm也为5,但SequenceNumber为7,由于小于当前的8,会忽略此次操作(因为可能是重复的旧操作)。
  • 故障恢复时的协同
    • 当主分片发生故障,集群重新选举出新的主分片时,新主分片会携带一个更高的PrimaryTerm。
    • 副本分片在与新主分片同步数据时,通过比较PrimaryTerm和SequenceNumber,确保从新主分片获取到最新且完整的写操作,从而保证数据一致性。如果副本分片在故障期间有未完成的写操作,新主分片也会根据SequenceNumber来判断并处理这些情况,防止数据丢失或重复。
    • 比如,原主分片故障,新主分片选举出来,PrimaryTerm从3变为4。副本分片与新主分片同步,通过对比PrimaryTerm知道要进行数据同步,再根据SequenceNumber确定从哪里开始同步以及哪些操作已完成,避免数据不一致。