面试题答案
一键面试1. 数据副本机制
- 副本类型:Elasticsearch 中有主副本和副本两种类型。主副本负责处理写操作,副本则是主副本的拷贝,用于提供高可用性和读取负载均衡。每个索引可以定义多个主副本和副本。例如,创建索引时可指定
number_of_shards
(主副本数)和number_of_replicas
(副本数)。 - 数据同步:主副本处理写入请求后,会将数据变更同步到副本。采用的是一种基于日志的复制机制,主副本将写操作记录在事务日志(translog)中,然后通过内部的复制协议将这些操作发送到副本。副本在接收到操作后,按照相同顺序应用这些操作,从而保持与主副本的数据一致。
2. 故障检测与选举机制
- 故障检测:Elasticsearch 集群中的节点通过定期发送心跳包(ping)来检测彼此的状态。如果一个节点在一定时间内没有收到来自另一个节点的心跳响应,就会认为该节点发生故障。这个时间间隔可以通过配置参数
discovery.zen.ping_timeout
进行调整,默认是 3 秒。 - 选举机制:当主节点发生故障时,集群需要选举出新的主节点。选举过程基于 Quorum 机制,只有超过半数的节点可用时,选举才能成功。例如,对于一个由 5 个节点组成的集群,至少需要 3 个节点可用才能进行选举。选举算法会选择具有最高版本号且具有足够资格(如
node.master: true
配置)的节点作为新的主节点。新主节点选举出来后,会负责协调数据的恢复和一致性维护。
3. 数据恢复策略
- 基于事务日志恢复:故障节点恢复后,Elasticsearch 会根据事务日志(translog)进行数据恢复。由于主副本在故障前将写操作记录在事务日志中,恢复时会从该日志中读取未完成的操作,并重新应用到数据存储中。这确保了故障期间丢失的写操作能够被重新执行,从而保证数据的一致性。
- 副本同步恢复:在主节点故障期间,如果有副本节点能够继续提供服务,当新主节点选举出来后,新主节点会协调副本节点之间的数据同步。副本节点会将自身的数据状态与新主节点进行比对,新主节点会根据各副本节点的数据情况,选择一个作为基准副本,然后其他副本节点从基准副本同步缺失的数据,以达到数据一致性。
4. 一致性控制策略
- 写一致性级别:Elasticsearch 提供了不同的写一致性级别来控制数据写入的一致性。可以通过
consistency
参数指定,常见的级别有one
(默认,只要主副本写入成功即认为写入成功)、quorum
(需要超过半数的副本写入成功才认为写入成功)和all
(需要所有副本写入成功才认为写入成功)。例如,在进行索引操作时,可以设置consistency: quorum
,这样可以在一定程度上保证数据的一致性,因为只有多数副本写入成功,写操作才会被确认。 - 版本控制:Elasticsearch 为每个文档维护一个版本号。每次文档更新时,版本号会递增。在写操作时,客户端可以指定期望的版本号,如果当前文档的版本号与客户端指定的版本号不一致,写操作会失败。这可以防止并发写操作导致的数据覆盖问题,确保数据的一致性。例如,在更新文档时,可以带上
version
参数,Elasticsearch 会在执行更新前验证版本号。