MST

星途 面试题库

面试题:ElasticSearch索引设置对性能影响之专家难度题

假设在一个复杂的多租户ElasticSearch环境中,不同租户的索引对读写性能有不同要求。请详细说明如何通过索引设置,如mapping参数、field data缓存等,来平衡各个租户的性能需求,并避免资源争用导致的性能问题。
23.5万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

1. Mapping参数优化

  • 字段类型选择
    • 对于数值型字段,在满足需求的前提下,尽量选择占用空间小的类型。例如,如果数据值范围在0 - 255之间,使用byte类型而不是integer类型。对于文本字段,若不需要全文搜索,使用keyword类型而非text类型,因为text类型会进行分词,占用更多资源。
    • 例如,对于租户A的订单金额字段,若金额范围在0 - 10000且不需要小数,可定义为short类型:
{
  "mappings": {
    "properties": {
      "order_amount": {
        "type": "short"
      }
    }
  }
}
  • 动态映射控制
    • 可以根据租户需求,关闭不必要的动态映射。对于数据结构相对固定的租户索引,禁用动态映射可避免意外字段被自动添加,从而节省索引资源。通过设置dynamic参数为false来关闭动态映射:
{
  "mappings": {
    "dynamic": false,
    "properties": {
      // 已定义的字段
    }
  }
}
  • 若只想允许特定类型的字段动态添加,可设置dynamicstrict,并通过dynamic_templates定义允许动态添加的字段规则。

2. Field Data缓存优化

  • 缓存配置
    • 对于读性能要求高且数据量相对稳定的租户索引,合理设置fielddata缓存。可通过修改elasticsearch.yml文件,调整indices.fielddata.cache.size参数,它可以设置为一个固定值(如10gb)或占堆内存的百分比(如30%)。
    • 例如,对于租户B的用户信息索引,读操作频繁,可将indices.fielddata.cache.size设置为20%
indices.fielddata.cache.size: 20%
  • 按需使用
    • 避免在不需要排序或聚合的字段上启用fielddata。因为fielddata在首次访问时会将磁盘数据加载到内存,这会消耗资源。对于租户C的日志索引,其中的日志详情字段一般不需要排序或聚合,不应对该字段启用fielddata

3. 索引设置以避免资源争用

  • 索引分片与副本
    • 根据租户数据量和读写需求分配分片和副本。对于读多写少的租户,可适当增加副本数来提高读性能,但要注意副本过多会增加写操作的负担。对于租户D,其数据量较大且读操作频繁,可设置较多的副本,如replicas: 3,同时根据数据量合理分配分片,如number_of_shards: 10
{
  "settings": {
    "number_of_shards": 10,
    "number_of_replicas": 3
  }
}
  • 对于写多的租户,减少副本数,同时确保分片数量足够以分散写压力。
  • 索引优先级
    • 可通过插件或自定义脚本实现索引优先级管理。对于性能要求高的租户索引,在资源有限时优先分配读写资源。例如,在使用elasticsearch - curator工具时,可以通过设置权重来控制索引的优先级,在资源紧张时,高优先级的租户索引能优先获取资源。

4. 资源隔离

  • 节点分配
    • 利用Elasticsearch的节点标签和索引分配过滤功能,将不同租户的索引分配到不同的节点或节点组。例如,对于对性能要求极高的租户E,可以为其单独划分一组高性能节点,并通过设置index.routing.allocation.require.tag参数将租户E的索引分配到这些节点上:
{
  "settings": {
    "index.routing.allocation.require.tag": "high_performance"
  }
}
  • 同时在节点启动时,通过node.attr.tag参数为高性能节点添加相应标签。
  • 资源限制
    • 使用操作系统层面的资源限制工具(如cgroups)或Elasticsearch的资源限制插件(如x-pack中的资源限制功能),为不同租户的索引进程设置CPU、内存等资源的使用上限,防止某个租户过度占用资源影响其他租户。