阿里雲服務器如何手動實現mysql雙機熱備

阿里雲服務器由於不支持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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章