Elasticsearch
诊断集群的潜在问题
集群运维所面临的挑战
-
用户集群数量多,业务场景差异大
-
使用与配置不当, 优化不够
- 如何让用户 更加高效和正确的使用ES
- 如何让用户更全面的了解自己的集群的使用状况
-
发现问题滞后,需要防患于未然
- 需要“有迹可循”,做到“有则改之,无则加勉”
- Elastic 有提供Support Diagnostics Tool - https://gi thub. com/e lastic/ support-diagnostics
集群绿色,是否意味着足够好
- 绿色只是其中一项指标。 显示分片是否都已正常分配
- 监控指标多并且分散
- 指标的含义不够明确直观
- 问题分析定位的门槛较高
- 需要具备专业知识
为什么要诊断集群的潜在问题
- 防患于未然,避免集群奔溃
- Master节点/数据节点当机-负载过高,导致节点失联
- 副本丢失, 导致数据可靠性受损
- 集群压力过大, 数据写入失败
- 提升集群性能
- 数据节点负载不均衡 (避免单节点瓶颈) / 优化分片,segment
- 规范操作方式(利用别名/避免Dynamic Mapping 引发过多字段,对索引的合理性进行管控)
eBay Diagnostic Tool
-
集群健康状态,是否有节点丢失
-
索引 合理性
- 索引总数不能过大/副本分片尽量不要设置为0 /主分片尺寸检测/索引的字段总数(Dynamic Mapping关闭) /索引是否分配不均衡/索引segment 大小诊断分析
-
资源使用合理性
- CPU内存和磁盘的使用状况分析/是否存在节点负载不平衡/是否需要增加节点
-
业务 操作合理性
- 集群状态变更频率,是否在业务高峰期有频繁操作
- 慢查询监控 与分析
阿里云EYOU智能运维工具
每天凌晨定时诊断,也可以自主诊断。每次诊断耗时3分钟-
https://help. aliyun.com/document detail/90391 .html
解决集群Yellow与Red的问题
集群健康度
Health相关的API
案例1 症状:集群变红
- 分析:通过Allocation Explain API发现创建索引失败,因为无法找到标记了相应box type
的节点. - 解决: 删除索引,集群变绿。重新创建索引,并且指定正确的routing box type, 索引创建成
功。集群保持绿色状态
案例2 症状: 集群变黄
- 分析: 通过Allocation Explain API发现无法在相同的节点上创建副本
- 解决: 将索引的副本数设置为0,或者通过增加节点解决
分片没有被分配的一些原因
-
INDEX_ _CREATE:创建索引导致。在索引的全部分片分配完成之前,会有短暂的Red, 不一-定代表
有问,题 -
CLUSTER_ RECOVER:集群重启阶段,会有这个问题
-
INDEX_ REOPEN: Open一个之前Close 的索引
-
DANGLING_ INDEX_ _IMPORTED:一个节点离开集群期间,有索引被删除。这个节点重新返回时,会导致Dangling的问题
https://www. elastic. co/ guide/en/e last icsearch/ reference/7.1/cat-shards. html
常见问题与解决方法
-
集群变红,需要检查是否有节点离线。如果有,通常通过重启离线的节点可以解决问题
-
由于配置导致的问题,需要修复相关的配置(例如错误的box_ type, 错误的副本数)
- 如果是测试的索引,可以直接删除
-
因为磁盘空间限制,分片规则(Shard Filtering) 引发的,需要调整规则或者增加节点
-
对于节点返回集群,导致的dangling 变红,可直接删除dangling 索引
集群Red&Yellow问题的总结
demoAPI
#案例1
DELETE mytest
PUT mytest
{
"settings":{
"number_of_shards":3,
"number_of_replicas":0,
"index.routing.allocation.require.box_type":"hott"
}
}
# 检查集群状态,查看是否有节点丢失,有多少分片无法分配
GET /_cluster/health/
# 查看索引级别,找到红色的索引
GET /_cluster/health?level=indices
#查看索引的分片
GET _cluster/health?level=shards
# Explain 变红的原因
GET /_cluster/allocation/explain
GET /_cat/shards/mytest
GET _cat/nodeattrs
DELETE mytest
GET /_cluster/health/
PUT mytest
{
"settings":{
"number_of_shards":3,
"number_of_replicas":0,
"index.routing.allocation.require.box_type":"hot"
}
}
GET /_cluster/health/
#案例2, Explain 看 hot 上的 explain
DELETE mytest
PUT mytest
{
"settings":{
"number_of_shards":2,
"number_of_replicas":1,
"index.routing.allocation.require.box_type":"hot"
}
}
GET _cluster/health
GET _cat/shards/mytest
GET /_cluster/allocation/explain
PUT mytest/_settings
{
"number_of_replicas": 0
}