监控redis多实例的负载情况

  单个服务器上创建多实例,对其重要参数的监控是非常重要的,以下是监控服务器上多实例的负载情况:主要包含:redis实例的QPS、内存使用情况、客户端连接数,服务器的内存使用率、CPU使用率、CPU load值、网卡流量等,脚本把采集到的数据显示并且写入到数据库中,方便查看多个服务器的多实例情况以及数据的汇总等,写的优点仓促,有兴趣的同学可以整理一下脚本使其模块化、简洁化。脚本如下:

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/usr/bin/env python
#-*-coding:UTF-8-*-
import  os,threading,time,sys,sigar,MySQLdb
'''
安装python的sigar模块
apt-get install libtool automake gettext python-MySQLdb screen pkg-config git
git clone git://github.com/hyperic/sigar.git sigar.git
./autogen.sh
./configure
make
make install
cd bindings/python/
python setup.py install
'''
'''
建库sql
CREATE TABLE `redis_stats` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `host_name` varchar(50) NOT NULL,
   `qps` int(11) NOT NULL,
   `clients` int(11) NOT NULL,
   `redis_mem_used` varchar(50) NOT NULL,
   `sys_mem_used_pers` float NOT NULL,
   `cpu_used` float NOT NULL,
   `cpu_load` varchar(50) NOT NULL,
   `netband` varchar(255) NOT NULL,
   `uptime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (`id`),
   KEY `host_name` (`host_name`),
   KEY `uptime` (`uptime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
查询每个实例的最新记录
select host_name,qps,clients,redis_mem_used,concat(sys_mem_used_pers,'%') as sys_mem_used,concat(cpu_used,'%') as cpu_used,cpu_load,netband from DBA.redis_stats group by host_name desc order by qps desc;
'''
def  log2db(check_log):
     log_host  =  '192.168.56.101'
     log_user  =  'root'
     log_pass  =  '1q2w3e4r'
     try :
         conn  =  MySQLdb.connect(host  =  log_host,port  =  3306 ,user  =  log_user,passwd  =  log_pass,charset = 'utf8' ,connect_timeout = 20 )
         cursor  =  conn.cursor()
         #cursor.execute(insert_sql)
         cursor.executemany( "INSERT INTO redis.redis_stats (`host_name`,`qps`,`clients`,`redis_mem_used`,`sys_mem_used_pers`,`cpu_used`,`cpu_load`,`netband`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)" , tuple (check_log))
         conn.commit()
         cursor.close()
         conn.close()
     except  Exception,e:
         print  e
def  redis_info(host,port,res):
     var  =  []
     var.append(host)
     var.append(port)
     aaa  =  os.popen( "redis-cli -h %s -p %s info|grep -v '#'|tr -s '\r\n'"  %  (host,port)).readlines()
     dirc  =  {}
     for  in  aaa:
         if  i ! =  '\r\n' :
             =  i.strip()
             aa  =  a.split( ":" )
             dirc[aa[ 0 ]] = aa[ 1 ]
     var.append(dirc[ "connected_clients" ])
     var.append(dirc[ "instantaneous_ops_per_sec" ])
     var.append(dirc[ "used_memory_human" ])
     res.append(var)
def  main():
     netband  =  {}
     stime  =  5
     while  True :
         try :
             sg  =  sigar. open ()
             mem  =  sg.mem() #内存
             mem_percent  =  "%.2f"  %  mem.used_percent()
             cpu  =  sg.cpu() #CPU总的使用率
             cpu_idle  =  "%.2f"  %  (( 1 - float (cpu.idle()) / cpu.total()) * 100 )
             loadavg  =  sg.loadavg() #CPU load值
             cpu_loadavg  =  ',' .join([ str (i)  for  in  loadavg])
             #nets = [i for i in sg.net_interface_list() if 'dum' not in i and i != 'lo']#网卡流量统计
             nets  =  [i.strip()  for  in  os.popen( "/bin/ip a|grep global|awk '{print $7}'" ).readlines()  if  i.strip() ! =  '']
             if  len (netband) ! =  0 :
                 for  net  in  nets:
                     netband[net + '_Out' =  "%.2f"  %  ( float ((sg.net_interface_stat(net).tx_bytes())  -  int (netband[net + '_Out' ])) / stime / 1024 / 1024 )
                     netband[net + '_In' =  "%.2f"  %  ( float ((sg.net_interface_stat(net).rx_bytes())  -  int (netband[net + '_In' ])) / stime / 1024 / 1024 )
             else :
                 for  net  in  nets:
                     netband[net + '_Out' =  "%.2f"  %  ( float (sg.net_interface_stat(net).tx_bytes()) / stime / 1024 / 1024 )
                     netband[net + '_In' =  "%.2f"  %  ( float (sg.net_interface_stat(net).rx_bytes()) / stime / 1024 / 1024 )
             redis_list  =  [ '192.168.56.101:6379' , '192.168.1.87:16379' ]
             text  =  "*" * 20  +  "  Redis Status  %s  "  %  time.strftime( "%Y-%m-%d %H:%M:%S" +  "*" * 20
             print  "\033[1;31;40m%s\033[0m"  %  text
             threads  =  []
             res  =  []
             for  in  redis_list:
                 aa  =  i.split( ':' )
                 host  =  aa[ 0 ]
                 port  =  aa[ 1 ]
                 =  threading.Thread(target = redis_info,args = (host,port,res))
                 threads.append(t)
             for  in  range ( len (threads)):
                 threads[i].start()
             for  in  range ( len (threads)):
                 threads[i].join()
             print  "\033[1;35;40m%s\033[0m"  %  ( "Redis_host:port" .ljust( 23 ) + "Redis:QPS" .ljust( 10 ) + "Redis:Clients" .ljust( 15 ) + "Redis:Mem_used" .ljust( 15 ) + "Mem_percent" .ljust( 12 ) + "Cpu_used" .ljust( 10 ) + "Cpu_loadavg" .ljust( 17 ))
             All_qps  =  0
             All_clients  =  0
             res.sort()
             check_log  =  []
             for  in  res:
                 log  =  [i[ 0 ] + ':' + i[ 1 ], int (i[ 3 ]), int (i[ 2 ]),i[ 4 ], float (mem_percent), float (cpu_idle),cpu_loadavg, str (netband)]
                 check_log.append(log)
                 print  (i[ 0 ] + ':' + i[ 1 ]).ljust( 23 ) + i[ 3 ].ljust( 10 ) + i[ 2 ].ljust( 15 ) + i[ 4 ].ljust( 15 ) + mem_percent.ljust( 12 ) + cpu_idle.ljust( 10 ) + cpu_loadavg.ljust( 17 ) + str (netband)
                 All_qps  =  All_qps  +  int (i[ 3 ])
                 All_clients  =  All_clients  +  int (i[ 2 ])
             log2db(check_log)
             print  "\033[1;35;40m%s\033[0m"  %  ( "Summary All host:" .ljust( 23 ) + str (All_qps).ljust( 10 ) + str (All_clients).ljust( 10 ))
             netband  =  {}
             for  net  in  nets:
                 netband[net + '_Out' =  sg.net_interface_stat(net).tx_bytes()
                 netband[net + '_In' =  sg.net_interface_stat(net).rx_bytes()
             time.sleep(stime)
         except  KeyboardInterrupt :
             sys.exit( 0 )
             print
             break
if  __name__  = =  "__main__" :
     main()

有图有真相:

wKiom1LXUSeTq5ufAAXw-D3QjCY771.jpg



本文转自 lover00751CTO博客,原文链接:http://blog.51cto.com/wangwei007/1352169,如需转载请自行联系原作者



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值