面试题答案
一键面试索引设置策略及原理
- 索引分片策略
- 原理:Elasticsearch将索引数据分布到多个分片上,每个分片是一个独立的Lucene索引。在高并发读写且数据量大时,合理设置分片数能有效提升性能。过多分片会增加管理开销,过少则无法充分利用集群资源。
- 策略:根据预估数据量和集群规模设置分片数。一般来说,初期可参考经验值,如每个分片存储5 - 50GB数据,再根据实际运行情况调整。例如,预计数据量为500GB,可先设置10 - 100个分片。同时,监控集群资源(CPU、内存、I/O),如果发现某个分片负载过高,考虑增加分片。
- 副本策略
- 原理:副本是分片的拷贝,主要用于高可用和负载均衡。读请求可由副本分担,提高读取性能。
- 策略:根据读写比例设置副本数。读多写少场景下,适当增加副本数,如2 - 3个副本。但副本过多会占用更多磁盘空间,写操作时也需要同步到所有副本,影响写性能。所以写操作频繁时,副本数可设为1个,以保障写性能。
- 索引映射策略
- 原理:索引映射定义了文档的字段如何存储和索引。合理的映射能减少存储开销,提升查询性能。
- 策略:
- 数据类型选择:选择最紧凑的数据类型。例如,对于固定范围的整数,使用合适的整数类型(如
byte
、short
)而非long
。对于日期,使用date
类型而非字符串。 - 动态映射调整:在高并发写入时,动态映射可能导致性能问题。可事先定义好映射,避免动态映射在运行时频繁调整。对于不需要索引的字段,设置
index: false
,减少索引开销。
- 数据类型选择:选择最紧凑的数据类型。例如,对于固定范围的整数,使用合适的整数类型(如
- 索引刷新策略
- 原理:Elasticsearch默认每秒刷新一次,将内存中的数据写入磁盘,这会生成新的段并打开供搜索使用。刷新频率影响数据一致性和写性能。
- 策略:写操作频繁时,适当降低刷新频率,如设置为每5 - 10秒刷新一次,减少I/O操作,提升写性能。但这会导致数据一致性延迟增加,需在性能和一致性之间平衡。可在业务允许的情况下,批量写入数据后手动触发刷新。
- 索引合并策略
- 原理:Lucene底层通过段合并来优化存储和查询性能。小的段合并成大段,减少段数量,降低查询时的文件句柄开销和I/O操作。
- 策略:调整合并策略相关参数,如
index.merge.policy.max_merge_at_once
控制一次合并的最大段数。在数据写入稳定期,适当增大该值,加快合并速度,提升查询性能。但在数据写入高峰期,应避免过大值导致I/O压力过大。