面试题答案
一键面试1. 副本机制对数据一致性和探索效率的影响及优化
- 影响:副本数增加能提高数据可用性和一致性,但会增加写操作成本,降低写效率。因为每次写操作都要同步到多个副本。读操作时,副本可分担读压力,提高读效率。
- 优化配置:根据业务场景合理设置副本数。如果读多写少,可适当增加副本数,如设置
number_of_replicas: 2 - 3
;若写操作频繁,可减少副本数,如number_of_replicas: 1
。 - 实际案例:某新闻资讯平台,主要是用户浏览新闻(读多写少),将副本数从默认1调整为3后,读性能显著提升,平均响应时间从200ms降至150ms,且数据一致性有保障。
2. 刷新策略对数据一致性和探索效率的影响及优化
- 影响:Elasticsearch 的刷新(refresh)操作将内存中的数据写入磁盘段文件,使数据可被搜索。频繁刷新可保证数据一致性,但会增加 I/O 开销,降低写效率。
- 优化配置:
- 对于实时性要求不高的场景,可适当延长刷新间隔,通过
PUT /{index}/_settings
接口设置refresh_interval
参数,如{ "refresh_interval": "30s" }
,减少 I/O 操作,提高写效率。 - 对于实时性要求高的场景,可采用手动刷新,在批量写入数据后,执行
POST /{index}/_refresh
手动触发刷新。
- 对于实时性要求不高的场景,可适当延长刷新间隔,通过
- 实际案例:在一个日志收集系统中,日志数据的实时性要求不高,将
refresh_interval
从默认的1s调整为30s后,写性能提升了约30%,对数据探索的影响不大,因为用户通常查询历史日志。
3. 搜索类型对数据一致性和探索效率的影响及优化
- 影响:
- query - then - fetch:先在各个分片上执行查询,返回文档ID等元数据,再根据ID去相关分片获取完整文档。这种方式效率较高,但可能会有数据一致性问题,因为不同分片的数据可能不是完全同步的。
- dfs_query_then_fetch:在
query - then - fetch
基础上,先在各个分片计算文档的词频等统计信息,再执行查询和获取文档操作,数据一致性更好,但开销较大,效率相对低。
- 优化配置:
- 对于数据一致性要求不高,效率优先的场景,使用
query - then - fetch
搜索类型,如在一些模糊搜索、相关性要求不高的场景。 - 对于数据一致性要求高的场景,如精确统计、金融交易记录查询等,使用
dfs_query_then_fetch
搜索类型。
- 对于数据一致性要求不高,效率优先的场景,使用
- 实际案例:在电商平台的商品搜索中,普通商品搜索(模糊匹配)使用
query - then - fetch
,平均响应时间为100ms;而在库存查询(精确匹配)时使用dfs_query_then_fetch
,虽然响应时间为150ms,但保证了库存数据的一致性。
4. 综合优化策略
- 批量操作:使用批量 API(如
bulk
)进行数据写入,减少网络开销,提高写效率,同时也有助于保证数据一致性,因为批量操作是原子性的。 - 合理设置索引分片:根据数据量和节点数量合理设置分片数,避免分片过多或过少。分片过多会增加管理开销,过少会影响性能和扩展性。例如,预估数据量在100GB左右,可设置分片数为5 - 10个。
- 缓存策略:利用 Elasticsearch 的缓存机制,如请求缓存(request cache),对经常查询的结果进行缓存,提高查询效率。可通过
PUT /{index}/_settings
设置request.cache.enable: true
开启请求缓存。