MST

星途 面试题库

面试题:ElasticSearch索引创建与集群规划的关联实践

假设你正在为一个拥有高并发读写需求的大型电商项目设计ElasticSearch索引方案,结合集群规划,阐述如何创建索引以平衡负载、提高搜索响应速度,包括索引的分片、副本设置以及相关参数的考量。
33.5万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

索引分片设置

  1. 考量因素
    • 数据量:大型电商项目数据量庞大,需根据预估数据量确定分片数。若数据量增长快,应适当多分片,防止单个分片数据量过大影响性能。例如,若预计商品数据量达数十亿条,可考虑每个分片承载数百万条数据,根据总数据量计算合适分片数。
    • 硬件资源:每个分片会占用一定内存、磁盘等资源。要根据集群节点的硬件配置(如内存大小、磁盘I/O性能)来确定分片数,避免因分片过多导致资源紧张。
    • 查询模式:如果查询经常涉及大范围的全量数据扫描,较多分片可并行处理查询,提高响应速度;若查询多为单文档或小范围检索,过多分片可能增加查询开销。
  2. 设置建议: 开始可根据经验和预估数据量设置,如10 - 20个分片,后续根据实际运行情况和性能监控进行调整。比如,在项目初期,若有10亿商品数据,可先设置10个分片,每个分片承载1亿条数据左右,观察性能,若查询性能不佳,可适当增加分片数。

索引副本设置

  1. 考量因素
    • 高可用性:副本用于在节点故障时保证数据不丢失和服务可用性。对于大型电商项目,高可用性至关重要,可设置多个副本。但副本过多会占用大量存储空间。
    • 读性能:副本也可用于处理读请求,增加副本数能提高读负载能力。然而,副本同步会消耗网络和节点资源,影响写性能。
  2. 设置建议: 通常设置1 - 2个副本。如设置1个副本,可在保证一定高可用性和读性能提升的同时,尽量减少对写性能和存储空间的影响。若读请求压力极大,可考虑设置2个副本,但要密切监控集群资源使用情况。

相关参数考量

  1. refresh_interval
    • 含义:控制索引数据多久刷新到磁盘并对搜索可见,默认1秒。
    • 考量:对于高并发写的电商项目,若设置过短(如小于1秒),会频繁触发刷新操作,影响写性能;若设置过长,数据对搜索可见的延迟会增大。可根据业务需求适当调整,比如设置为5 - 10秒,在写性能和数据可见延迟间平衡。
  2. number_of_replicas_per_shard
    • 含义:每个分片的副本数设置。
    • 考量:要综合考虑高可用性、读性能和资源占用,按上述副本设置建议进行调整。
  3. index.routing.allocation.total_shards_per_node
    • 含义:限制每个节点上允许分配的总分片数(包括主分片和副本分片)。
    • 考量:根据节点硬件资源设置,防止单个节点负载过重。如每个节点内存为32GB,可根据经验和测试设置为30 - 50个分片,避免因分片过多导致内存溢出或I/O瓶颈。
  4. index.translog.durability
    • 含义:控制事务日志的持久化策略,有requestasync两种主要模式。request模式下每次写操作都同步持久化事务日志,数据安全性高但写性能略低;async模式按一定时间间隔异步持久化,写性能高但可能在故障时丢失少量数据。
    • 考量:对于电商项目,若对数据一致性要求极高,应选择request模式;若能接受一定程度的数据丢失以换取更高写性能,可考虑async模式,并合理设置异步持久化间隔(如50ms - 100ms)。

集群规划与索引创建结合

  1. 节点角色分配
    • 数据节点:负责存储和处理数据,应根据数据量和读写负载合理规划数据节点数量。对于高并发读写的电商项目,可增加数据节点以分散负载。
    • 协调节点:处理客户端请求,将请求分发到数据节点并合并结果。要保证协调节点有足够的资源(如高内存、高性能CPU)以应对高并发请求。
    • 主节点:管理集群状态,选举等操作。主节点应保持轻负载,避免处理过多数据相关操作,保证集群管理的稳定性。
  2. 索引创建与节点分布: 创建索引时,要根据节点角色和负载情况合理分布分片。例如,通过index.routing.allocation.awareness.attributes参数,根据节点的属性(如机架、机房等)分配分片,避免所有分片集中在少数节点上,实现负载均衡。同时,副本分片应尽量分布在不同节点上,以提高高可用性。如在多机架的集群环境中,将主分片和副本分片分配到不同机架的节点上,防止单个机架故障导致数据不可用。