面试题答案
一键面试Prepare阶段
- 主要作用:
- 当一个索引请求到达Elasticsearch时,在prepare阶段,主分片会验证请求的有效性,例如检查文档格式是否正确,是否符合索引映射规则等。
- 主分片会为此次操作生成一个唯一的事务日志(Translog)记录,记录包含了要执行的操作详细信息,这一步确保操作有可靠的记录,即使后续出现故障也能恢复。
- 主分片将prepare请求并行发送到所有的副本分片。副本分片同样进行请求有效性验证,并生成对应的事务日志记录。
- 对数据一致性和可靠性的作用:
- 验证操作保证了只有合法的数据才会进入后续流程,避免因错误数据导致的数据不一致。
- 事务日志记录为数据恢复提供了依据,保证了即使系统崩溃,已prepare的数据也能恢复,从而保证数据可靠性。
- 主分片与副本分片同时prepare,使得主副本之间的数据状态在这一阶段保持同步,为最终一致性奠定基础。
Commit阶段
- 主要作用:
- 当所有副本分片都成功完成prepare阶段,主分片会进入commit阶段。主分片首先将内存中的数据刷新(flush)到磁盘上的段文件(Segment File)中,这一操作将数据持久化。
- 主分片更新文件系统缓存中的元数据,记录此次提交的相关信息,如段文件的新状态等。
- 主分片向所有副本分片发送commit请求,副本分片同样将内存数据刷新到磁盘段文件,并更新元数据。
- 对数据一致性和可靠性的作用:
- 数据持久化到磁盘段文件,保证了即使系统断电等故障,数据依然存在,大大提高了数据可靠性。
- 主副本同时commit,确保主副本之间的数据在持久化状态上保持一致,保证了数据的一致性。
- 更新元数据使得系统能够准确跟踪数据状态,为后续的读写操作提供准确的信息,进一步保障数据一致性。
协同保证数据一致性和可靠性
- prepare阶段的协同:主分片发起prepare请求,副本分片响应,只有当所有副本分片都成功prepare,才进入commit阶段,这保证了主副本在操作准备阶段的一致性。如果有副本分片prepare失败,主分片会放弃此次操作,避免数据不一致。
- commit阶段的协同:主分片完成commit后,通知副本分片commit,副本分片完成同样操作,使得主副本的数据持久化状态一致。这种两阶段的提交方式,通过prepare阶段的预检查和记录,以及commit阶段的最终持久化,有效地保证了数据在主副本之间的一致性,同时通过事务日志和数据持久化保证了数据的可靠性。