面试题答案
一键面试ElasticSearch的RPC保证数据一致性原理
- 副本机制:ElasticSearch采用多副本机制来保证数据一致性。每个索引的数据会被分成多个分片(shard),每个分片又可以有多个副本(replica)。当写入数据时,会同时写入主分片及其所有副本。通过这种方式,即使部分副本所在节点出现故障,数据依然可以从其他副本获取,保证数据的可用性和一致性。
- 版本控制:每次对文档的更新操作,ElasticSearch都会增加文档的版本号。在写入时,会携带当前文档的版本号,只有当版本号匹配时才会成功写入,防止数据冲突和覆盖,从而保证数据一致性。
- 一致性级别设置:ElasticSearch提供了不同的一致性级别,如
quorum
(默认)、one
、all
。quorum
要求在大多数分片副本(主分片 + 副本分片)成功写入后,才认为写入成功。这种方式平衡了写入性能和数据一致性。例如,假设有5个分片副本(1个主分片 + 4个副本分片),quorum
则要求至少3个分片副本写入成功。one
只需要一个分片副本写入成功即可,这种方式写入性能高,但一致性相对较弱。all
则要求所有分片副本都写入成功,一致性最强,但写入性能较低。
故障检测、隔离及恢复原理和过程
- 故障检测:
- 心跳机制:ElasticSearch节点之间通过定期发送心跳包来检测彼此的状态。每个节点会周期性地向集群中的其他节点发送心跳请求,若在一定时间内没有收到某个节点的心跳响应,则认为该节点可能出现故障。
- 节点状态监听:节点会持续监听集群状态的变化,当发现某个节点从集群状态信息中消失或处于异常状态时,也会触发故障检测。
- 故障隔离:
- 集群状态更新:当检测到节点故障时,ElasticSearch会更新集群状态,将故障节点标记为不可用,并从集群的节点列表中移除。同时,会重新计算分片的分布,确保集群的可用性和数据均衡。
- 流量控制:对于故障节点负责的请求,会自动被路由到其他正常节点。ElasticSearch的客户端和负载均衡器会根据最新的集群状态,将请求发送到可用的节点,避免向故障节点发送请求。
- 故障恢复:
- 副本提升:如果主分片所在节点故障,ElasticSearch会从该主分片的副本中选举出一个新的主分片。选举过程基于节点的优先级和版本号等因素,确保新主分片的数据是最新的。新主分片选举完成后,会开始接收读写请求,保证服务的连续性。
- 数据恢复:当故障节点恢复后,它会重新加入集群。此时,ElasticSearch会根据集群状态,将该节点缺失的分片数据从其他节点复制过来,恢复到故障前的状态。这个过程称为数据再平衡,通过数据再平衡,集群会重新达到数据均衡的状态。