博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
监控redis多实例的负载情况
阅读量:5869 次
发布时间:2019-06-19

本文共 5381 字,大约阅读时间需要 17 分钟。

  单个服务器上创建多实例,对其重要参数的监控是非常重要的,以下是监控服务器上多实例的负载情况:主要包含: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()

有图有真相:

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

你可能感兴趣的文章
配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
查看>>
AIX 7.1 install python
查看>>
PHP盛宴——经常使用函数集锦
查看>>
重写 Ext.form.field 扩展功能
查看>>
Linux下的搜索查找命令的详解(locate)
查看>>
福利丨所有AI安全的讲座里,这可能是最实用的一场
查看>>
开发完第一版前端性能监控系统后的总结(无代码)
查看>>
Python多版本情况下四种快速进入交互式命令行的操作技巧
查看>>
MySQL查询优化
查看>>
【Redis源码分析】如何在Redis中查找大key
查看>>
northropgrumman
查看>>
关于链接文件的探讨
查看>>
android app启动过程(转)
查看>>
Linux—源码包安装
查看>>
JDK8中ArrayList的工作原理剖析
查看>>
安装gulp及相关插件
查看>>
如何在Linux用chmod来修改所有子目录中的文件属性?
查看>>
Applet
查看>>
高并发环境下,Redisson实现redis分布式锁
查看>>
乌克兰基辅一世遗修道院起火 现场火光照亮夜空
查看>>