此文只说lvs监控,lvs+keepalived的部署,请参考我另外的文章。
http://yangrong.blog.51cto.com/6945369/1575909
lvs的每秒会话连接数
lvs的每秒包转发数
lvs每秒转发带宽
VIP切换情况
keepalived进程的存活
主要汇报内容:
会话连接数,每秒包转发数,每秒转发带宽,VIP值
监控python脚本,采用zabbix_sender上报方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
# cat/usr/local/lvsmonitor/lvs_status_sender.py
#!/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
=
'/usr/local/zabbix/etc/zabbix_agentd.conf'
if
notos.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
notzabbix_hostname:
sys.exit()
zabbix_server_port
=
10051
timestamp
=
int
(time.time())
keepalived_vip
=
[
'192.168.1.100'
]
#指定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/ipaddr |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/local/zabbix/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)
|
定时任务设置:
1
2
3
|
#crontab -l
#zabbix_sender汇报lvs的监控信息
* * * * *
/usr/bin/python/usr/local/lvsmonitor/lvs_status_sender
.py >>
/var/log/crontab
.log2>&1
|
lvs_packets_sec,
lvs_bit_sec,
lvs_conns_se,
lvs_keepalived_vip_status,
keepalived,
在zabbix中创建一个lvs监控模板,创建五个名称如上的监控项,键值如下图所示:
3.1) lvs监控模板中item配置图
3.2) lvs监控模板中tragger配置图
此处对三个监控项进行报警设置
1) VIP有变动,无论从有到无或从无到有,有变动代表发生了切换,则告警
2) keepalived进程down掉告警
3) lvs每秒转发请求大于5W,告警(这个依实际情况判断,如果远远高于正常请求值,代表有CC攻击)
一切设置好后,就可以创建一台监控主机,调用lvs监控模板,然后查看数据获取是否正确。
如有问题,欢迎留言。