阿里雲服務器由於不支持keepalive虛擬ip,導致無法通過keepalive來實現mysql的雙機熱備。我們這裏要實現阿里雲的雙機熱備有兩種方式:
1,購買阿里雲的雲數據庫高級版,自帶從庫,主庫故障自動切換到從庫
2這裏主要是講第二種方式,兩臺阿里雲服務器,分別部署mysql,實現mysql的主主同步。這裏就不着重講mysql的主主同步了,大家可以自行百度,有需要的,以後可能會出一篇文章。假設現在已經實現了mysql主主同步的情況下,如何處理
因爲使用的是springboot,所以需要處理下yml文件,然後加了個發送郵件給多個人,這裏主機跑的定時任務,備機需要的話,也可以相應的跑一下
因爲我是使用docker部署的mysql,所以使用的docker ps 查看mysql的狀態,如果普通部署的可以使用ps或者直接登錄mysql看能否成功來判斷
# coding: utf8
import subprocess
from email.mime.text import MIMEText
import smtplib
import os
#因爲這裏用的Java的springboot,如果切換備機,需要修改部分yml文件
YML_PATH = ''
NEW_YML = ''
msg_from = '' # 發送方郵箱
passwd = '' # 填入發送方郵箱的授權碼
msg_to = []
def check_mysql():
res = subprocess.Popen('docker ps |grep mysql', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
stdout, stderr = res.communicate()
if stdout:
res_status = subprocess.Popen("docker ps |grep mysql| awk '{print $7}'", stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True)
out, err = res_status.communicate()
if out.strip() == "Up":
print 'mysql is ok'
else:
print 'mysql is broken, switch standby machine'
flag = judge_mysql_string()
if flag:
print '已經連接備機,無需切換'
else:
switch_mysql()
else:
print 'mysql is broken, switch standby machine'
flag = judge_mysql_string()
if flag:
print '已經連接備機,無需切換'
else:
switch_mysql()
def switch_mysql():
print '---copy yml----'
subprocess.call('cp {} {}'.format(NEW_YML, YML_PATH), shell=True)
subprocess.call('docker restart tomcat', shell=True)
subject = 'mysql主機故障'
info = 'mysql主機故障,已經切換到備機,請查看主機問題,及時修復,如需切換回去,' \
content = '<html><meta charset="UTF-8"><body><p style="color: red">{}</p> </body></html>'.format(info)
send_email(subject, content)
print '----end switch---'
def send_email(subject, content):
msg = MIMEText(content, 'html', 'utf-8')
msg['Subject'] = subject
msg['From'] = msg_from
msg['To'] = ','.join(msg_to)
try:
s = smtplib.SMTP_SSL("smtp.qq.com", 465)
s.login(msg_from, passwd)
s.sendmail(msg_from, msg_to, msg.as_string())
except Exception as e:
print e
finally:
s.quit()
def judge_mysql_string():
with open(os.path.join(YML_PATH, 'application.yml'),'r') as f:
res = f.read()
if 'your ip' in res:
return True
else:
return False
check_mysql()