天天看點

Zabbix監控LVS狀态及keepalived VIP漂移

此文隻說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 &gt;&gt;</code><code>/var/log/crontab</code><code>.log2&gt;&amp;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,如需轉載請自行聯系原作者