zabbix监控elasticsearch集群

今天同事负责的es集群发生了脑裂,具体原因还有待查看日志。
顺便分享一套zabbix监控es集群的脚本。

生产改进与建议:

  • 所有监控统一status值,比如0是ok的,1是警告,2是error
  • 因为es集群会自己维护整个集群的元数据,因此数据收集不是按节点来的而是整个集群
  • 现在的配置是从salt的pillar中获取端口(或者说集群名)然后渲染下面的脚本,然后再自动发现集群下面的节点。建议集群也使用脚本自动检查,特别是一个主机上有多个属于不同集群的es节点时。
  • es内部gc的平均时间没有计算出来,后期可以加
  • 最后还是脚本中要收集的数据还是用字符串的+,也在此收集更高效的处理方法

架构方面:

  • 初步估计es集群脑裂不外乎两个原因
    • 网络原因,适当调整es集群内节点发现超时时间
    • master节点和data节点混在一起,当data节点由于业务原因hang住时,可能会导致集群将此节点剔除,引起es集群重新选举。
  • 解决:
    • master节点和data节点分离,使用3个master节点,其余做data节点,master节点的jvm配置可以配置小一点。es集群的监控放在master节点上。
#!/usr/bin/env python
#coding:utf-8

from __future__ import division   #必须在第一行
import json,requests,sys,os
import pickle



#在os.popen中执行的时候\b要加一层\
#如果没有指定ip,就使用默认的,用系统命令抓取本地ip地址:
cmd = "ip addr|grep '\\binet\\b'|grep -E 'bond0|eth0'|awk '{print $2}'|awk -F'/' '{print $1}'"
local_ip = os.popen(cmd).read().strip()

#设置一个默认端口9200,这个后期使用自动发现比较好
local_port = 9200


def discovery(local_ip,local_port):
    r = {
   
   }
    r['data'] = []

    res = requests.get("http://{0}:{1}/_cat/nodes?v&h=name".format(local_ip,local_port))
    if res.status_code == 200:
        ret = res.text.splitlines()
        for i in range(1,len(ret)):
            r['data'].append({
   
   '{#NODE}':ret[i]})
    return json.dumps(r)


def send(local_ip,local_port):
    r_str = ""
    zbx_sender_cmd = "{0} -c {1} -i {2}"
    zbx_conf = "/usr/local/services/zabbix-3.0.0/etc/zabbix_agentd.conf"
    zbx_sender_file = "/tmp/.zbx_elastic_sender.txt"
    zbx_sender = "/usr/local/services/zabbix-3.0.0/bin/zabbix_sender"
    last_file = "/usr/local/services/zabbix-3.0.0/etc/.zbx_elstic_last_data.txt"

    #需要pickle保存到文件中的字典
    this_data = {
   
   }

    #导入历史数据
    if os.path.exists(last_file):
        with open(last_file,"r") as f1:
            last_data = pickle.load(f1)
    else:
        os.popen("touch /usr/local/services/zabbix-3.0.0/etc/.zbx_elstic_last_data.txt")
        last_data = {
   
   }
    #print(last_data)

    # 获取node信息的url
    url_node = "http://{0}:{1}/_nodes/stats?pretty".format(local_ip, local_port)
    res_node = requests.get(url_node)
    if res_node.status_code == 200:
        ret_node = res_node.json()
        for node,node_value in ret_node["nodes"].items():
            #print(ret_node["nodes"][node]["name"])  #打印出节点名字
            node_name = node_value["name"]
            this_data[node_name] = {
   
   }

            #需要获取docs,segments,get,search,merges,flush,warmer等信息
            #docs,segments
            r_str += "- elastic.indices.docs.count.[{0}] {1}\n".format(node_name,node_value["indices"]["docs"]["count"])
            r_str += "- elastic.indices.docs.deleted.[{0}] {1}\n".format(node_name, node_value["indices"]["docs"]["deleted"])
            r_str += "- elastic.indices.segments.count.[{0}] {1}\n".format(node_name, node_value["indices"]["segments"]["count"])
            r_str += "- elastic.indices.segments.memory.[{0}] {1}\n".format(node_name,node_value["indices"]["segments"]["memory_in_bytes"])

            #indexing,get,search
            indexing_num = node_value["indices"]["indexing"]["index_total"]
            indexing_time = node_value["indices"][
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值