Elasticsearch运维最佳实践
一、集群规划与部署
1. 节点角色规划
主节点(Master-eligible Nodes):
- 数量:3个或5个专用主节点,避免偶数个
- 配置:
node.master: true,node.data: false - 资源:2-4核CPU,4-8GB内存,SSD存储
数据节点(Data Nodes):
- 数量:根据数据量和查询负载确定
- 配置:
node.master: false,node.data: true - 资源:8-16核CPU,32-64GB内存,SSD存储(建议每个节点20-50GB数据)
协调节点(Coordinating Nodes):
- 数量:2-4个,处理客户端请求
- 配置:
node.master: false,node.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. 写入性能优化
- 批量写入:使用
_bulkAPI,批量大小建议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: true2. 用户认证
# 设置内置用户密码
./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. 滚动升级步骤
- 禁用分片分配:
PUT _cluster/settings {"persistent": {"cluster.routing.allocation.enable": "none"}} - 停止一个节点,升级并重启
- 启用分片分配:
PUT _cluster/settings {"persistent": {"cluster.routing.allocation.enable": "all"}} - 等待集群状态恢复green
- 重复步骤1-4升级其他节点
3. 升级后验证
- 检查集群状态
- 验证数据完整性
- 测试查询和写入功能
- 监控系统性能
通过遵循这些最佳实践,可以构建稳定、高性能的Elasticsearch集群,满足生产环境的业务需求。
作者:严锋 创建时间:2025-12-22 21:07
最后编辑:严锋 更新时间:2025-12-25 10:39
最后编辑:严锋 更新时间:2025-12-25 10:39