elasticsearch日常维护
如果es出现问题首先进行性能排查(使用压力)
1.性能监控
性能方面压力来自于查询和写入两个方面
对查询和写入进行监控
首先要获取系统写入和查询的最大值,进行压测获取
日常监控:
1)采用es自带的参数进行获取,没有直接获取的api,通过计算进行获取,保留历史数据
#encoding:utf-8
import time
from execute_log import log_operator
from elasticsearch import Elasticsearch from elasticsearch import helpers from elasticsearch import ElasticsearchException
#存储每个集群中每个索引的名称与mapping 用于初始化数据 此处用来获取集群中有效的Index (也可以用集群自带api获取全部索引) from common_search import api_index_init import config import json ACCESS_STATUS = 1 index_search = api_index_init.getIndex() index_info = config.Connection.INDEX_ADDRESS
#初始化es链接 es = Elasticsearch(list(index_info),sniff_on_start=True,sniff_on_connection_fail=True,sniffer_timeout=5) index_list = index_search.getAllIndex() for index_name in index_list: try: result = es.indices.stats(index_name)
#获取es的一些参数 当前查询总量;当前查询的累积时间;当前正在进行的查询 query_total = long(result['indices'][index_name]['primaries']['search']['query_total']) query_time = long(result['indices'][index_name]['primaries']['search']['query_time_in_millis']) current_query = long(result['indices'][index_name]['primaries']['search']['query_current']) if current_query != 0: print result['indices'][index_name]['primaries']['search'] print index_name,current_query
#获取上一分钟的以上三个参数(每次写入进行存储) 进行相减 可以获取到在过去一分钟内执行的查询 exist_result = es_class.getRecordId(index_name) if exist_result['status'] != ACCESS_STATUS: record_dict = {"last_search_total":query_total,"index":index_name,"last_search_time":query_time,"search_now":0,\ "search_now_time":0,"current_search":current_query} # print es_class.insert("insert",index_name,record_dict) else: before_row = exist_result['data']['hits']['hits'][0]['_source'] last_search = int(before_row['last_search_total']) last_time = int(before_row['last_search_time']) search_now = query_total - last_search search_now_time = 0 if query_time > last_time: search_now_time = search_now/(query_time-last_time) gap_time = int(time.time()) - int(before_row['modify_time']) record_dict = {"last_search_total":query_total,"last_search_time":query_time,"search_now":search_now,"search_now_time":search_now_time,"gap_time":gap_time,\ "search_per_se":int(search_now/gap_time),"current_search":current_query} # es_class.update(index_name,record_dict) except: continue
通过以上方法可以得到一个过去一分钟内的查询qps平均值(所有索引qps相加),以及查询量最大的索引
可用这种方法对es查询进行监控
由以上方法同样可以对写入进行监控
将api中的search改成indexing/index即可 就可以得到es的写入并发
如果发现查询或者写入突增造成性能问题 可以首先对查询进行缩短或者写入缩短
2.机器负载问题
如果不是查询和写入暴增造成的性能问题,问题就很可能是机器负载造成的,在一个集群中如果某台机器负载过高就会造成改节点脱离集群的现象,造成集群不稳定,所以设置分片可以尽可能的将分片平均的落在各台机器上。
可以对集群中机器的各项指标进行对比,比如内存、网络传输、cpu使用率等,解决方法就是如果发现某节点负载过高 就将改节点上的主分片转移到负载较低的集群上,根据数据量和使用量对分片进行合理分配。
如果节点各项指标使用率都较低,可以进行网络排查,可能是网络问题。
3.其他
1)数据量:集群数据量过大会造成集群异常恢复缓慢的情况,所以针对数据量特别大的索引可以进行拆分或者将历史数据转移到mysql,尽量避免不使用数据存储在es中,可以定期对es进行数据删减
2)查询:es查询返回数量有限制,如果业务突增可能造成数据无法返回完整(截断最大值)或者返回时间变长的情况,这种情况下需要对es的查询数量进行监控,超过阈值之后调整查询,尽量减少对业务的影响。