面试题答案
一键面试可能出现的一致性问题
- 脑裂问题:集群在网络分区等情况下,可能出现多个节点都认为自己是主节点的情况,从而导致数据不一致。例如,不同的主节点各自接收不同客户端的写请求,最终数据状态不一致。
- 数据同步延迟:由于网络波动、节点性能差异等原因,从节点同步主节点数据时可能存在延迟。在延迟期间,如果客户端读取从节点数据,可能获取到旧数据,导致读不一致。
- 写入冲突:多个节点同时接收到相同数据的写入请求,在数据同步过程中可能产生冲突,造成数据不一致。
ElasticSearch采用的策略和算法
- 脑裂问题解决策略
- 选举机制:采用基于Bully算法改进的选举算法。节点通过比较节点ID等因素,选出具有最高优先级的节点作为主节点。只有主节点能处理写操作,减少脑裂发生概率。
- 节点间通信和感知:节点之间通过ping机制保持心跳检测。如果网络分区恢复,旧的主节点发现新主节点已经产生,会自动降级为从节点,确保集群只有一个主节点。
- 处理数据同步延迟策略
- 副本同步机制:主节点在接收到写请求并成功写入后,会同步数据到副本节点。采用同步复制和异步复制相结合的方式。对于重要数据或对一致性要求高的场景,可采用同步复制,确保副本节点数据和主节点一致后才返回成功响应给客户端;对于一般场景,可采用异步复制提高写入性能,同时通过定期检查和修复机制保证最终一致性。
- 版本控制:每个文档都有版本号。当从节点同步数据时,会根据版本号判断数据是否为最新。如果版本不一致,从节点会重新获取最新版本数据,确保数据一致性。
- 解决写入冲突策略
- 乐观并发控制:ElasticSearch默认采用乐观并发控制。当写入数据时,会带上当前文档的版本号。如果版本号不一致,说明数据已被其他操作修改,写入请求会失败,客户端需要重新获取最新数据并进行修改后再次提交。
- 顺序保证:主节点按照请求顺序处理写操作,并同步给副本节点,确保所有节点上数据的修改顺序一致,避免因并发写入顺序不同导致的数据冲突。