Elasticsearch运维最佳实践

一、集群规划与部署

1. 节点角色规划

主节点(Master-eligible Nodes)

  • 数量:3个或5个专用主节点,避免偶数个
  • 配置:node.master: truenode.data: false
  • 资源:2-4核CPU,4-8GB内存,SSD存储

数据节点(Data Nodes)

  • 数量:根据数据量和查询负载确定
  • 配置:node.master: falsenode.data: true
  • 资源:8-16核CPU,32-64GB内存,SSD存储(建议每个节点20-50GB数据)

协调节点(Coordinating Nodes)

  • 数量:2-4个,处理客户端请求
  • 配置:node.master: falsenode.data: false
  • 资源:4-8核CPU,8-16GB内存

2. 分片策略

  • 主分片数量:创建索引时确定,后续不可修改
  • 建议配置:每个主分片20-50GB,总数据量/50GB = 主分片数
  • 副本分片:生产环境至少1个副本,高可用场景2个副本
  • 分片分配:避免单个节点分片过多(建议每个节点500-1000个分片)

3. 网络配置

# 绑定所有网络接口
network.host: 0.0.0.0

# 设置专用传输端口
transport.port: 9300

# 节点发现配置
discovery.seed_hosts: ["node1:9300", "node2:9300", "node3:9300"]
cluster.initial_master_nodes: ["node1", "node2", "node3"]

二、性能优化

1. JVM堆内存配置

  • 堆内存大小:不超过物理内存的50%,且不超过32GB(建议8-16GB)
  • 配置位置config/jvm.options
  • 示例-Xms8g -Xmx8g

2. 索引生命周期管理(ILM)

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_size": "50gb",
            "max_age": "7d"
          }
        }
      },
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

3. 写入性能优化

  • 批量写入:使用_bulk API,批量大小建议5-15MB
  • Refresh间隔:写入高峰期设置为-1,写入完成后手动refresh
  • 副本数调整:写入时临时设置为0,写入完成后恢复
  • 段合并优化:避免在写入高峰期执行force merge

4. 查询性能优化

  • 使用filter查询:不计算相关性得分,可缓存
  • 避免深度分页:使用search_after替代from/size
  • 字段过滤_source只返回必要字段
  • 索引设计:合理使用keyword类型,避免text字段的复杂分析

三、监控与告警

1. 关键监控指标

集群健康

  • 集群状态:green/yellow/red
  • 未分配分片数量
  • 节点数量变化

节点资源

  • CPU使用率(<80%)
  • 内存使用率(<85%)
  • 磁盘使用率(<85%)
  • JVM堆内存使用率(<75%)

索引性能

  • 索引写入速率
  • 查询响应时间(P95 < 100ms)
  • 段数量(避免过多小段)

2. 监控工具

  • Elasticsearch内置监控:Stack Monitoring
  • Prometheus + Grafana:自定义监控面板
  • Metricbeat:采集系统指标
  • Kibana:可视化监控仪表板

3. 告警配置

PUT _watcher/watch/cluster_health
{
  "trigger": {
    "schedule": {
      "interval": "1m"
    }
  },
  "input": {
    "http": {
      "request": {
        "host": "localhost",
        "port": 9200,
        "path": "/_cluster/health",
        "scheme": "http"
      }
    }
  },
  "condition": {
    "compare": {
      "ctx.payload.status": {
        "not_eq": "green"
      }
    }
  },
  "actions": {
    "email_alert": {
      "email": {
        "to": "admin@example.com",
        "subject": "集群状态异常",
        "body": "集群状态:{{ctx.payload.status}}"
      }
    }
  }
}

四、高可用与备份

1. 集群高可用

  • 主节点选举:配置discovery.zen.minimum_master_nodes: (master_nodes/2 + 1)
  • 数据副本:至少1个副本,跨机架/可用区部署
  • 节点故障检测:配置discovery.zen.fd.ping_timeout: 30s

2. 快照与恢复

创建快照仓库

PUT _snapshot/my_backup
{
  "type": "fs",
  "settings": {
    "location": "/mnt/backups/elasticsearch",
    "compress": true
  }
}

创建快照

PUT _snapshot/my_backup/snapshot_1
{
  "indices": "index1,index2",
  "ignore_unavailable": true,
  "include_global_state": false
}

恢复快照

POST _snapshot/my_backup/snapshot_1/_restore
{
  "indices": "index1,index2",
  "ignore_unavailable": true,
  "include_global_state": false
}

3. 跨集群复制(CCR)

PUT _ccr/follow/follower_index
{
  "remote_cluster": "remote_cluster",
  "leader_index": "leader_index",
  "settings": {
    "index.number_of_replicas": 0
  }
}

五、安全配置

1. 安全功能开启

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.enabled: true

2. 用户认证

# 设置内置用户密码
./bin/elasticsearch-setup-passwords interactive

# 创建自定义用户
POST /_security/user/john
{
  "password": "password123",
  "roles": ["superuser"],
  "full_name": "John Doe",
  "email": "john@example.com"
}

3. 权限控制

PUT /_security/role/my_role
{
  "cluster": ["monitor", "manage"],
  "indices": [
    {
      "names": ["my_index"],
      "privileges": ["read", "write"]
    }
  ]
}

六、故障排查

1. 常见问题处理

集群状态yellow/red

  • 检查节点是否正常加入集群
  • 检查分片分配状态:GET _cluster/allocation/explain
  • 检查磁盘空间是否充足

写入性能下降

  • 检查refresh间隔设置
  • 检查段合并是否频繁
  • 检查磁盘IO性能

查询超时

  • 检查查询语句复杂度
  • 检查分片数量是否过多
  • 检查协调节点负载

2. 日志分析

  • Elasticsearch日志logs/elasticsearch.log
  • 慢查询日志:开启index.search.slowlog.threshold.query.warn
  • GC日志:分析JVM垃圾回收情况

3. 诊断工具

# 查看集群健康
GET _cluster/health

# 查看节点信息
GET _cat/nodes?v

# 查看索引状态
GET _cat/indices?v

# 查看分片分配
GET _cat/shards?v

# 查看任务队列
GET _cat/tasks?v

七、版本升级

1. 升级前准备

  • 备份所有数据
  • 阅读版本升级说明
  • 测试环境验证升级流程
  • 准备回滚方案

2. 滚动升级步骤

  1. 禁用分片分配:PUT _cluster/settings {"persistent": {"cluster.routing.allocation.enable": "none"}}
  2. 停止一个节点,升级并重启
  3. 启用分片分配:PUT _cluster/settings {"persistent": {"cluster.routing.allocation.enable": "all"}}
  4. 等待集群状态恢复green
  5. 重复步骤1-4升级其他节点

3. 升级后验证

  • 检查集群状态
  • 验证数据完整性
  • 测试查询和写入功能
  • 监控系统性能

通过遵循这些最佳实践,可以构建稳定、高性能的Elasticsearch集群,满足生产环境的业务需求。

作者:严锋  创建时间:2025-12-22 21:07
最后编辑:严锋  更新时间:2025-12-25 10:39