zabbix在运维方面的监控方法小结最后一次更新20211203

一些经典的运维问题:

1.配置文件中有空格,导致服务端下发的域名出现问题
2.修改数据库没有备份
3.修改dnspod问题,指向了错误的IP地址
4.时间不一致,需要重新设定时区
5.启动程序必须是最新版本,如:ps -ef|grep sdk-speech-1.1.1.jar
有可能没有杀死老版本的程序
6.ssl证书更换(cdn,slb,nginx,tomcat,haproxy,upyun,qiniu)
7.域名解析,经过通用高防以后无法获取客户端的真实IP地址,获取的全部是高防的IP地址
8.每个业务应用都需要至少双实例(避免单点问题)
slb,nginx,jar,redis,mysql
9.域名证书到期时间监控
10.网络问题
4G网络连接系统没有问题,发现wifi出现连接失败的问题
原因是wifi上有vpn,连接到了国外的服务器,同样的域名只是dnspod解析的地区不同分国内国外(国外服务器又没有添加cp的信息,导致认证失败)
11.mysql数据库utf8mb4编码,innodb数据库引擎,还有连接数,文件句柄
12.slb的安全ip添加
13.关键的域名需要判断是否解析到了正常的城市和国家(分国内、国外、港澳台线路,或者移动,联通线路等)

elk,hadoop集群的安全性,root密码,服务器权限
es的9200端口,9300端口


qps需要注意是否达到瓶颈

磁盘的吞吐量
# sar -n DEV 2 5 
Linux 2.6.32-431.11.29.el6.ucloud.x86_64 (rdp02_confluent)     12/26/2017     _x86_64_    (16 CPU)

11:17:44 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
11:17:46 PM        lo  41508.12  41508.12   7543.42   7543.42      0.00      0.00      0.00
11:17:46 PM      eth0   3872.08   1309.64   5181.46    183.86      0.00      0.00      0.00

IO监控分以下几个级别:
1、系统级别 ,iostat vmstat dstat
2、进程级别 iotop pidstat
3、业务级别 ioprofile
4、文件级别 lsof 
基本上可以完全定位到IO问题了

运维的原则:
列出计划方案并发出评审(具体实施方案,失败的回滚方案)
中间实施时的通知,并且在业务低峰进行
事后的观察(流量、资源使用),日志是否报错等


监控系统:
zabbix监控
阿里云监控
ucloud监控

资源监控
阿里云
ucloud
机房

报警通知人管理(不同级别报警人不一样,报警的方式短信,邮件,微信等)

每个服务都需要使用双份

使用阿里云和ucloud云监控报警
1.服务器硬件(cpu,磁盘,memory使用率)

  监控mysql的cpu占用率
  UserParameter=mysqlcpu,ps aux|grep "mysqld"|grep -v "grep"|awk '{sum+=$3}; END{print sum}'

2.带宽使用率
3.数据库rds使用率iops,connection,cpu,内存,空间

1.默认都安装zabbix系统硬件监控包括:
cpu 平均负载,idel小于10%报警
磁盘占用率
主机密码是否修改
是否重启、关机

内存小于10%,触发重启java的voice服务 haiwai

1.tcp端口监控
nmap aya3.chinasoft.com -p 6666 | grep -c open

2.响应时间

3.端口监控(nmap监控tcp或者udp端口)
流量告警,通过aliyun监控平台

ecs_InternetOutRateNew

4.对tcp连接数的监控
established个数大于8W
established个数小于100

5.对关键进程的个数监控如voice

6.对http服务的监控(阿里云和ucloud)

7.对集群状态的监控

8.对关键进程监控,进程挂掉重新启动
java出现内存溢出的监控
UserParameter=java_error,sudo /bin/find /home/chinasoft -name hs_err_pid*.log -o -name java_pid*.hprof -o -name jvm.log -o -name core.*|wc -l

9.redis的qps和cpu使用率内存使用率
mysql的磁盘空间,cpu,内存使用率,连接数使用率

10.监控log日志
# cat /usr/local/zabbix-agent/scripts/esb_status.sh 
#!/bin/bash  
# 日志文件目录  
path=/home/chinasoft/log/esbE001  
# 找到最新的日志文件名 ls -t 按照时间排序,最新的在上面  
esb_file=`ls -t "${path}" | head -1`  
  
fail_count=`tail -n 500 $path/${esb_file} |grep 'failure'|wc -l`  
echo $fail_count

11.关键的接口监控,如

12.dnspod解析监控(是否解析到了国内或者国外,需要判断)

13.数据库,redis还有应用是否在同一机房同一个局域网(如果跨机房影响性能,高并发可能会引发问题)

14.写脚本自动删除、清理日志、是否需要切割日志,统计日志等


关于终端自动触发执行action的配置:

Defaults:jenkins !requiretty
Defaults:zabbix !requiretty
zabbix ALL=(ALL) NOPASSWD: ALL


EnableRemoteCommands = 1
UserParameter=java_error,sudo /bin/find /data/chinasoft -name hs_err_pid*.log -o -name java_pid*.hprof -o -name jvm.log|wc -l
UserParameter=check_web1,curl -I -m 10 -o /dev/null -s -w %{http_code}"\n" http://yuyin.chinasoft.com:9999/check
UserParameter=check_port,nmap aya3.chinasoft.com -p 6666 | grep -c open

# 每分钟超时的次数
UserParameter=check_baidu,grep -a `date +%H:%M` /home/chinasoft/chinasoft-speech2/logs/all.log | grep '30000' | wc -l

UserParameter=check_port0,/usr/bin/python /usr/local/zabbix-agent/scripts/check_port.py
[root@u04mix03 ~]# cat /usr/local/zabbix-agent/scripts/check_port.py
#!/usr/bin/python

#coding=utf-8

import types
import urllib2
import json
import socket
html=urllib2.urlopen(r"http://u01.f.chinasoft.com/config_route?name=CT_ROOM&no=123")

hjson = json.loads(html.read())
#print hjson
ip = hjson["outside"]
port = hjson["port"]
#print ip
#print port

sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.settimeout(10)
try:
    sk.connect((ip,port))
    print 1
except Exception:
    print 2
sk.close()

# python脚本,agentd.conf要配置Timeout = 30
#encodig:utf-8

import requests
import json
try:
    r = requests.get('http://api.chinasoft.com:8199/api3?appId=100000&method=queryOnlineUser&roomId=100000&version=2&appKey=10d5aea05bef4f4ed988e1278b53ab5c', timeout = 10)
    r_json = json.loads(r.content)
    res = r_json.get('result',0)
    print res
except Exception as e:
    print 500

**********
监控语音超时,超过30000ms

UserParameter=check_log,grep "30000ms" /home/chinasoft/chinasoft-speech2/logs/all.log | wc -l

# 删除日志脚本
find /home/chinasoft/chinasoft_script_sdk/logs/bi -name "*.log.gz" -mtime +3 -exec rm -f {} \;
#!/bin/bash 
path1=/home/proxy/rtmpclient/Bin64/log

if [ -d $path1 ];then
    for file1 in `ls ${path}`;
    do
        if [ "${file1##*.}" == "log" ];then
            echo /dev/null >$path1/$file1
        fi
    done
fi

path2=/home/proxy/rtmpclient/Bin64/log

if [ -d $path2 ];then
    for file2 in `ls ${path2}`;
    do
        if [ "${file2##*.}" == "log" ];then
            echo /dev/null >$path2/$file2
        fi
    done
fi

path3=/home/proxy/chatroom/Bin64/log
if [ -d $path3 ];then
    for file3 in `ls ${path3}`;
    do
        if [ "${file3##*.}" == "log" ];then
            echo /dev/null >$path3/$file3
        fi
    done
fi


java的溢出文件jvm.log,触发脚本重启java服务

#!/bin/bash
for i in {/data/chinasoft/sdk_translator_speech,/data/chinasoft/chinasoft-speech2,/data/chinasoft/chinasoft-text2audio};do 
if [ -f $i/jvm.log ];then
    rm -f $i/jvm.log
    ps -ef|grep $i|grep -v grep|awk '{print $2}'|xargs kill -9
    sleep 2
    cd $i && /bin/bash start.sh start
fi
done

 

跳板机搭建在公司内部,通过跳板机管理国内和国外的服务器,因海外的服务器较多默认走香港线路
国内的服务器要设置定向路由

为了及时处理同事登录跳板机不能正常办公的问题,对跳板机和海外服务器的网络质量进行监控
动作可以触发报警,切换线路等操作,需要观察一段时间后作出处理

# 检查网络的ping值丢包率,如果大于50%触发报警
UserParameter=eus_pedb_net_loss,sudo /usr/local/fping/sbin/fping -p 100 -c 10 1.1.1.1 2>&1| tail -n 1 | awk -F ' ' '{print $5}'| cut -d '/' -f3 | cut -d '%' -f1
# 检查端口的可用性
UserParameter=pedbserver_sshport,/usr/bin/nmap 1.1.1.1 -p 2008 | grep -c open

监控nginx的访问日志出现 50x或者40x

UserParameter=nginx_access_50x,sudo /usr/bin/tail -n 500 /data/www/logs/nginx_log/access/www.chinasoft.com_access.log|awk '{print $1" "$10" "$11}'|grep 'HTTP/1.1" 50'|uniq|wc -l
UserParameter=nginx_access_40x,sudo /usr/bin/tail -n 500 /data/www/logs/nginx_log/access/www.chinasoft.com_access.log|awk '{print $1" "$10" "$11}'|grep 'HTTP/1.1" 40'|uniq|wc -l

 

触发器的另外一种编写方式:

UserParameter=chinasoft_api01_mm_node_8000,nmap 172.18.10.10 -p 8000 | grep -c open

# 连续5次的结果为1的次数都等于0,触发报警
{Template alisz_chinasoft_api_node:chinasoft_api01_mm_node_8000.count(#5,1,"eq")}=0

 

监控url的status代码另外的一种方式:通过shell命令 实现一个域名解析到不同的ip

# 监控url服务,中间要带端口,否则无法生效
UserParameter=chinasoft_ioweb01_mindmaps,res=`curl -I -m 10 --connect-timeout 10 -o /dev/null -s -w %{http_code}"\n" --resolve www.chinasoft.io:443:172.31.18.105 "https://www.chinasoft.io/mind-maps/"` && echo $res
UserParameter=chinasoft_ioweb02_mindmaps,res=`curl -I -m 10 --connect-timeout 10 -o /dev/null -s -w %{http_code}"\n" --resolve www.chinasoft.io:443:172.31.17.40 "https://www.chinasoft.io/mind-maps/"` && echo $res

# 监控3333 node端口
UserParameter=chinasoft_ioweb01_3333,res=`curl -I -m 10 --connect-timeout 10 -o /dev/null -s -w %{http_code}"\n"  "http://172.31.18.105:3333/mind-maps/"` && echo $res
UserParameter=chinasoft_ioweb02_3333,res=`curl -I -m 10 --connect-timeout 10 -o /dev/null -s -w %{http_code}"\n"  "http://172.31.17.40:3333/mind-maps/"` && echo $res

upstrem定义:
upstream chinasoft_node_servers{
        ip_hash;
        server 172.31.18.105:3333 max_fails=2 fail_timeout=30s weight=1;
        server 172.31.17.40:3333 max_fails=2 fail_timeout=30s weight=1;

        check interval=3000 rise=2 fall=5 timeout=1000 type=tcp port=3333;
        check_keepalive_requests 100;
}

        if ($http_user_agent ~ Ezooms) {
        return 403;
    }

    location ~ ^.*\.(htaccess|htpasswd|ini|sh)$ {
        deny all;
    }

nginx location部分
    location /mind-maps/ {
            proxy_pass http://chinasoft_node_servers;
        }

 

关于shell获取代码执行结果的处理

# vim /usr/local/zabbix_agents_3.2.0/scripts/apiservice_idserver_getid.sh 
#!/bin/bash

function idserver_status
{
    # 一定要加 2> /dev/null 否则当代码执行错误时是异常会导致 脚本没法继续执行,不能获取最终的状态码
    res=`/usr/local/php-7.2.24_fpm/bin/php /data/www/vhosts/apiservice.chinasoft.com/httpdocs/idgenerator/artisan idclientdemo 2> /dev/null` 

    start_str=${res:0:11}
    if [[ $start_str == 'string(399)' ]];then
        echo 200
    else
        echo 0
    fi
}

# 执行function
$1

 带密码验证的api接口验证功能

import requests
from requests.auth import HTTPBasicAuth

def ytcn_pixso_logstash():
    url='http://1.1.1.1:7001/'
    user='fic-logstash'
    password = 'pass'
    response = requests.get(url=url, auth=HTTPBasicAuth(user, password), timeout=10)
    if "ok" in response.text and response.status_code == 200:
        print(200)
    else:
        print(0)

 监控脚本

# vim /usr/local/zabbix_agents/scripts/api_monitor.py

#coding:utf-8
import requests
from requests.auth import HTTPBasicAuth
import sys
import json


'''
    last_modify: 20200213
    desc: 监控一些关键业务接口
'''


def alisz_api_chinasoft_login():
    params = {"mobile": "138xxxxxxxx", "password":"123", "password_is_md5":"false", "is_client":"python_script_monitor"}
    res = requests.post(url='https://api-alisz.chinasoft.com/v3/user/rpc/login', data=params, headers={'Content-Type':'application/json'},timeout=10)
    res_json=json.loads(res.content)
    r_status=res.status_code
    if r_status == 401 and res_json['code'] == 140013:
        print(200)
    else:
        print(0)


def cc_download_ws_cc_status():
    head_info = requests.head('https://cc-download.chinasoft.cc/cbs_down/download_new.php', timeout=15).headers
    res = requests.get('https://cc-download.chinasoft.cc/cbs_down/download_new.php', timeout=15)

    if "cc-cbs.chinasoft.cc/go.php" in head_info['Location'] and res.status_code == 200:
        print(200)
    else:
        print(0)

# 简单登录验证
def ytcn_pixso_logstash():
    url='http://1.1.1.1:7001/'
    user='fic-logstash'
    password = 'pass'
    response = requests.get(url=url, auth=HTTPBasicAuth(user, password), timeout=10)
    if "ok" in response.text and response.status_code == 200:
        print(200)
    else:
        print(0)

def main():
    monitor_api=sys.argv[1]
    # 用调用函数方法名的方式代替一个个的参数string传递
    eval(monitor_api)()

    #if monitor_api == 'alisz_api_chinasoft_login':
    #    alisz_api_chinasoft_login()
    #elif monitor_api == 'ori_downpool_ws_cc_status':
    #    ori_downpool_ws_cc_status()
    #elif monitor_api == 'cc_download_ws_cc_status':
    #    cc_download_ws_cc_status()
    #elif monitor_api == 'ytcn_pixso_logstash':
    #    ytcn_pixso_logstash()


if __name__ == "__main__":
    main()

# 调用方法
/usr/local/api_monitor_env/bin/python /usr/local/zabbix_agents_3.2.0/scripts/api_monitor.py crm_api_zendesk

# 监控项
UserParameter=api.status[*],/usr/local/api_monitor_env/bin/python /usr/local/zabbix_agents_3.2.0/scripts/api_monitor.py $1

root下切换其他用户执行命令

su apache -l -c '/usr/bin/pm2 restart templates-cn-max'

 

# 状态码探测脚本

#!/bin/bash
#
# 每3分钟探测一次 chinasoft.cn/user 状态码是否正常,如果不是200就重启程序,避免挂掉

# 连续探测5次,如果超过3次,不为200就重启
user_status_count=0
for i in {1..5};do
    proc_user_status=`curl -I -m 10 --connect-timeout 10 -o /dev/null -s -w %{http_code}"\n"  "http://172.18.10.137:1111/user/101101"`
    if [[ $proc_user_status -ne 200 ]];then
        user_status_count=$(($user_status_count + 1))
    fi
    echo "user_status_count=$user_status_count"
    sleep 1
done

echo "start user_status_count=$user_status_count"
if [[ $user_status_count -gt 3 ]];then
    su apache -l -c '/usr/bin/pm2 restart cnchinasoft_user'
fi


sleep 2

# 每3分钟探测一次 chinasoft.cn/templates 状态码是否正常,# 连续探测5次,如果超过3次不为200 就重启程序,避免挂掉

temp_status_count=0
for i in {1..5};do
    proc_status=`curl -I -m 10 -o /dev/null -s -w %{http_code}"\n" http://172.18.10.137:2233/templates/`
    if [[ $proc_status -ne 200 ]];then
        temp_status_count=$(($temp_status_count + 1))
    fi
    echo "temp_status_count=$temp_status_count"
    sleep 1
done

echo "start temp_status_count=$temp_status_count"
if [[ $temp_status_count -gt 3 ]];then
    su apache -l -c '/usr/bin/pm2 restart templates-cn-max'
fi

 1.编写脚本,监控进程,端口,对应的接口,如果挂了就重启程序
vim /usr/local/worksh/chinasoft_procss_mon.sh

#!/bin/bash
#
function chinasoft_migration(){

    migrate_num=`ps -ef|grep data-migration.chinasoft.nodejs|grep -v grep|grep -v monitor|wc -l`
    migrate_port=`netstat -tnlp|grep 3032|wc -l`
    status=`curl -I -m 10 --connect-timeout 10 -o /dev/null -s -w %{http_code}"\n"  "http://172.16.2.240:3032/pm2/list"`

    error_count=0
    if [[ $migrate_num -lt 2 ]];then
    error_count=`expr $error_count + 1`
    fi

    sleep 1
    
    if [[ $migrate_port -lt 1 ]];then
    error_count=`expr $error_count + 1`
    fi
    
    sleep 1

    if [[ $status -ne 200 ]];then
    error_count=`expr $error_count + 1`
    fi
    
    echo "error_count=${error_count}"

    if [[ $error_count -gt 3 ]];then
        su apache -l -c '/bin/bash /data/www/vhosts/services/data-migration.chinasoft.nodejs/shell/start.sh transfer prod'
    fi
}

function main(){
    echo "start chinasoft_monitor `date`" >> /tmp/monitor.txt
    chinasoft_migration
    echo "end chinasoft_monitor `date`" >> /tmp/monitor.txt
}


main

# 添加可执行权限
chmod +x /usr/local/worksh/chinasoft_procss_mon.sh

2.加入计划任务
# monitor
*/5 * * * * /bin/bash /usr/local/worksh/chinasoft_procss_mon.sh > /dev/null 2>&1

 

检查网站状态,如果超过3次不是200则重启nginx

[root@xx:~]# cat /usr/local/worksh/monitor_web_status.sh 
#!/bin/bash
# 
source /etc/profile

function web_status_check()
{
    counter=0
    web_status=`curl -s --connect-timeout 6 -m 4 -o /dev/null -w %{http_code} "https://www.xx.ai/app/pc/main/index"`
    if [[ $web_status != 200 ]];then
        counter=$(expr $counter + 1)
    fi

    sleep 2

    web_status=`curl -s --connect-timeout 6 -m 4 -o /dev/null -w %{http_code} "https://www.xx.ai/app/pc/main/index"`
    if [[ $web_status != 200 ]];then
        counter=$(expr $counter + 1)
    fi

    sleep 2

    web_status=`curl -s --connect-timeout 6 -m 4 -o /dev/null -w %{http_code} "https://www.xx.ai/app/pc/main/index"`
    if [[ $web_status != 200 ]];then
        counter=$(expr $counter + 1)
    fi
}

echo $counter
function nginx_test()
{

    echo "nginx_test  $counter"
if [[ $counter -ge 3 ]];then
    /usr/local/nginx/sbin/nginx -t
        status=$?
    echo $status
    if [ $status == 0 ];then
        echo "start web nginx reload !!!"
        /usr/local/nginx/sbin/nginx -s reload;
    else
        echo "web nginx configure error ... "
        exit 1
    fi

fi
}


function main()
{
    web_status_check
    nginx_test
}

main

# monitor web status every 6 minites
*/6     *       *       *       *     /bin/bash /usr/local/worksh/monitor_web_status.sh > /dev/null 2>&1

posted @ 2018-06-01 20:27  reblue520  阅读(1771)  评论(0编辑  收藏  举报