Elasticsearch集群运维实战:分片策略与索引生命周期管理ILM配置

Elasticsearch集群在日志和时序数据场景中,索引数量持续增长导致分片膨胀和查询性能下降。合理的分片策略和索引生命周期管理(ILM)是集群稳定运行的关键。Elasticsearch集群运维需要从分片数量规划、ILM自动滚动和集群均衡三个方面进行配置。

分片数量规划与mapping模板配置

分片数量在索引创建时设定且不可修改。分片过多导致集群元数据膨胀和搜索扇出开销,分片过少导致单分片体积过大、查询延迟升高。日志类数据按日滚动,每个索引分片数建议根据日数据量设定:日数据量50GB以下设1-2个分片,50-200GB设3-5个分片。

Index Template定义分片和mapping配置:

PUT _index_template/logs-app
{
  "index_patterns": ["logs-app-*"],
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 1,
      "refresh_interval": "30s",
      "index.lifecycle.name": "logs-ilm-policy",
      "index.codec": "best_compression"
    },
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "level": { "type": "keyword" },
        "service": { "type": "keyword" },
        "message": { 
          "type": "text",
          "analyzer": "ik_max_word",
          "fields": {
            "keyword": { "type": "keyword", "ignore_above": 256 }
          }
        },
        "trace_id": { "type": "keyword" },
        "duration_ms": { "type": "long" }
      }
    }
  },
  "priority": 200
}

refresh_interval设为30s降低索引刷新频率,写入吞吐量提升约40%(默认1s)。best_compression使用DEFLATE算法压缩存储,压缩率比默认LZ4高约25%,适合日志场景的冷数据。level和service字段设为keyword类型,支持精确聚合和term查询。message字段使用ik_max_word分词器支持中文分词,同时保留keyword子字段用于排序和聚合。

ILM索引生命周期策略与自动滚动

ILM(Index Lifecycle Management)将索引生命周期分为hot、warm、cold和delete四个阶段。hot阶段处理高频写入,warm阶段处理低频查询,cold阶段处理归档查询,delete阶段自动删除过期数据。

PUT _ilm/policy/logs-ilm-policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_age": "1d",
            "max_primary_shard_size": "30gb"
          },
          "set_priority": { "priority": 100 }
        }
      },
      "warm": {
        "min_age": "3d",
        "actions": {
          "shrink": { "number_of_shards": 1 },
          "forcemerge": { "max_num_segments": 1 },
          "set_priority": { "priority": 50 }
        }
      },
      "cold": {
        "min_age": "14d",
        "actions": {
          "freeze": {},
          "set_priority": { "priority": 0 }
        }
      },
      "delete": {
        "min_age": "30d",
        "actions": { "delete": {} }
      }
    }
  }
}

hot阶段触发rollover的条件为索引创建超过1天或主分片体积超过30GB,先到先触发。rollover后自动创建新索引,旧索引进入下一阶段。warm阶段执行shrink将3个分片合并为1个,减少集群分片总数。forcemerge合并为单个segment,减少文件句柄和查询扇出。cold阶段执行freeze将索引标记为只读并释放内存缓存。delete阶段在索引创建30天后自动删除。

使用rollover需要以别名方式写入数据,初始索引命名格式为logs-app-000001:

# 创建初始索引和别名
PUT logs-app-000001
{
  "aliases": {
    "logs-app-write": { "is_write_index": true }
  }
}

# 应用写入数据时使用别名
POST logs-app-write/_doc
{ "@timestamp": "2026-09-04T10:00:00Z", "level": "ERROR", "message": "数据库连接超时" }

集群分片均衡与节点角色分离

Elasticsearch 7.x以上版本支持节点角色分离,将master、data_hot、data_warm和data_cold节点分配到不同机器,避免混合部署时资源争抢。

# elasticsearch.yml - hot节点配置
node.roles: [data_hot, data_content, ingest]
cluster.routing.allocation.disk.watermark.low: 85%
cluster.routing.allocation.disk.watermark.high: 90%
cluster.routing.allocation.disk.watermark.flood_stage: 95%

# warm节点配置
node.roles: [data_warm]

# cold节点配置
node.roles: [data_cold]

data_hot节点使用SSD存储,处理高频写入和实时查询。data_warm节点使用HDD或大容量SSD,处理历史数据查询。data_cold节点使用对象存储或低成本HDD,仅处理低频归档查询。disk watermark设定磁盘使用率阈值,达到flood_stage时索引被标记为只读,防止磁盘写满导致集群宕机。

分片均衡监控方面,通过_cluster/health API查看集群状态:

GET _cluster/health
{
  "status": "green",
  "number_of_nodes": 6,
  "active_shards": 180,
  "relocating_shards": 0,
  "unassigned_shards": 0
}

relocating_shards表示正在迁移的分片数,ILM阶段转换或节点下线时该值大于0。unassigned_shards大于0表示有分片未分配,需检查节点磁盘空间和cluster.routing.allocation设置。通过_cat/shards?v查看各分片分布和体积,确认分片在hot/warm/cold节点间的迁移是否符合ILM策略。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/elasticsearch-ji-qun-yun-wei-shi-zhan-fen-pian-ce-lyue-yu/

(0)
小编小编
上一篇 1小时前
下一篇 1小时前

相关推荐