一、监控目标
lvs的每秒会话连接数
lvs的每秒包转发数
lvs每秒转发带宽
VIP切换情况
keepalived进程的存活
二、zabbix_sender汇报脚本
主要汇报内容:
会话连接数,每秒包转发数,每秒转发带宽,VIP值
采用zabbix_sender+trapper的模式上报数据,在进一步探讨之前有必要先了解下什么是zabbix_sender+trapper模式 ,介绍如下:
用过nagios的人,应该知道nagios里有一个nsca_send程序,通过它将数据直接发送给monitor 监控端 ,同样,zabbix_sender的作用也一样,也是将数据发送给zabbix server ;而什么是trapper呢?tapper也称作zabbix捕捉器,用于捕获zabbix_sender发送的数据 。所以想要使用zabbix_sender + trapper 模式,首先要在zabbix服务器上必须有一个捕捉项目(即trapper item ),用于捕获sender过来的数据,这点也同nagios类似,需要在server端先要配置好cfg监控项,才能接收nsca_send发来的数据(总的来说所有,所有监控方式原理性的东西基本都是通的,像snmp也有trapper)
zabbix中zabbix_sender、trpper的配置方式如下:
1.zabbix_sender:在客户端,需要安装yum install zabbix-sender,安装完后在配置文件中配置SeverActive、Hostname这两项,具体看下面,两种模式区别的第二点
2.trapper:在服务端,创建模板、application后,创建item时,type选项这选择"trapper",其余选项都跟agent模式一样填就可以了
zabbix_sender+trapper模式与agent模式区别如下;
agent:服务器主动、客户端被动,客户端配置文件中只需配置"##### Passive checks related"下的"### Option: Server";
zabbix_sender+trapper:服务器被动、客户端主动,客户端配置文件中"##### Active checks related"下的"### Option:ServerActive"和"### Option: Hostname"都要配置,ServerActive配zabbix服务端的IP,Hostname配Zabbix服务端创建host的name;
另外:zabbix_sender 不依赖agent,也就是说zabbix_agent不启动,sender也可以发数据;
zabbix服务端的zabbix_get是依赖agent的
监控python脚本如下,格式未调整好
#!/usr/bin/env python
#coding=utf-8
#date 2015-7-8
#auth :yangr
#function:汇报lvs的相关状态,有每秒连接数,每秒转发数,VIP主从切换.每秒转发带宽
#lvs_conns_sec,lvs_packets_sec,keepalived_vip_status
import os,commands,sys,time
#变量定义----------------------
#从zabbix_agentd.conf中获取server IP或hostname
zabbix_agent_file='/etc/zabbix/zabbix_agentd.conf'
if not os.path.exists(zabbix_agent_file):
sys.exit(4)
zabbix_server=commands.getstatusoutput('''grep '^ServerActive' %s|awk -F[=] '{print $2}' '''%zabbix_agent_file)[1].strip()
zabbix_hostname=commands.getstatusoutput('''grep '^Hostname' %s|awk -F[=] '{print $2}' '''%zabbix_agent_file)[1].strip()
if not zabbix_server or not zabbix_hostname:
sys.exit()
zabbix_server_port=10051
timestamp = int(time.time())
keepalived_vip=['192.168.200.5'] #指定VIP
tmp_file_path='/tmp/lvs_status.txt' #指定监控值输出文件
#-------------------------
def monit_lvs():
#获取每秒包转发数
status,lvs_packets_sec=commands.getstatusoutput('''tail -1 /proc/net/ip_vs_stats | /usr/bin/awk '{print strtonum("0x"$1),strtonum("0x"$2), strtonum("0x"$3), strtonum("0x"$4),strtonum("0x"$5)}'|awk '{print $2}' ''')
#获取每秒转发的流量
status,lvs_bit_sec=commands.getstatusoutput('''tail -1 /proc/net/ip_vs_stats | /usr/bin/awk '{print strtonum("0x"$1),strtonum("0x"$2), strtonum("0x"$3),strtonum("0x"$4), strtonum("0x"$5)}'|awk '{print $4}' ''')
#获取lvs会话连接数
status,lvs_conns_sec=commands.getstatusoutput('wc -l /proc/net/ip_vs_conn')
#获取VIP状态,如值非0为master,为0则是backup,如果有变动,则进行了切换
status,lvs_keepalived_vip_status=commands.getstatusoutput('/sbin/ip addr |grep %s |wc -l'%keepalived_vip[0])
#如果本机有VIP,则取出VIP的最后一段十进制。
if int(lvs_keepalived_vip_status) != 0:
status,result_ip=commands.getstatusoutput(''' echo %s|awk -F '.' '{print $NF}' '''%keepalived_vip[0])
try:
lvs_keepalived_vip_status =int(result_ip)
except:
pass
#把 key值信息写到一个临时文件,格式为 hostname,key,timestamp,value
with open(tmp_file_path,'wb') as f:
f.write('%s %s %s %s\n'%(zabbix_hostname,'lvs_packets_sec',timestamp,lvs_packets_sec))
f.write('%s %s %s %s\n'%(zabbix_hostname,'lvs_bit_sec',timestamp,lvs_bit_sec))
f.write('%s %s %s %s\n'%(zabbix_hostname,'lvs_conns_sec',timestamp,lvs_packets_sec))
f.write('%s %s %s %s\n'%(zabbix_hostname,'lvs_keepalived_vip_status',timestamp,lvs_keepalived_vip_status))
if __name__=='__main__':
monit_lvs()
#把临时文件通过zabbix_sender命令发送到server端
send_data_cmd='/usr/bin/zabbix_sender -vv -z %s -p %s -T -i %s'%(zabbix_server,zabbix_server_port,tmp_file_path)
#print send_data_cmd
os.popen(send_data_cmd)
定时任务设置:
#crontab -l
#zabbix_sender汇报lvs的监控信息,每分钟1次
* * * * * /usr/bin/python /etc/zabbix/scripts/lvs_status_sender.py >> /var/log/crontab.log 2>&1
3、zabbix server端监控项配置:
lvs_packets_sec,
lvs_bit_sec,
lvs_conns_se,
lvs_keepalived_vip_status,
keepalived,
在zabbix中创建一个lvs监控模板,创建五个名称如上的监控项,键值如下图所示:
3.1) lvs监控模板中item配置图
wKioL1WseKLCe8l3AADSl4fZa3E281.jpg
3.2) lvs监控模板中tragger配置图
此处对三个监控项进行报警设置
1) VIP有变动,无论从有到无或从无到有,有变动代表发生了切换,则告警
2) keepalived进程down掉告警
3) lvs每秒转发请求大于5W,告警(这个依实际情况判断,如果远远高于正常请求值,代表有CC攻击)