此文只说lvs监控,lvs+keepalived的部署,请参考我另外的文章。
<a href="http://yangrong.blog.51cto.com/6945369/1575909" target="_blank">http://yangrong.blog.51cto.com/6945369/1575909</a>
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
<code># cat/usr/local/lvsmonitor/lvs_status_sender.py</code>
<code>#!/usr/bin/env python</code>
<code>#coding=utf-8</code>
<code>#date 2015-7-8</code>
<code>#auth :yangr</code>
<code>#function:汇报lvs的相关状态,有每秒连接数,每秒转发数,VIP主从切换.每秒转发带宽</code>
<code>#lvs_conns_sec,lvs_packets_sec,keepalived_vip_status</code>
<code> </code>
<code>import</code> <code>os,commands,sys,time</code>
<code>#变量定义----------------------</code>
<code>#从zabbix_agentd.conf中获取server IP或hostname</code>
<code>zabbix_agent_file</code><code>=</code><code>'/usr/local/zabbix/etc/zabbix_agentd.conf'</code>
<code>if</code> <code>notos.path.exists(zabbix_agent_file):</code>
<code> </code><code>sys.exit(</code><code>4</code><code>)</code>
<code>zabbix_server</code><code>=</code><code>commands.getstatusoutput(</code><code>'''grep'^ServerActive' %s|awk -F[=] '{print $2}' '''</code><code>%</code><code>zabbix_agent_file)[</code><code>1</code><code>].strip()</code>
<code>zabbix_hostname</code><code>=</code><code>commands.getstatusoutput(</code><code>'''grep'^Hostname' %s|awk -F[=] '{print $2}' '''</code><code>%</code><code>zabbix_agent_file)[</code><code>1</code><code>].strip()</code>
<code>if</code> <code>not</code> <code>zabbix_server </code><code>or</code> <code>notzabbix_hostname:</code>
<code> </code><code>sys.exit()</code>
<code>zabbix_server_port</code><code>=</code><code>10051</code>
<code>timestamp </code><code>=</code> <code>int</code><code>(time.time())</code>
<code>keepalived_vip</code><code>=</code><code>[</code><code>'192.168.1.100'</code><code>] </code><code>#指定VIP</code>
<code>tmp_file_path</code><code>=</code><code>'/tmp/lvs_status.txt'</code> <code>#指定监控值输出文件</code>
<code>#-------------------------</code>
<code>def</code> <code>monit_lvs():</code>
<code> </code><code>#获取每秒包转发数</code>
<code> </code><code>status,lvs_packets_sec</code><code>=</code><code>commands.getstatusoutput(</code><code>'''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}' '''</code><code>)</code>
<code> </code><code>#获取每秒转发的流量</code>
<code> </code><code>status,lvs_bit_sec</code><code>=</code><code>commands.getstatusoutput(</code><code>'''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}' '''</code><code>)</code>
<code> </code><code>#获取lvs会话连接数</code>
<code> </code><code>status,lvs_conns_sec</code><code>=</code><code>commands.getstatusoutput(</code><code>'wc -l/proc/net/ip_vs_conn'</code><code>)</code>
<code> </code><code>#获取VIP状态,如值非0为master,为0则是backup,如果有变动,则进行了切换</code>
<code> </code><code>status,lvs_keepalived_vip_status</code><code>=</code><code>commands.getstatusoutput(</code><code>'/sbin/ipaddr |grep %s |wc -l'</code><code>%</code><code>keepalived_vip[</code><code>0</code><code>])</code>
<code> </code><code>#如果本机有VIP,则取出VIP的最后一段十进制。</code>
<code> </code><code>if</code> <code>int</code><code>(lvs_keepalived_vip_status) !</code><code>=</code> <code>0</code><code>:</code>
<code> </code><code>status,result_ip</code><code>=</code><code>commands.getstatusoutput(</code><code>''' echo%s|awk -F '.' '{print $NF}' '''</code><code>%</code><code>keepalived_vip[</code><code>0</code><code>])</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>lvs_keepalived_vip_status </code><code>=</code><code>int</code><code>(result_ip)</code>
<code> </code><code>except</code><code>:</code>
<code> </code><code>pass</code>
<code> </code><code>#把 key值信息写到一个临时文件,格式为 hostname,key,timestamp,value</code>
<code> </code><code>with </code><code>open</code><code>(tmp_file_path,</code><code>'wb'</code><code>) as f:</code>
<code> </code><code>f.write(</code><code>'%s %s %s %s\n'</code><code>%</code><code>(zabbix_hostname,</code><code>'lvs_packets_sec'</code><code>,timestamp,lvs_packets_sec))</code>
<code> </code><code>f.write(</code><code>'%s %s %s %s\n'</code><code>%</code><code>(zabbix_hostname,</code><code>'lvs_bit_sec'</code><code>,timestamp,lvs_bit_sec))</code>
<code> </code><code>f.write(</code><code>'%s %s %s %s\n'</code><code>%</code><code>(zabbix_hostname,</code><code>'lvs_conns_sec'</code><code>,timestamp,lvs_packets_sec))</code>
<code> </code><code>f.write(</code><code>'%s %s %s %s\n'</code><code>%</code><code>(zabbix_hostname,</code><code>'lvs_keepalived_vip_status'</code><code>,timestamp,lvs_keepalived_vip_status))</code>
<code>if</code> <code>__name__</code><code>=</code><code>=</code><code>'__main__'</code><code>:</code>
<code> </code><code>monit_lvs()</code>
<code> </code><code>#把临时文件通过zabbix_sender命令发送到server端</code>
<code> </code><code>send_data_cmd</code><code>=</code><code>'/usr/local/zabbix/bin/zabbix_sender -vv -z %s-p %s -T -i %s'</code><code>%</code><code>(zabbix_server,zabbix_server_port,tmp_file_path)</code>
<code> </code><code>#print send_data_cmd</code>
<code> </code><code>os.popen(send_data_cmd)</code>
定时任务设置:
<code>#crontab -l</code>
<code>#zabbix_sender汇报lvs的监控信息</code>
<code>* * * * * </code><code>/usr/bin/python/usr/local/lvsmonitor/lvs_status_sender</code><code>.py >></code><code>/var/log/crontab</code><code>.log2>&1</code>
lvs_packets_sec,
lvs_bit_sec,
lvs_conns_se,
lvs_keepalived_vip_status,
keepalived,
在zabbix中创建一个lvs监控模板,创建五个名称如上的监控项,键值如下图所示:
3.1) lvs监控模板中item配置图
<a href="http://s3.51cto.com/wyfs02/M02/6F/DF/wKioL1WseKLCe8l3AADSl4fZa3E281.jpg" target="_blank"></a>
3.2) lvs监控模板中tragger配置图
此处对三个监控项进行报警设置
1) VIP有变动,无论从有到无或从无到有,有变动代表发生了切换,则告警
2) keepalived进程down掉告警
3) lvs每秒转发请求大于5W,告警(这个依实际情况判断,如果远远高于正常请求值,代表有CC攻击)
<a href="http://s3.51cto.com/wyfs02/M02/6F/E2/wKiom1WsdsGCWTgDAACoMLJ3z5k423.jpg" target="_blank"></a>
一切设置好后,就可以创建一台监控主机,调用lvs监控模板,然后查看数据获取是否正确。
如有问题,欢迎留言。
本文转自杨云1028 51CTO博客,原文链接:http://blog.51cto.com/yangrong/1676312,如需转载请自行联系原作者