本发明涉及数据库技术领域,特别是涉及一种数据库主从同步状态监控的方法以及装置。
背景技术:
随着网站业务的发展进步,用户数量以及数据量也在不断地增加,从而导致数据库的访问量也呈线性地增长。
为了应对日益增长的访问量,数据库主从同步架构广泛应用于大型网站系统。例如,MYSQL主从同步架构,其中MySam引擎负责新增、修改、删除等操作,InnoDB引擎负责查询。数据库主从同步架构可以是指设立有主从两个数据库,主从数据库之间的信息状态是同步的。
数据库主从同步状态是决定着数据库在高并发负载下的性能好坏,因而数据库主从同步状态的监控也就显得尤为重要。现有技术中的数据主从同步状态的监控方法一般是人为手动地执行结构化查询语句(Structured Query Language,SQL)语句,例如show、slave以及status\G等语句,然后检查输出结果中的Slave_IO_Running、Slave_SQL_Running以及Seconds_Behind_Master等三个参数值,最后人工判断数据库主从同步状态是否正常。但是,由于数据库主从同步状态的监控是人工完成的,在进行检测时,需要运维人员逐一登录每台设备进行检查,而当设备数量达至成百上千时,工作量极大,进而导致数据库主从同步状态监控效率较低。综上所述,如何提高数据库主从同步状态监控效率是本领域亟待解决的问题。
技术实现要素:
本发明的目的是提供一种数据库主从同步状态监控的方法以及装置,目的在于解决现有技术中数据库主从同步状态监控效率较低的问题。
为解决上述技术问题,本发明提供一种数据库主从同步状态监控的方法,该方法包括:
调用第一编程函数,自动执行预设结构化查询指令,得出执行结果;
根据所述执行结果,判断数据库的主从同步状态是否正常。
可选地,在所述调用监控函数,自动执行预设结构化查询指令,得出执行结果之前还包括:
调用第二编程函数,测试所述数据库的端口状态,判断是否符合预设连接条件;
当符合所述预设连接条件时,则进行后续步骤;
当不符合所述预设连接条件时,生成第一告警邮件,并将所述告警邮件发送至第一预设收件人。
可选地,所述当不符合所述预设连接条件时,生成第一告警邮件,并将所述告警邮件发送至第一预设收件人包括:
获取所述数据库的第一异常信息;
根据所述第一异常信息以及第一预设邮件模板,生成所述第一告警邮件;
将所述第一告警邮件发送至所述第一预设收件人。
可选地,在所述根据所述执行结果,判断数据库的主从同步状态是否正常之后还包括:
当判断出所述数据库的主从同步状态为正常时,停止执行监控程序;
当判断出所述数据库的主从同步状态为异常时,获取所述数据库的第二异常信息;
根据所述第二异常信息以及第二预设邮件模板,生成第二告警邮件;
将所述第二告警邮件发送至第二预设收件人。
可选地,在所述当判断出所述数据库的主从同步状态为正常时,停止执行监控程序之后还包括:
在经过预设周期之后,执行所述监控程序,对所述数据库的主从同步状态进行监控。
此外,本发明还提供了一种数据库主从同步状态监控的装置,该装置包括:
调用模块,用于调用第一编程函数,自动执行预设结构化查询指令,得出执行结果;
第一判断模块,用于根据所述执行结果,判断数据库的主从同步状态是否正常。
可选地,还包括:
第二判断模块,用于调用第二编程函数,测试所述数据库的端口状态,判断是否符合预设连接条件;
建立模块,用于当符合所述预设连接条件时,则进行后续步骤;
第一告警模块,用于当不符合所述预设连接条件时,生成第一告警邮件,并将所述告警邮件发送至第一预设收件人。
可选地,所述第一告警模块包括:
第一异常信息获取单元,用于获取所述数据库的第一异常信息;
生成单元,用于根据所述第一异常信息以及第一预设邮件模板,生成所述第一告警邮件;
发送单元,用于将所述第一告警邮件发送至所述第一预设收件人。
可选地,还包括:
停止模块,用于当判断出所述数据库的主从同步状态为正常时,停止执行监控程序;
获取模块,用于当判断出所述数据库的主从同步状态为异常时,获取所述数据库的第二异常信息;
生成模块,用于根据所述第二异常信息以及第二预设邮件模板,生成第二告警邮件;
发送模块,用于将所述第二告警邮件发送至第二预设收件人。
可选地,还包括:
定时执行模块,用于在经过预设周期之后,执行所述监控程序,对所述数据库的主从同步状态进行监控。
本发明所提供的一种数据库主从同步状态监控的方法以及装置,通过调用第一编程函数,自动执行预设结构化查询指令,得出执行结果;根据上述执行结果,判断数据库的主从同步状态是否正常。利用编程手段,自动执行结构化查询指令,对数据库的主从同步状态进行监控,相较于人工执行结构化查询指令对数据库的主从同步状态进行监控,其自动执行结构化查询指令,使得数据库的主从同步状态的监控效率较高,可见,本申请有利于提高数据库主从同步状态的监控效率。
附图说明
为了更清楚的说明本发明实施例或现有技术的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例所提供的数据库主从同步状态监控方法的一种具体实施方式的流程示意图;
图2为本发明实施例所提供的数据库主从同步状态监控装置的结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面结合附图和具体实施方式对本发明作进一步的详细说明。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
由于数据库以及所使用的编程语言的不同,实现数据库主从同步状态监控的方式也会有所不同,故在下文将以数据为MYSQL数据库,编程语言为Python的场景下进行介绍说明。显而易见地,当数据库的类型不同,或者是所使用脚本语言的不同时,具体实现方式也与本发明实施例的思想一致,即也落在本发明实施例的保护范围内。
请参见图1,图1为本发明实施例所提供的数据库主从同步状态监控方法的一种具体实施方式的流程示意图,该方法包括以下步骤:
步骤101:调用第一编程函数,自动执行预设结构化查询指令,得出执行结果。
需要说明的是,上述第一编程函数可以是指Python语言的is Slave函数,其可以数据库自动执行相应的结构化查询指令,以对数据的主从同步状态进行监控,即利用该函数,可以监控数据库的主从同步状态。
上述预设结构化查询指令可以是指SQL语句,例如,可以为show、slave以及status\G等SQL语句。其可以根据数据库的主从同步状态,得出相应的参数值,根据该参数值,可以判断出数据库的主从同步状态是否正常。
上述执行结果可以是指执行SQL语句后,得出的参数值,例如,当执行的是show、slave以及status\G三个SQL语句时,输出结果为Slave_IO_Running、Slave_SQL_Running以及Seconds_Behind_Master三个参数值,这三个参数值即为执行结果。
具体地,运行基于Python语言编写的监控脚本,监控脚本可以调用到第一编程函数即is Slave函数,执行SQL语句,得出相应的参数值。
可以理解的是,主从数据库的信息交互是基于端口的,故主从数据库之间的端口是否畅通,影响着数据库的主从同步状态,故可以将监控脚本设置于主数据库上,利用监控脚本来测试端口的状态,即通过判断主从数据库之间是否可以连通,从而可以得出数据的主从同步状态。
在本发明的一些实施例中,在上述调用第一编程函数,自动执行预设结构化查询指令,得出执行结果之前还可以包括:调用第二编程函数,测试所述数据库的端口状态,判断是否符合预设连接条件;当符合所述预设连接条件时,则进行后续步骤;当不符合所述预设连接条件时,生成第一告警邮件,并将所述告警邮件发送至第一预设收件人。
需要说明的是,上述第二编程函数可以是指Python语言中的telnet函数,其可以测试服务器的地址以及端口是否畅通,即基于Python的主从数据库之间是否可以连通。
上述预设连接条件可以是指监控脚本与从数据库之间的端口处于畅通状态,此时,可以调用is Slave函数来监控数据库的主从同步状态。
当不符合上述预设连接条件时,即主从数据库之间的不可以连通时,则可以判断数据库的主从同步状态出现异常。此时,为了及时通知运维人员,以使运维人员可以知悉当前的主从同步状态出现异常,可以自动生成告警邮件,并将该告警邮件发送至预先设定的收件人。
上述第一预设收件人可以是任意设定的,其具体可以表现为数据库的管理员,也可以为其它预先设定的人员,在此不再限定。显而易见地,设定收件人具体可以通过设定邮件接收地址来实现。而更具体地,可以通过Python语言中的ring函数来实现告警邮件。
更进一步地,为了使告警邮件的收件人在得知数据库主从同步状态出现异常之后,可以及时得知出现异常的原因以及位置,以及时作出应对措施,在告警邮件中可以附上异常信息,表明出现异常的原因和位置。
故在本发明的一些实施例中,上述当不符合所述预设连接条件时,生成第一告警邮件,并将所述告警邮件发送至第一预设收件人的过程具体可以为:获取所述数据库的第一异常信息;根据所述第一异常信息以及第一预设邮件模板,生成所述第一告警邮件;将所述第一告警邮件发送至所述第一预设收件人。
需要说明的是,上述第一异常信息可以是包括当前数据库的端口状态,例如是否畅通等,以及当前数据库所处的服务器是哪台服务器。当然,上述第一异常信息还可以包括其它类型的信息,在此不作限定。
上述第一预设邮件模板可以是指预先设置好的邮件模板,例如,可以将邮件模板的标题设置为数据库主从同步状态异常提醒,而将邮件模板的内容设置包括称呼用语、出现异常的原因以及出现异常的数据库所在的服务器地址等。当然,告警邮件的模板可以任意设定的,在此不作限定。而告警邮件的发送也可以通过上文提到的ring函数实现。
可以看出,通过测试主从数据库之间的端口是否可以连通,从而初步判断数据库的主从同步状态是否出现异常,使得主从同步状态的监控的较便利快捷。而在判断出数据库的主从同步状态出现异常之后,发出告警邮件,可以及时处理数据库的主从同步状态异常情况,保证数据库的主从同步。
步骤102:根据所述执行结果,判断数据库的主从同步状态是否正常。
需要说明的是,根据执行SQL语句得出的参数值,来判断数据库的主从同步状态是否出现异常是本领域技术人员所熟知的技术,在此不再赘述。
可以理解的是,根据数据库的主从同步状态正常与否,可以进行相应的应对措施。
在本发明的一些实施例中,上述根据所述执行结果,判断数据库的主从同步状态是否正常的过程可以具体为:当判断出所述数据库的主从同步状态为正常时,停止执行监控程序;当判断出所述数据库的主从同步状态为异常时,获取所述数据库的第二异常信息;根据所述第二异常信息以及第二预设邮件模板,生成第二告警邮件;将所述第二告警邮件发送至第二预设收件人。
需要说明的是,上述监控程序可以是指上文中提到的监控脚本,其可以是指基于Python语言编写的。
上述第二异常信息可以是指表征数据库的主从同步状态出现异常的原因,以及出现异常的数据库处于哪一台服务器的信息。当然,上述第二异常信息还可以包括其它类型的数据库信息。
上述第二预设邮件模板可以与上文提到的第一预设邮件模板等同,具体介绍可以参见上文相应内容;当然,也可以与第一预设邮件模板不同,可以是任意设定的,在此不作限定。
上述第二预设收件人可以与上文提到的第一预设收件人等同,具体介绍可以参见上文相应内容;当然,第二预设收件人也可以与第一预设收件人不同,在此不作限定。
可以理解的是,当判断出数据库的主从同步状态为正常时,可以停止执行监控程序,也可以继续循环执行监控程序,以对数据库实现无间断的监控。
但是,无间断地运行监控脚本,会占用大量的资源。为了均衡监控效率和资源的利用率,可以定时执行监控脚本,即定时监控数据库的主从同步状态。
在本发明的一些实施例中,上述当判断出所述数据库的主从同步状态为正常时,停止执行监控程序之后还可以包括:在经过预设周期之后,执行所述监控程序,对所述数据库的主从同步状态进行监控。
需要说明的是,上述预设周期可以是任意设定的,例如,可以将预设周期设定为10分钟,此时,每经过10分钟,则自动执行监控程序即监控脚本。
具体地,可以利用Linux/Unix crontab来实现定时监控任务,即在crontab内添加定时任务,这样每隔预设周期,crontab会调用监控程序即监控脚本,对数据的主从同步状态进行监控。
为了更好地介绍说明各个步骤的具体实现过程,下面将结合具体实现代码来简要说明具体的Python代码实现。
首先需要编写SMTP邮件配置文件,以及创建Python函数__init__、__configParseMySQL__、__configParseSMTP__、__read_defaults_file__、telnet、is Slave、get_last_error、notify、close、ring函数。
然后编写Python代码来具体实现各个步骤,例如,利用telnet函数测试服务器地址以及端口是否畅通,判断数据的主从同步状态是否正常的过程可以具体如下:
测试服务器地址和端口是否畅通
:param host:服务器地址
:param port:服务器端口
:param timeout:测试超时时间
:return:Boolean
"""
try:
tel=telnetlib.Telnet(host,port,timeout)
tel.close()
return True
except:
return False
def connect(self):
"""
创建数据库链接
"""
try:
config=self.__configParseMySQL__()
if self.telnet(config["host"],config["port"]):
self.__instance__=mysql.connector.connect(**config)
return True
else:
raise Exception("unable connect")
except:
self.__error__.append("无法连接服务器主机:{host}:{port}".format(host=config[
"host"],port=config["port"]))
return False
defisSlave(self):
"""
数据库同步是否正常
:return:None同步未开启,False同步中断,True同步正常
"""
cur=self.__instance__.cursor(dictionary=True)
cur.execute("SHOW SLAVE STATUS")
result=cur.fetchone()
cur.close()
if result:
if result["Slave_SQL_Running"]=="Yes"and result["Slave_IO_Running"]=="Yes":
return True
else:
if result["Slave_SQL_Running"]=="No":
self.__error__.append(result["Last_SQL_Error"])
else:
self.__error__.append(result["Last_IO_Error"])
return False
defget_last_error(self):
"""
获取第一个错误信息
:return:String
"""
if self.__error__:
return self.__error__.pop(0)
def notify(self,title,message):
"""
而发送告警邮件的具体代码实现可以如下所示:
:param title:消息的标题
:param message:消息的内容
:return:
"""
msg=[title,message]
pool=[]
notify=notify_email(self.__configParseSMTP__())
pool.append(notify)
for item in pool:
item.ring(msg)
def close(self):
"""
关闭数据库链接
"""
if self.__instance__:
self.__instance__.close()
class notify_email(object):
def__init__(self,config):
self.config=config
def ring(self,message=[]):
subject=message.pop(0)
messageBody="".join(message)
mailList=self.config["to"].split(";")
datetime=time.strftime("%Y-%m-%d%H:%M:%S")
for to in mailList:
body="""
<p>管理员<strong>{admin}</strong>,你好:</p>
<p style="text-indent:2em;">收到这封邮件说明你的数据库同步出现异常,请您及时进行处理。</p>
<p>异常信息:<br/>{body}</p>
<p style="text-align:right;">{date}</p>
""".format(admin=to,body=messageBody,date=datetime)
msg=MIMEText(body,"html","utf-8")
msg["From"]=self.config["from"]
msg["To"]=to
msg["Subject"]=subject
smtp=smtplib.SMTP()
smtp.connect(self.config["smtp_host"])
if self.config.has_key("smtp_user"):
smtp.login(self.config["smtp_user"],self.config["smtp_password"])
smtp.sendmail(self.config["from"],to,msg.as_string())
smtp.quit()
可以理解的是,上述具体的Python代码的实现过程只是一种实施方式,具体的实现手段还可以有其它,在此不作限定。
本发明实施例所提供的数据库主从同步状态监控的方法,通过调用第一编程函数,自动执行预设结构化查询指令,得出执行结果;根据上述执行结果,判断数据库的主从同步状态是否正常。利用编程手段,自动执行结构化查询指令,对数据库的主从同步状态进行监控,相较于人工执行结构化查询指令对数据库的主从同步状态进行监控,其自动执行结构化查询指令,使得数据库的主从同步状态的监控效率较高,可见,该方法有利于提高数据库主从同步状态的监控效率。
下面对本发明实施例提供的数据库主从同步状态监控装置进行介绍,下文描述的数据库主从同步状态监控装置与上文描述的数据库主从同步状态监控方法可相互对应参照。
图2为本发明实施例所提供的数据库主从同步状态监控装置的结构框图,参照图2数据库主从同步状态监控的装置可以包括:
调用模块201,用于调用第一编程函数,自动执行预设结构化查询指令,得出执行结果;
第一判断模块202,用于根据所述执行结果,判断数据库的主从同步状态是否正常。
可选地,还包括:
第二判断模块,用于调用第二编程函数,测试所述数据库的端口状态,判断是否符合预设连接条件;
建立模块,用于当符合所述预设连接条件时,则进行后续步骤;
第一告警模块,用于当不符合所述预设连接条件时,生成第一告警邮件,并将所述告警邮件发送至第一预设收件人。
可选地,所述第一告警模块包括:
第一异常信息获取单元,用于获取所述数据库的第一异常信息;
生成单元,用于根据所述第一异常信息以及第一预设邮件模板,生成所述第一告警邮件;
发送单元,用于将所述第一告警邮件发送至所述第一预设收件人。
可选地,还包括:
停止模块,用于当判断出所述数据库的主从同步状态为正常时,停止执行监控程序;
获取模块,用于当判断出所述数据库的主从同步状态为异常时,获取所述数据库的第二异常信息;
生成模块,用于根据所述第二异常信息以及第二预设邮件模板,生成第二告警邮件;
发送模块,用于将所述第二告警邮件发送至第二预设收件人。
可选地,还包括:
定时执行模块,用于在经过预设周期之后,执行所述监控程序,对所述数据库的主从同步状态进行监控。
本发明实施例所提供的数据库主从同步状态监控的装置,通过调用第一编程函数,自动执行预设结构化查询指令,得出执行结果;根据上述执行结果,判断数据库的主从同步状态是否正常。利用编程手段,自动执行结构化查询指令,对数据库的主从同步状态进行监控,相较于人工执行结构化查询指令对数据库的主从同步状态进行监控,其自动执行结构化查询指令,使得数据库的主从同步状态的监控效率较高,可见,该装置有利于提高数据库主从同步状态的监控效率。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上对本发明所提供的数据库主从同步状态监控的方法以及装置进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。