MST

星途 面试题库

面试题:ElasticSearch通用选项API配置管理之复杂场景优化

在一个大规模的ElasticSearch集群中,有多个索引,不同索引有着不同的读写需求。请结合通用选项API,设计一套配置管理方案,能够在保证高可用性的前提下,最大程度地优化各个索引的读写性能,并且说明如何应对集群节点故障时配置的自动调整。
38.4万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

配置管理方案设计

  1. 索引级配置
    • 使用index.blocks.read_only_allow_delete属性:对于写入需求较低,读取需求高的索引,可以在业务低谷期,例如凌晨时段,将其设置为只读,使用PUT /{index}/_settings API 进行设置,如:
{
    "settings": {
        "index.blocks.read_only_allow_delete": true
    }
}
  • 调整index.refresh_interval:对于写入频繁但对实时性要求不高的索引,可以适当增大index.refresh_interval值,以减少段合并压力,提高写入性能。例如,将其从默认的1秒调整为5分钟:
{
    "settings": {
        "index.refresh_interval": "5m"
    }
}
  • 配置index.number_of_replicas:根据读负载情况,对于读需求高的索引,增加副本数。例如,从默认的1个副本增加到3个副本:
{
    "settings": {
        "index.number_of_replicas": 3
    }
}
  1. 节点级配置
    • 使用node.attr属性:通过elasticsearch.yml文件给不同节点设置属性,如node.attr.storage_type: high_speed用于标识具有高速存储的节点。然后在索引创建或设置时,使用index.routing.allocation.include.{attr_name}来指定索引应分配到哪些节点上。例如,对于写入性能要求高的索引,分配到具有高速存储的节点:
{
    "settings": {
        "index.routing.allocation.include.storage_type": "high_speed"
    }
}
  1. 集群级配置
    • 使用cluster.routing.allocation.cluster_concurrent_rebalance:调整集群重新平衡时允许并发移动的分片数量,防止集群在调整时性能过度下降。例如,将其设置为5:
{
    "persistent": {
        "cluster.routing.allocation.cluster_concurrent_rebalance": 5
    }
}
  • cluster.routing.allocation.node_concurrent_recoveries:设置每个节点上允许并发恢复的分片数量,同样为了控制集群在节点故障恢复等操作时的性能影响,例如设置为3:
{
    "persistent": {
        "cluster.routing.allocation.node_concurrent_recoveries": 3
    }
}

应对集群节点故障时配置的自动调整

  1. 自动分片重新分配:Elasticsearch 内置的自动分片分配机制会在节点故障时,自动将故障节点上的分片重新分配到其他健康节点上。通过合理配置上述集群级参数(如cluster.routing.allocation.cluster_concurrent_rebalancecluster.routing.allocation.node_concurrent_recoveries),可以控制重新分配过程对集群性能的影响。
  2. 动态调整副本数:可以通过监控工具(如Elasticsearch监控API或第三方监控工具)实时监测集群状态。当节点故障导致某些索引的副本数低于预期的高可用性水平时,使用API动态增加副本数。例如:
PUT /{index}/_settings
{
    "settings": {
        "index.number_of_replicas": {new_replica_count}
    }
}
  1. 重新分配索引到合适节点:在节点故障后,根据剩余节点的属性和负载情况,重新评估索引的分配。可以利用index.routing.allocation.includeexclude等属性,结合node.attr设置,通过API重新配置索引的分配规则,将索引移动到更合适的节点,以优化读写性能。例如:
PUT /{index}/_settings
{
    "settings": {
        "index.routing.allocation.include.storage_type": "high_speed"
    }
}