检测主从延时方法、装置和系统与流程

文档序号:12278653阅读:193来源:国知局
检测主从延时方法、装置和系统与流程

本发明涉及数据库同步领域,特别涉及检测主从延时方法、装置和系统。



背景技术:

大型网站为了解决大并发访问,除了在网站实现分布式负载均衡,还需要在数据层上做优化。在用户访问请求到数据业务层和访问层的时候,如果还是按照原有的数据结构,或者只是单单靠一台数据服务器来承担,如此多的数据库连接操作,数据库必然会崩溃。这时候我们会考虑如何减少数据库的连接数:一方面采用优秀的代码框架,进行代码优化,包括采用优秀的数据缓存技术,如redis、memcached;另一方面是考虑架设服务器群,来分担主数据库的压力。因此我们引入了mysql的主从配置,实现读写分离,减轻数据库压力。这种方式,在如今的大型网站使用上已是标准配置。

在实现数据库读写分离的时候,通过业务逻辑判断主库主要用于读写操作,从库用于读操作,主从库之间通过主从数据复制保证数据的一致性。但主从复制是需要一定的时间的,为保证在访问从库的数据足够新,不会出现数据脏读,我们可以设定主从延时是否在容忍范围内,如果判断延时时间超过我们设定的容忍时间,我们可以通过业务逻辑进行数据库的切换。

但是,现有并没有较准确的判断主从延时的方法。



技术实现要素:

本发明的主要目的是提供一种检测主从延时方法、装置和系统,旨在提高判断主从延时的准确性。

为实现上述目的,本发明提出的一种检测主从延时方法,用于主库和从库之间的延时检测,所述检测主从延时方法包括如下步骤:

所述主库获得心跳表参数,所述心跳表参数至少包括心跳更新间隔;

根据所述心跳表参数创建第一心跳表;

根据所述心跳更新间隔对所述第一心跳表进行更新,所述更新内容至少包括用于记录当前时间的第一时间戳,所述第一时间戳用以供所述从库计算获得主从延时时间。

优选的,所述根据所述心跳更新间隔对所述第一心跳表进行更新的步骤包括:

在所述第一心跳表内更新一条记录,所述记录至少包含用于保存当前时间的第一时间戳;

通过所述心跳表参数获得心跳结束时间;

判断是否到达所述心跳结束时间;

若否,则睡眠到睡眠时间结束,并再次在所述第一心跳表内更新一条记录;其中,所述睡眠时间根据所述心跳更新间隔、上一条记录的更新时间、以及执行命令之后的当前时间获得;

若是,则结束心跳更新。

本发明提供的一种检测主从延时装置,用于主库和从库之间的延时检测,所述检测主从延时装置包括:

获取模块,用于所述主库获得心跳表参数,所述心跳表参数至少包括心跳更新间隔;

创建模块,用于根据所述心跳表参数创建第一心跳表;

更新模块,用于根据所述心跳更新间隔对所述第一心跳表进行更新,所述更新内容至少包括用于记录当前时间的第一时间戳,所述第一时间戳用以供所述从库计算获得主从延时时间。

优选的,所述更新模块包括:

更新单元,用于在所述第一心跳表内更新一条记录,所述记录至少包含用于保存当前时间的第一时间戳;

获得单元,用于通过所述心跳表参数获得心跳结束时间

计算单元,用于根据心跳参数内的执行时间而计算线程的结束时间;

判断单元,用于判断是否到达所述心跳结束时间,若否,则睡眠到睡眠时间结束,并再次在所述第一心跳表内更新一条记录;其中,所述睡眠时间根据所述心跳更新间隔、上一条记录的更新时间、以及执行命令之后的当前时间获得;若是,则结束心跳更新。

本发明提供的一种检测主从延时方法,用于主库和从库之间的延时检测,所述检测主从延时方法包括如下步骤:

所述从库预设有用于与所述主库同步的心跳表参数,所述心跳表参数至少包括心跳更新间隔;

根据所述心跳表参数内的心跳更新间隔对所述主库进行同步备份,并将所述主库内的第一心跳表同步备份为所述从库内的第二心跳表;

在所述第二心跳表内监控到第一时间戳时,记录所述从库当前时间为第二时间戳;

根据所述第一时间戳和所述第二时间戳之间的差值获得延时时间。

优选的,所述根据第一时间戳和第二时间戳之间的差值获得延时时间的步骤包括:

获得所述第一时间戳和第二时间戳之间的差值;

根据所获差值以及预设的频次输出延时时间;

通过心跳表参数而获得心跳结束时间;

判断是否到达所述心跳结束时间;

若否,则睡眠到睡眠时间结束,并再次获得所述第一时间戳和第二时间戳之间的差值”;其中,所述睡眠时间根据所述心跳更新间隔、上一次求差值的时间、以及执行命令之后的当前时间获得;

若是,则结束心跳监控。

本发明提供的一种检测主从延时装置,用于主库和从库之间的延时检测,所述检测主从延时装置包括:

预设模块,用于预设有用于与所述主库同步的心跳表参数,所述心跳表参数至少包括心跳更新间隔;

同步模块,用于根据所述心跳更新间隔对所述主库进行同步备份,并将所述主库内的第一心跳表同步备份为所述从库内的第二心跳表;

记录模块,用于在所述第二心跳表内监控到第一时间戳时,记录所述从库当前时间为第二时间戳;

计算模块,用于根据第一时间戳和第二时间戳之间的差值获得延时时间。

优选的,所述计算模块包括:

差值单元,用于获得所述第一时间戳和第二时间戳之间的差值;

输出单元,用于根据所获差值以及预设的频次输出延时时间;

获得单元,用于通过心跳表参数而获得心跳结束时间;

判断单元,用于判断是否到达所述心跳结束时间;若否,则睡眠到睡眠时间结束,然后返回步骤“获得所述第一时间戳和第二时间戳之间的差值”;其中,所述睡眠时间根据所述心跳更新间隔、上一次求差值的时间、以及执行命令之后的当前时间获得;若是,则结束心跳监控。

本发明提供的一种检测主从延时系统,包括主库和用于同步备份所述主库的从库,

所述主库用于获得心跳表参数,所述心跳表参数至少包括心跳更新间隔;根据所述心跳表参数创建第一心跳表;根据所述心跳更新间隔对所述第一心跳表进行更新,所述更新内容至少包括用于记录当前时间的第一时间戳,用以供所述从库计算获得主从延时时间;

所述从库用于预设有用于与所述主库同步的心跳表参数,所述心跳表参数至少包括心跳更新间隔;根据所述心跳表参数内的心跳更新间隔对所述主库进行同步备份,并将所述主库内的第一心跳表同步备份为所述从库内的第二心跳表;在所述第二心跳表内监控到第一时间戳时,记录所述从库当前时间为第二时间戳;根据第一时间戳和第二时间戳之间的差值获得延时时间。

优选的,所述主库和从库为mysql数据库;

所述主库和从库通过与相同的一个网络协议服务器NTP server来同步时钟。

本发明所提供的检测主从延时方法,通过在主库建立第一心跳表,则当从库进行备份时,将该第一心跳表复制为从库内的第二心跳表;则当从库检测到第二心跳表建立并且其中存在第一时间戳时,将当前时间保存为第二时间戳,再通过第一时间戳和第二时间戳之间进行求差值,从而可以获知延时信息。该方案相较于现有方案具有准确性更高的效果。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图示出的结构获得其他的附图。

图1为SQL数据的主从备份流程。

图2为本发明检测主从延时方法第一实施例的流程图;

图3为本发明检测主从延时方法第二实施例的流程图;

图4为本发明检测主从延时装置第一实施例的模块示意图;

图5为图4中所示的更新模块的模块示意图;

图6为本发明检测主从延时方法第三实施例的流程图;

图7为本发明检测主从延时方法第四实施例的流程图;

图8为本发明检测主从延时装置第二实施例的模块示意图;

图9为图8中所示的计算模块的模块示意图;

图10为本发明检测主从延时系统一实施例的流程图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

本发明提供了一种检测主从延时方法、装置和系统。为了更清楚说明,本实施例中以mysql数据库为例来进行详细说明。

如图1所示,该网站数据库系统包括主库master和从库slaver。

当主库发生数据更新,该更新的数据复制到从库的复制过程可以分为3大步骤:

1)主库Master将改变记录保存到二进制日志binary log中;这些记录叫做二进制日志事件binary log events;

2)从库Slave将master的binary log events拷贝到它的中继日志relay log;

3)从库Slave重做中继日志中的事件,将改变它自己的数据。

在整个复制过程汇总,从库有两个线程:I/O线程和SQL线程。

I/O线程用于在主库打开一个连接,用于获取二进制日志,并写入到中继日志。而SQL线程用于从中继日志里面读取事件,并重放其中的事件用以更新从库的数据,使得与主库的数据保持一致。

为检测主从复制的延时,即计算当主库出现数据变更开始,从库在多少时间内同步完成,Mysql数据库自带的命令show slave status。该命令show slave status可以通过输出Seconds_Behind_Master参数的值,来判断是否有发生主从延时。其中,Seconds_Behind_Master是通过比较SQL线程执行的event的timestamp和I/O线程复制好的event的timestamp(简写为ts)进行比较,而得到的这么一个差值。

但实际上Seconds_Behind_Master有时候是不准确的。由于中继日志和主库的二进制日志里面的内容完全一样,则从库在记录SQL语句的同时会被记录上当时的ts,所以比较参考的值来自于二进制日志。由此可知,比较真正是发生在I/O线程与SQL线程,其中I/O线程才真正与主库有关联。

当主库I/O负载很大或是网络阻塞,I/O线程不能及时复制在短时间内大量生成的二进制日志(没有中断,持续复制),而SQL线程一直都能跟上I/O线程的脚本,这时Seconds_Behind_Master的值是0,也就是系统认为的无延时。但是,实际上这是误判。这也就是现有的mysql数据库通过Seconds_Behind_Master这个参数用来监控延时是准确性存在波动,当I/O线程与主库网络很好的情况下准确性较高,而在高负载时准确性低。

下述各个实施例,皆以上述的mysql数据库为基准来进一步改进。

请参看图2,本发明检测主从延时方法第一实施例,用于主库和从库之间的延时检测,所述检测主从延时方法包括如下步骤:

步骤S110,所述主库获得心跳表参数,所述心跳表参数至少包括心跳更新间隔;其中,心跳表参数还可以包括:包含采用的数据库名、主库的server_id、是否采用后台服务执行、是否采用替换插入更新记录方式还是更新操作记录方式以及执行时间等信息。

步骤S120,根据所述心跳表参数创建第一心跳表;如之前已经存在,则删除重建第一心跳表。

步骤S130,根据所述心跳更新间隔对所述第一心跳表进行更新,所述更新内容至少包括用于记录当前时间的第一时间戳,所述第一时间戳用以供所述从库计算获得主从延时时间。其中,记录还可以包含主键ID,默认主键ID为1;可以使用now()方法来获取,具体的SQL语句可以是REPLACE INTO heartbeat(id,ts)VALUES(1,NOW())或者是UPDATE heartbeat SET ts=NOW()WHERE id=1。

本实施例,通过在主库建立第一心跳表,则当从库进行备份时,将该第一心跳表复制为从库内的第二心跳表;则当从库检测到第二心跳表建立并且其中存在第一时间戳时,将当前时间保存为第二时间戳,再通过第一时间戳和第二时间戳之间进行求差值,从而可以获知延时信息。该方案相较于现有方案具有准确性更高的效果。

优选的,所述主库和从库通过与相同的一个网络协议服务器NTP server来同步时钟。

请参看图3,本发明检测主从延时方法第二实施例,在第一实施例的基础上,本实施例对步骤S130进行进一步限定。所述步骤S130“根据所述心跳参数对所述第一心跳表进行更新”的步骤包括:

步骤S131,在所述第一心跳表内更新一条记录,所述记录至少包含用于保存当前时间的第一时间戳;由于该更新记录执行时间相对于网络延时非常短暂,因此该第一时间戳可以记录开始执行时间、执行中时间或执行结束时间。

步骤S132,通过所述心跳表参数而获得心跳结束时间;心跳结束时间预先设置,例如运行1小时,运行5000次,运行1小时和5000次中先到者,或者运行日常统计出来的高峰时间段等等。

步骤S133,判断是否到达所述心跳结束时间。若否,执行步骤S134;若是,则结束心跳更新。

步骤S134,则根据所述心跳更新间隔、上一条记录的更新时间、以及执行命令之后的当前时间获得睡眠时间。例如,获得心跳更新间隔,默认是1秒,并且可自定义配置。睡眠时间通过:获取执行命令(在所述第一心跳表内更新一条记录)之后的当前时间,该当前时间包括当前的秒数和微秒数;心跳更新间隔减去当前秒数,然后与心跳更新间隔取模之后的值乘以1000000,再减去微秒数,得出睡眠时间;计算公式如:(($interval-($now[0]%$interval))*1_000_000)-$now[1],从而保证每条更新命令都是在睡眠时间来临之时执行。

步骤S135,睡眠到睡眠时间结束,然后返回步骤S131“在所述第一心跳表内更新一条记录”。

本实施例,通过所述心跳更新间隔、上一条记录的更新时间、以及执行命令之后的当前时间获得睡眠时间,能够保证每条更新命令都是在睡眠时间来临之时执行。具有准确性更高的效果。

请参看图4,本发明检测主从延时装置第一实施例,一种主库100,所述主库100包括:

获取模块110,用于所述主库获得心跳表参数,所述心跳表参数至少包括心跳更新间隔;

创建模块120,用于根据所述心跳表参数创建第一心跳表;

更新模块130,用于根据所述心跳更新间隔对所述第一心跳表进行更新,所述更新内容至少包括用于记录当前时间的第一时间戳,所述第一时间戳用以供所述从库计算获得主从延时时间。

请参看图5,对更新模块130进行进一步限定,所述更新模块130包括:

更新单元131,用于在所述第一心跳表内更新一条记录,所述记录至少包含用于保存当前时间的第一时间戳;

获得单元132,用于通过心跳表参数而获得心跳结束时间

计算单元133,用于根据心跳参数内的执行时间而计算线程的结束时间;

判断单元134,用于判断是否到达所述心跳结束时间,若否,则睡眠到睡眠时间结束,然后返回步骤“在所述第一心跳表内更新一条记录”;其中,所述睡眠时间根据所述心跳更新间隔、上一条记录的更新时间、以及执行命令之后的当前时间获得;若是,则结束心跳更新。

本实施例提供的主库100是上述两方法实施例对应的装置实施例,因此,对上述方法项的改进皆可用于本实施例的主库100。

请参看图6,本发明检测主从延时方法第三实施例,一种检测主从延时方法,用于主库和从库之间的延时检测,所述检测主从延时方法包括如下步骤:

步骤S210,所述从库预设有用于与所述主库同步的心跳表参数,所述心跳表参数至少包括心跳更新间隔;其中,该心跳更新间隔与前两个实施例中的心跳更新间隔保持同步。

步骤S220,根据所述心跳表参数内的心跳更新间隔对所述主库进行同步备份,并将所述主库内的第一心跳表同步备份为所述从库内的第二心跳表。如果无第一心跳表则退出,并提示需要主库创建心跳表并同步一条记录过来;

步骤S230,在所述第二心跳表内监控到第一时间戳时,记录所述从库当前时间为第二时间戳。

步骤S230,根据第一时间戳和第二时间戳之间的差值获得延时时间。具体的SQL语句如SELECT UNIX_TIMESTAMP()-UNIX_TIMESTAMP(ts)AS delay FROM heartbeat WHERE id=1。

本实施例,通过在主库建立第一心跳表,则当从库进行备份时,将该第一心跳表复制为从库内的第二心跳表;则当从库检测到第二心跳表建立并且其中存在第一时间戳时,将当前时间保存为第二时间戳,再通过第一时间戳和第二时间戳之间进行求差值,从而可以获知延时信息。该方案相较于现有方案具有准确性更高的效果。

请参看图7,本发明检测主从延时方法第四实施例,以第三实施例为基础,对步骤S240进行进步限定;所述步骤S240“根据第一时间戳和第二时间戳之间的差值获得延时时间”的步骤包括:

步骤S241,获得所述第一时间戳和第二时间戳之间的差值。

步骤S242,根据所获差值以及预设的频次输出延时时间。例如可通过不一样的频次用于输出当前的主从延时时间,比如1秒内的延时时间,5秒内的延时时间等。从而具有更丰富的输出效果

步骤S243,通过心跳表参数而获得心跳结束时间。心跳结束时间预先设置,例如运行1小时,运行5000次,运行1小时和5000次中先到者,或者运行日常统计出来的高峰时间段等等。

步骤S244,判断是否到达所述心跳结束时间;若是,则结束心跳监控;若否,则执行步骤S241。

步骤S245,所述睡眠时间根据所述心跳更新间隔、上一次求差值的时间、以及执行命令之后的当前时间获得。例如,获得心跳更新间隔,与主库保持一致则默认是1秒,并且可自定义配置。睡眠时间通过:获取执行命令(获得所述第一时间戳和第二时间戳之间的差值)之后的当前时间,该当前时间包括当前的秒数和微秒数;心跳更新间隔减去当前秒数,然后与心跳更新间隔取模之后的值乘以1000000,再减去微秒数,得出睡眠时间。通过该方案可保证每条计算命令都是在睡眠时间来临之时执行,从而与主库保持长久的、稳定的一致。

步骤S246,则睡眠到睡眠时间结束,然后返回步骤“获得所述第一时间戳和第二时间戳之间的差值”。

本实施例,通过所述心跳更新间隔、上一次求差值的时间、以及执行命令之后的当前时间获得睡眠时间,能够保证每条更新命令都是在睡眠时间来临之时执行。具有准确性更高的效果。

请参看图8,本发明提供的检测主从延时装置第二实施例,一种从库200,用于主库和从库之间的延时检测,所述从库200包括:

预设模块210,用于预设有用于与所述主库同步的心跳表参数,所述心跳表参数至少包括心跳更新间隔。

同步模块220,用于根据所述心跳更新间隔对所述主库进行同步备份,并将所述主库内的第一心跳表同步备份为所述从库内的第二心跳表。

记录模块230,用于在所述第二心跳表内监控到第一时间戳时,记录所述从库当前时间为第二时间戳。

计算模块240,用于根据第一时间戳和第二时间戳之间的差值获得延时时间。

请参看图9,进一步的,所述计算模块240包括:

差值单元241,用于获得所述第一时间戳和第二时间戳之间的差值。

输出单元242,用于根据所获差值以及预设的频次输出延时时间。

获得单元243,用于通过心跳表参数而获得心跳结束时间。

判断单元244,用于判断是否到达所述心跳结束时间;若否,则睡眠到睡眠时间结束,然后返回步骤“在所述第一心跳表内更新一条记录”;其中,所述睡眠时间根据所述心跳更新间隔、上一次求差值的时间、以及执行命令之后的当前时间获得;若是,则结束心跳监控。

本实施例提供的从库200是上述两方法实施例对应的装置实施例,因此,对上述方法项的改进皆可用于本实施例的从库200。

请参看图10,本发明检测主从延时系统一实施例,所述包括检测主从延时系统300,包括主库和用于同步备份所述主库的从库。

所述主库100用于获得心跳表参数,所述心跳表参数至少包括心跳更新间隔;根据所述心跳表参数创建第一心跳表;根据所述心跳更新间隔对所述第一心跳表进行更新,所述更新内容至少包括用于记录当前时间的第一时间戳,用以供所述从库200计算获得主从延时时间。

所述从库200用于预设有用于与所述主库100同步的心跳表参数,所述心跳表参数至少包括心跳更新间隔;根据所述心跳表参数内的心跳更新间隔对所述主库100进行同步备份,并将所述主库100内的第一心跳表同步备份为所述从库200内的第二心跳表;在所述第二心跳表内监控到第一时间戳时,记录所述从库200当前时间为第二时间戳;根据第一时间戳和第二时间戳之间的差值获得延时时间。

优选的所述主库和从库通过与相同的一个网络协议服务器NTP server来同步时钟,从而获得更精确的时间。

即本实施例的主库采用上文实施例中的主库100,从库采用上文实施例中的从库200。因此对主库100和从库200的改进皆可用于本实施例。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是移动终端,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1