1. 启动脚本(startDRBD.py):
import os,sys
import threading
from time import ctime,sleep
import commands
def GetIsPrimary():
if len(sys.argv) != 2:
print '参数个数错误!参数个数:3个'
exit()
if sys.argv[1] == 'primary':
return 1
elif sys.argv[1] == 'secondary':
return 2
else:
print '参数错误!请输入参数:primary或secondary'
exit()
def StartAndSendYes():
import pexpect
pwd="yes\r"
child=pexpect.spawn('service drbd start')
sleep(15)
if IsStarted() != 1:
child.expect (']:')
child.sendline(pwd)
child.close()
def SetPrimOrSenc(bIsPrimary):
if bIsPrimary == 1:
output = commands.getstatusoutput('drbdadm primary --forc
e r0')
if output[0] == 2816:
print 'there is another primary node already!'
output = commands.getstatusoutput('mount /dev/drbd1 /db')
if output[0] != 0:
print 'mount /dev/drbd1 failed!'
def IsStarted():
output = commands.getstatusoutput('drbdadm cstate r0')
if len(output[1])>90:
if output[1][90:] == 'Connected':
return 1
return 0
def IsSplitBrain():
output = commands.getstatusoutput('drbdadm cstate r0')
if len(output[1])>90:
if output[1][90:] == 'StandAlone':
print 'Split-Brain!Repairing...'
RepairSplitBrain()
exit()
def RepairSplitBrain():
if(GetIsPrimary()==1):
commands.getstatusoutput('drbdadm connect r0')
elif(GetIsPrimary()==2):
commands.getstatusoutput('drbdadm secondary r0')
commands.getstatusoutput('drbdadm connect --discard-my-da
ta r0')
class MyThread(threading.Thread):
def __init__(self, name=None):
threading.Thread.__init__(self)
def run(self):
IsSplitBrain()
def BeginThread():
t = MyThread()
sleep(1)
t.start()
if __name__ == "__main__":
num = GetIsPrimary()
commands.getstatusoutput('service drbd stop')
StartAndSendYes()
SetPrimOrSenc(num)
BeginThread()
2. 主备节点切换脚本 (setDRBD.py):
import sys,os
import commands
def IsPrimary():
if(len(sys.argv) != 2):
print '参数个数错误!'
exit()
if sys.argv[1] == 'primary':
return 1
elif sys.argv[1] == 'secondary':
return 2
else:
print '参数错误!请输入参数:primary或secondary'
exit()
def SetPrimOrSenc(bIsPrimary):
output = '0'
if bIsPrimary == 1:
output = commands.getstatusoutput('drbdadm primary r0')
if output[0] == 2816:
print 'there is another primary node already!'
output = commands.getstatusoutput('mount /dev/drbd1 /db')
if output[0] != 0:
print 'mount /dev/drbd1 failed!'
elif bIsPrimary == 2:
output = commands.getstatusoutput('umount /db')
if output[0] != 0:
print 'umount /db failed!'
commands.getstatusoutput('drbdadm secondary r0')
if __name__ == '__main__':
index = IsPrimary()
SetPrimOrSenc(index)