dinggela 发表于 2018-11-3 15:08:54

Redis Sentinel 高可用实现说明

#!/usr/bin/env python#-*-encoding:utf8-*-#------------------------------------------------# Name:      notify.py# Purpose:   failover切换后的操作# Author:      zhoujy# Created:   2016-06-17#------------------------------------------------import osimport sysimport timeimport datetimeimport smtplibimport subprocessimport fileinputimport loggingimport paramikofrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.Utils import COMMASPACE, formatdate  reload(sys)
  sys.setdefaultencoding('utf8')def send_mail(to, subject, text, from_mail, server="localhost"):
  message = MIMEMultipart()
  message['From'] = from_mail
  message['To'] = COMMASPACE.join(to)
  message['Date'] = formatdate(localtime=True)
  message['Subject'] = subject
  message.attach(MIMEText(text,_charset='utf-8'))
  smtp = smtplib.SMTP(server)
  smtp.sendmail(from_mail, to, message.as_string())
  smtp.close()#关vipdef down_vip(hostname,port):
  ssh = paramiko.SSHClient()
  ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  ssh.connect(hostname=hostname,port=port)
  stdin, stdout, stderr = ssh.exec_command("ifconfig eth0:0 down")#    print stdout.readlines()
  ifnot stderr.readlines() :      print "down vip ok..."
  else :      print stderr.readlines()
  ssh.close()#开vipdef up_vip(hostname,port,vip):
  ssh = paramiko.SSHClient()
  ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  ssh.connect(hostname=hostname,port=port)
  stdin, stdout, stderr = ssh.exec_command("ifconfig eth0:0 %s;arping -c 3 -A %s;hash -r" %(vip,vip))#    print stdout.readlines()
  ifnot stderr.readlines() :      print "up vip ok..."
  else :      print stderr.readlines()
  ssh.close()if __name__ == "__main__":#服务器端口
  ssh_port = 22#指定VIP
  vip      = '192.168.200.2'#通过logging.basicConfig函数对日志的输出格式及方式做相关配置
  logging.basicConfig(level=logging.INFO,
  format=':::%(levelname)s::: \n%(message)s',
  datefmt='%a, %d %b %Y %H:%M:%S',
  filename='/var/log/redis/failover.txt',
  filemode='a')#定义一个StreamHandler,将INFO级别的日志信息打印到标准错误,并将其添加到当前的日志处理对象
  console = logging.StreamHandler()
  console.setLevel(logging.INFO)
  formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
  console.setFormatter(formatter)
  logging.getLogger('').addHandler(console)
  time =(datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")
  message = sys.argv
  master_name = sys.argv
  role = sys.argv
  stats = sys.argv
  from_ip = sys.argv
  from_port = sys.argv
  to_ip = sys.argv
  to_port = sys.argv
  messages = "++++++++++++++++++++++++++"+time+" failover++++++++++++++++++++++++++"+'\n'+' '.join(message)
  subject = ''' Redis 【%s】 Failover ''' %master_name
  info = ''' %s : Redis Master %s failover %s(%s:%s) to %s(%s:%s) succeeded ! '''%(time,master_name,from_ip,from_ip,from_port,to_ip,to_ip,to_port)
  mail_list =['zjy@dxyer.com']    if role == 'leader':
  logging.info(messages)      down_vip(from_ip,ssh_port)
  up_vip(to_ip,ssh_port,vip)
  send_mail(mail_list, subject.encode("utf8"), info +' and VIP do sucessed !!', "Redis_failover_report@ls.xxx.net", server="192.168.xxx.xxx")

页: [1]
查看完整版本: Redis Sentinel 高可用实现说明