设为首页 收藏本站
查看: 834|回复: 0

[经验分享] 监控redis多实例的负载情况

[复制链接]

尚未签到

发表于 2018-11-7 09:24:05 | 显示全部楼层 |阅读模式
#!/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 i in aaa:
  if i != '\r\n':
  a = 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 i in loadavg])
  #nets = [i for i in sg.net_interface_list() if 'dum' not in i and i != 'lo']#网卡流量统计
  nets = [i.strip() for i 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 i in redis_list:
  aa = i.split(':')
  host = aa[0]
  port = aa[1]
  t = threading.Thread(target=redis_info,args=(host,port,res))
  threads.append(t)
  for i in range(len(threads)):
  threads.start()
  for i in range(len(threads)):
  threads.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 i 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()



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-631789-1-1.html 上篇帖子: redis多实例重启脚本 下篇帖子: redis服务监控
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表