本发明涉及数据库技术领域,尤其涉及一种主备数据库切换方法和装置。
背景技术:
在现今数据库应用中,数据库并发度高、数据增长速度快是当今数据库业务两大特点。在短时间内,可能存在大量数据新增或修改。随着数据数量级递增,从字节、千字节、兆字节到现在的万兆字节,结合mariadb/mysql数据库良好横向扩展特性,基于mariadb/mysql数据库的分布式数据库得到广泛的应用。
同时为了提高数据库容灾性,各数据库提供商均提出了相应策略,其中mariadb/mysql数据库使用的是主从复制策略,其核心理念是主数据库对外提供服务,当主库有更新的时候,主库会把更新操作的sql写入二进制日志(binlog),并维护一个二进制日志文件的索引,以便于日志文件轮回(rotate)。从数据库读取主数据库运行所生成binlog日志,并执行binlog日志中相关动作,从而保证主从数据库数据一致。当数据库主机出现宕机,需要在较短时间内恢复应用,就需要使用从机来充当主数据库(即主备切换),如何判断从机数据库和主机数据库数据是否一致,如何在较短时间内将主从机数据库数据恢复成一致,成为一个技术难题。
主从复制是备机复制主机binlog日志,由于存在主机写日志时延和网络通讯时延以及备机回放日志时延等因素,因此必然存在主备日志不同步现象。当前业界识别主备数据是否一致的通常做法大致有两种:一种业务应用层用户自行在主数据库新增监控表,定期更新该表中的时间戳,管理模块监控主备机监控表中时间戳差值判断主备数据同步差距情况。另外一种是在数据库主备机分别增加dbagent代理模块,定时查询数据库的当前binlog位置,上报给管理模块,由管理模块判断主备机数据同步差距情况。
以上两种方式存在如下弊端:
1、均引入了第三方的管理模块,增加了交互复杂度,同时当第三方管理模块出现故障情况下,整个监控系统瘫痪,发生故障时无法实现切换。
2、由于引入第三方管理模块并且是定时上报,因此存在周期内的时间差问题,众所周知数据库应用每秒钟的tps都是成千上万的,而这种定时上报机制至少也是秒级,因此大大降低了判断精度,无法保证在切换的时候主备机是强一致的,对数据安全要求极高的保险类、证券类、银行类等行业是无法接受这种方案的。
3、上述方式二当数据库服务正常,而监控数据库运行情况的主dbagent代理模块异常,也可能会引起异常的数据库的主备切换。
技术实现要素:
本发明的主要目的在于提出一种主备数据库切换方法和装置,旨在解决现有技术中主备数据库进行切换时,数据精度差,操作复杂,稳定性低的问题。
为实现上述目的,本发明提出一种主备数据库切换方法,包括:
执行连接本机数据库服务操作;
接收对端数据库发送的对端数据库当前位置;
若所述连接本机数据库服务操作的失败次数超过预设的次数,则判定所述本机数据库异常,并执行告警操作或在所述本机数据库和所述对端数据库之间进行主备切换操作,或者,若所述接收对端数据库发送的对端数据库当前位置的失败次数超过预设的次数,则执行告警操作或在所述本机数据库和所述对端数据库之间进行主备切换操作。
优选地,所述执行连接本机数据库服务操作的步骤包括:
执行连接数据库服务操作,定时获取本机数据库当前位置;
所述接收对端数据库发送的对端数据库当前位置的步骤包括:
接收对端数据库发送的对端数据库当前位置,将所述本机数据库当前位置与所述对端数据库当前位置进行比对;
所述接收对端数据库发送的对端数据库当前位置,将所述本机数据库当前位置与所述对端数据库当前位置进行比对的步骤之后,还包括:
当所述本机数据库当前位置与所述对端数据库当前位置的差值大于预设的阈值时,执行告警操作。
优选地,所述若所述连接本机数据库服务操作的失败次数超过预设的次数,则判定所述本机数据库异常,并执行告警操作或在所述本机数据库和所述对端数据库之间进行主备切换操作的步骤包括:
若所述本机数据库为备数据库,所述对端数据库为主数据库,则执行告警操作,并继续执行连接检测操作;
若所述本机数据库为主数据库,所述对端数据库为备数据库,则解析所述本机数据库的日志文件,获取所述本机数据库的最后位置,并根据所述最后位置执行主备切换操作。
优选地,所述执行主备切换操作的步骤包括:
若所述主数据库的最后位置不为空,则对比所述主数据库的最后位置与所述备数据库当前位置,其中,若所述备数据库当前位置等于所述主数据库的最后位置,则执行自动切换操作,若所述备数据库当前位置小于所述主数据库的最后位置,则根据业务要求决策是否执行所述自动切换操作;
若所述主数据库的最后位置为空,则对比所述主数据库的当前位置与所述备数据库当前位置,其中,若所述备数据库当前位置大于或等于所述主数据库的当前位置,则执行所述自动切换操作,否则,则根据业务要求决策是否执行所述自动切换操作。
优选地,所述自动切换操作包括:
切换所述备数据库为主数据库,并在所述备数据库服务恢复后,重新恢复主备复制关系。
优选地,所述获取所述本机数据库的最后位置的步骤包括:
获取所述本机数据库的当前日志文件列表;
从所述当前日志文件列表中的最后一个日志文件开始扫描,并从所述最后一个日志文件的最后一个事件中获取所述本机数据库的最后位置;
若无法从所述最后一个日志文件找到所述最后一个事件,则扫描所述最后一个日志文件的上一个日志文件,直到找到所述最后一个事件。
为实现上述目的,本发明还提出一种主备数据库切换装置,包括:
连接模块,用于执行连接本机数据库服务操作;
位置模块,用于接收对端数据库发送的对端数据库当前位置;
执行模块,用于若所述连接本机数据库服务操作的失败次数超过预设的次数,则判定所述本机数据库异常,并执行告警操作或在所述本机数据库和所述对端数据库之间进行主备切换操作,或者,若所述接收对端数据库发送的对端数据库当 前位置的失败次数超过预设的次数,则执行告警操作或在所述本机数据库和所述对端数据库之间进行主备切换操作。
优选地,所述连接模块,还用于执行连接本机数据库服务操作,定时获取本机数据库当前位置;
所述位置模块,还用于接收对端数据库发送的对端数据库当前位置,将所述本机数据库当前位置与所述对端数据库当前位置进行比对;
所述装置还包括:
告警模块,用于当所述本机数据库当前位置与所述对端数据库当前位置的差值大于预设的阈值时,执行告警操作。
优选地,所述执行模块,还用于若所述本机数据库为备数据库,所述对端数据库为主数据库,则执行告警操作,并继续执行连接检测操作;若所述本机数据库为主数据库,所述对端数据库为备数据库,则解析所述本机数据库的日志文件,获取所述本机数据库的最后位置,并根据所述最后位置执行主备切换操作。
优选地,所述执行模块,还用于若所述主数据库的最后位置不为空,则对比所述主数据库的最后位置与所述备数据库当前位置,其中,若所述备数据库当前位置等于所述主数据库的最后位置,则执行自动切换操作,若所述备数据库当前位置小于所述主数据库的最后位置,则根据业务要求决策是否执行所述自动切换操作;若所述主数据库的最后位置为空,则对比所述主数据库的当前位置与所述备数据库当前位置,其中,若所述备数据库当前位置大于或等于所述主数据库的当前位置,则执行所述自动切换操作,否则,则根据业务要求决策是否执行所述自动切换操作。
优选地,所述执行模块,还用于若所述用户为非指定用户,则执行指定定向信息绑卡操作。
优选地,所述执行模块,还用于获取所述本机数据库的当前日志文件列表;从所述当前日志文件列表中的最后一个日志文件开始扫描,并从所述最后一个日志文件的最后一个事件中获取所述本机数据库的最后位置;若无法从所述最后一个日志文件找到所述最后一个事件,则扫描所述最后一个日志文件的上一个日志文件,直到找到所述最后一个事件。
本发明公开了一种主备数据库切换方法和装置,通过执行连接本机数据库服 务操作;接收对端数据库发送的对端数据库当前位置;若连接数据库服务操作的失败次数超过预设的次数,则判定本机数据库异常,并执行告警操作或在本机数据库和对端数据库之间进行主备切换操作,或者,若接收对端数据库发送的对端数据库当前位置的失败次数超过预设的次数,则执行告警操作或在本机数据库和对端数据库之间进行主备切换操作,解决了现有技术中主备数据库进行切换时,数据精度差,操作复杂,稳定性低的问题。实现了实时监控掌握主备数据库同步差距情况,简化操作,保证数据一致性,同时避免误切换。
附图说明
图1是本发明主备数据库切换方法第一实施例的流程示意图;
图2是本发明实施例中主备数据库复制监控管理架构图;
图3是本发明主备数据库切换方法第二实施例的流程示意图;
图4是本发明实施例中若所述连接本机数据库服务操作的失败次数超过预设的次数,则判定所述本机数据库异常,并执行告警操作或在所述本机数据库和所述对端数据库之间进行主备切换操作的步骤的一种流程示意图;
图5是本发明实施例中执行主备切换操作的步骤的一种流程示意图;
图6是本发明实施例中自动切换操作的步骤的一种流程示意图;
图7是本发明实施例中获取所述本机数据库的最后位置的步骤的一种流程示意图;
图8是本发明实施例中主备切换前后binlog日志位置变化关系图;
图9是本发明主备数据库切换装置第一实施例的功能模块示意图;
图10是本发明主备数据库切换装置第二实施例的功能模块示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,本发明第一实施例提出一种主备数据库切换方法,包括:
步骤s10,执行连接本机数据库服务操作。
本发明方法的执行主体可以为一种数据库管理平台或数据库服务器,具体应用于主数据库或备数据库将在下述说明书进行具体说明,当然也不限定于其他能够实现主备数据库切换的设备或服务器。
其中,本发明主要通过利用mariadb和binlog日志保障数据库主备数据同步过程可监控,保证数据库异常时快速自动切换。
其中,在具体实现时,可以在主备数据库所在设备上部署数据库代理软件dbagent(或其他能够实现相同功能的软件),dbagent是一种数据库代理软件,可以用于监控数据库服务运行情况,解析binlog日志文件,在出现故障时可以用于切换控制进程;其中,在mariadb数据库运行过程中,会将执行过的相关动作记录到binlog日志文件中,以备从数据库读取同步数据,mariadb数据库执行过程中,产生binlog日志文件时,会相应给出binlog位置,即当前日志位置(长整形值)。
具体地,主备数据库的dbagent定时监控本机数据库运行情况及当前binlog日志中的最新gtid,同时,主备数据库之间互相共享主备机数据库运行情况。
当本机数据库为主数据库,对端数据库为备数据库时:
主数据库的dbagent定时通过mysql协议,用特定的用户连接主数据库服务端口,查询并获取本机数据库当前位置(当前gtid_current_pos),并进行记录更新,通过心跳消息接口发送给备数据库的dbagent进行记录。
当本机数据库为备数据库,对端数据库为主数据库时:
备数据库的dbagent定时通过mysql协议,用特定的用户连接备数据库服务端口,查询并获取本机数据库当前位置(当前gtid_current_pos),并进行记录更新,通过心跳消息接口发送给主数据库的dbagent进行记录。
步骤s20,接收对端数据库发送的对端数据库当前位置。
具体地,当本机数据库为主数据库,对端数据库为备数据库时:
主数据库的dbagent接收备数据库的dbagent发送的心跳消息,记录备数据库当前gtid_current_pos位置。
当本机数据库为备数据库,对端数据库为主数据库时:
备数据库的dbagent接收主数据库的dbagent发送的心跳消息,记录主数据库当前gtid_current_pos位置。
步骤s30,若所述连接本机数据库服务操作的失败次数超过预设的次数,则判定所述本机数据库异常,并执行告警操作或在所述本机数据库和所述对端数据库之间进行主备切换操作,或者,若所述接收对端数据库发送的对端数据库当前位置的失败次数超过预设的次数,则执行告警操作或在所述本机数据库和所述对端数据库之间进行主备切换操作。
具体地,当本机数据库为备数据库,对端数据库为主数据库时:
若备数据库的dbagent连接数据库服务失败超出规定次数(比如10次,该次数可以是系统预先设置的,也可以由用户根据实际使用情况进行修改),判定当前主数据库异常,继续执行连接检测操作。
当本机数据库为主数据库,对端数据库为备数据库时:
若备数据库的dbagent连接数据库服务失败超出规定次数(比如10次,该次数可以是系统预先设置的,也可以由用户根据实际使用情况进行修改),判定当前主数据库异常,解析主数据库的日志文件,获取主数据库的最后位置,并根据最后位置执行主备切换操作,在具体实现时,可以采取如下方式:
1、通过解析数据库binlog日志文件的方式,获取主数据库最后的gtid_current_pos位置,记录为last_pos位置;
2、主数据库的dbagent发送切换请求消息至备数据库的dbagent,该消息中包括主数据库的last_pos位置;
3、主数据库的dbagent继续定时检测数据库服务是否正常,直至数据库服务恢复;
4、主数据库的dbagent根据切换请求中的主数据库的last_pos位置,发起主备切换流程,其中:
若主数据库的最后位置不为空,则对比主数据库的最后位置与备数据库当前位置,其中,若备数据库当前位置等于主数据库的最后位置,则执行自动切换操作,若备数据库当前位置小于主数据库的最后位置,则根据业务要求决策是否执行自动切换操作;
若主数据库的最后位置为空,则对比主数据库的当前位置与备数据库当前位置,其中,若备数据库当前位置大于或等于主数据库的当前位置,则执行自动切换操作,否则,则根据业务要求决策是否执行自动切换操作。
上述自动切换操作具体为:切换备数据库为主数据库,并在备数据库服务恢 复后,重新恢复主备复制关系。
或者,当主机数据库为主数据库,对端数据库为备数据库时:
如果主数据库的dbagent超出规定次数未接收到主数据库的dbagent发送的心跳消息,则执行告警告警操作。
当主机数据库为备数据库,对端数据库为主数据库时:
如果备数据库的dbagent超出规定次数未接收到主数据库的dbagent发送的心跳消息,则通过mysql协议连接主数据库服务端口获取主数据库当前位置gtid_current_pos,如果获取成功说明主数据库的dbagent进程运行异常,数据库服务正常,无须发起主备切换,只需告警并记录相关日志,如果获取失败,说明主数据库dbagent进程和数据库服务均异常,此时可以发起主备切换请求。
另外,如图2所示,为主从复制监控管理平台架构图,具体描述如下:
主数据库执行ddl语句或包含更新sql的事务时,为该事务分配一个全局唯一的顺序的gtid编号,事务提交前写入二进制binlog日志文件同时同步给从数据库,从数据库读取主数据库的binlog日志信息同步数据,回复执行对应的sql语句,从而达到与主数据库数据同步;
数据库代理软件dbagent定时监测本机数据库服务运行情况,通过mysql协议连接访问本机数据库监控数据库运行是否正常,同时获取本机数据库当前gtid_current_pos位置定时发送心跳消息给对端dbagent,dbagent接收到对端的心跳消息后解析记录对端数据库的gtid_current_pos位置,比对本机数据库与对端数据库的gtid_current_pos位置,根据差值判断主从数据库的数据同步情况,当主从数据库gtid_current_pos差距超过设定范围进行实时告警等相关措施。
进一步,数据库代理软件dbagent一定时间内接收不到对端dbagent发送的心跳消息后,主动通过mysql协议连接对端数据库服务,判断对端数据库服务是否正常,同时获取对端数据库的gtid_current_pos位置,如果连接失败则判定对端数据库异常,根据数据库的主从角色决策是否发起主备切换。
通过上述方案,本发明提供了一种主备数据库切换方法,该方法能够实时监控掌握主从数据同步差距情况,间接了解系统的写事务负载变化情况;去掉了第三方管理组件,直接规避了第三方管理组件故障引起的整个系统不可用问题;简化处理逻辑的同时也简化了安装部署,dbagent可以与db进行软件捆绑,各数据库节点部署统一简便;快速识别主备机数据库数据不一致,数据一致时能自动 进行主备切换,并构建新主从复制关系。数据不一致时能自动化生成差异化sql脚本,为人工干预节约时间,并高度保证数据一致性;在dbagent本身进程异常数据库服务正常情况下,避免不必要的误切换。
如图3所示,本发明第二实施例提出一种主备数据库切换方法,包括:
步骤s11,执行连接本机数据库服务操作,定时获取本机数据库当前位置。
具体地,主备数据库的dbagent定时监控本机数据库运行情况及当前binlog日志中的最新gtid,同时,主备数据库之间互相共享主备机数据库运行情况。
当本机数据库为主数据库,对端数据库为备数据库时:
主数据库的dbagent定时通过mysql协议,用特定的用户连接主数据库服务端口,查询并获取本机数据库当前位置(当前gtid_current_pos),并进行记录更新,通过心跳消息接口发送给备数据库的dbagent进行记录。
当本机数据库为备数据库,对端数据库为主数据库时:
备数据库的dbagent定时通过mysql协议,用特定的用户连接备数据库服务端口,查询并获取本机数据库当前位置(当前gtid_current_pos),并进行记录更新,通过心跳消息接口发送给主数据库的dbagent进行记录。
步骤s21,接收对端数据库发送的对端数据库当前位置,将所述本机数据库当前位置与所述对端数据库当前位置进行比对。
具体地,当本机数据库为主数据库,对端数据库为备数据库时:
主数据库的dbagent接收备数据库的dbagent发送的心跳消息,记录备数据库当前gtid_current_pos位置,比对主数据库的当前gtid_current_pos位置和备数据库的当前gtid_current_pos位置。
当本机数据库为备数据库,对端数据库为主数据库时:
备数据库的dbagent接收主数据库的dbagent发送的心跳消息,记录主数据库当前gtid_current_pos位置,比对主数据库的当前gtid_current_pos位置和备数据库的当前gtid_current_pos位置。
步骤s40,当所述本机数据库当前位置与所述对端数据库当前位置的差值大于预设的阈值时,执行告警操作。
具体地,当主数据库的当前gtid_current_pos位置和备数据库的当前gtid_current_pos位置差值大于配置的阈值时(该阈值可以是系统预先设置的,也 可以由用户根据实际使用情况进行修改),采取相应措施,如告警等。
通过上述方案,本发明提供了一种主备数据库切换方法,该方法能够实时监控掌握主从数据同步差距情况,间接了解系统的写事务负载变化情况;去掉了第三方管理组件,直接规避了第三方管理组件故障引起的整个系统不可用问题;简化处理逻辑的同时也简化了安装部署,dbagent可以与db进行软件捆绑,各数据库节点部署统一简便;快速识别主备机数据库数据不一致,数据一致时能自动进行主备切换,并构建新主从复制关系。数据不一致时能自动化生成差异化sql脚本,为人工干预节约时间,并高度保证数据一致性;在dbagent本身进程异常数据库服务正常情况下,避免不必要的误切换。
进一步的,为了更好地保证贮备数据库切换时数据的一致性,参照图4,为本发明具体实施方式中,若所述连接本机数据库服务操作的失败次数超过预设的次数,则判定所述本机数据库异常,并执行告警操作或在所述本机数据库和所述对端数据库之间进行主备切换操作的步骤的一种流程示意图。
作为一种实施方式,上述步骤s30包括:
步骤s31,若所述本机数据库为备数据库,所述对端数据库为主数据库,则执行告警操作,并继续执行连接检测操作。
具体地,当本机数据库为备数据库,对端数据库为主数据库时:
若备数据库的dbagent连接数据库服务失败超出规定次数(比如10次,该次数可以是系统预先设置的,也可以由用户根据实际使用情况进行修改),判定当前主数据库异常,继续执行连接检测操作。
步骤s32,若所述本机数据库为主数据库,所述对端数据库为备数据库,则解析所述本机数据库的日志文件,获取所述本机数据库的最后位置,并根据所述最后位置执行主备切换操作。
具体地,当本机数据库为主数据库,对端数据库为备数据库时:
若备数据库的dbagent连接数据库服务失败超出规定次数(比如10次,该次数可以是系统预先设置的,也可以由用户根据实际使用情况进行修改),判定当前主数据库异常,解析主数据库的日志文件,获取主数据库的最后位置,并根据最后位置执行主备切换操作,在具体实现时,可以采取如下方式:
1、通过解析数据库binlog日志文件的方式,获取主数据库最后的 gtid_current_pos位置,记录为last_pos位置;
2、主数据库的dbagent发送切换请求消息至备数据库的dbagent,该消息中包括主数据库的last_pos位置;
3、主数据库的dbagent继续定时检测数据库服务是否正常,直至数据库服务恢复;
4、主数据库的dbagent根据切换请求中的主数据库的last_pos位置,发起主备切换流程,其中:
若主数据库的最后位置不为空,则对比主数据库的最后位置与备数据库当前位置,其中,若备数据库当前位置等于主数据库的最后位置,则执行自动切换操作,若备数据库当前位置小于主数据库的最后位置,则根据业务要求决策是否执行自动切换操作;
若主数据库的最后位置为空,则对比主数据库的当前位置与备数据库当前位置,其中,若备数据库当前位置大于或等于主数据库的当前位置,则执行自动切换操作,否则,则根据业务要求决策是否执行自动切换操作。
通过上述方案,本发明提供了一种主备数据库切换方法,该方法通过在本机数据库异常时,主备数据库执行的不同处理方式,更好地实现了实时监控掌握主备数据库同步差距情况,简化操作,保证数据一致性,同时避免误切换。
进一步的,为了更好地保证贮备数据库切换时数据的一致性,参照图5,为本发明具体实施方式中,执行主备切换操作的步骤的一种流程示意图。
作为一种实施方式,上述步骤s32包括:
步骤s321,若所述主数据库的最后位置不为空,则对比所述主数据库的最后位置与所述备数据库当前位置,其中,若所述备数据库当前位置等于所述主数据库的最后位置,则执行自动切换操作,若所述备数据库当前位置小于所述主数据库的最后位置,则根据业务要求决策是否执行所述自动切换操作。
具体地,如果主数据库的last_pos位置不为空,则比较主数据库最后的gtid位置last_pos和备数据库的当前gtid_current_pos是否一致,如果备数据库gtid_current_pos等于主数据库last_pos则进行自动切换操作,如果备数据库gtid_current_pos小于主数据库last_pos说明主数据库的数据尚未完全同步至主数据库,主备数据库数据不一致,此时,可以根据业务要求决策是否需要自动切换 并记录相关的日志信息。
其中,根据mariadb的复制原理,不可能出现备数据库gtid_current_pos大于主数据库last_pos的情况。
步骤s322,若所述主数据库的最后位置为空,则对比所述主数据库的当前位置与所述备数据库当前位置,其中,若所述备数据库当前位置大于或等于所述主数据库的当前位置,则执行所述自动切换操作,否则,则根据业务要求决策是否执行所述自动切换操作。
具体地,如果主数据库last_pos位置为空,则比较主数据库当前的gtid位置gtid_current_pos和备数据库的当前gtid_current_pos是否一致,如果备数据库大于等于主数据库gtid_current_pos位置,则进行自动切换操作,否则,则说明主数据库的数据尚未完全同步至备数据库,主备数据库数据不一致,此时,可以根据业务要求决策是否需要自动切换并记录相关的日志信息。
通过上述方案,本发明提供了一种主备数据库切换方法,该方法通过根据不同情况执行相应的主备切换操作,更好地实现了实时监控掌握主备数据库同步差距情况,简化操作,保证数据一致性,同时避免误切换。
进一步的,为了更好地保证贮备数据库切换时数据的一致性,参照图6,为本发明具体实施方式中,执行自动切换操作的步骤的一种流程示意图。
作为一种实施方式,上述步骤s32包括:
步骤s323,切换所述备数据库为主数据库,并在所述备数据库服务恢复后,重新恢复主备复制关系。
具体地,dbagent切换备数据库为主数据库,将主原数据库设置为备数据库,待备数据库服务恢复后,dbagent重新恢复主备数据库复制关系;当主备数据库数据不一致时,则需要解析原主数据库的binlog日志文件,从备数据库的gtid_current_pos位置处解析之后的所有gtid涉及的sql语句,生成正向sql语句后,在原备数据库补充执行完毕后使得原主备数据库数据恢复一致。
通过上述方案,本发明提供了一种主备数据库切换方法,该方法通过执行自动切换操作,更好地实现了实时监控掌握主备数据库同步差距情况,简化操作,保证数据一致性,同时避免误切换。
进一步的,为了更好地保证贮备数据库切换时数据的一致性,参照图7,为本发明具体实施方式中,获取所述本机数据库的最后位置的步骤的一种流程示意图。
作为一种实施方式,上述步骤s32包括:
步骤s324,获取所述本机数据库的当前日志文件列表。
具体地,当主机数据库服务异常时,dbagent通过调用mysqlbinlog工具获取数据库最后的gtid位置last_pos。
其中,通过数据库binlog二进制日志文件夹下的index文件获取当前binlog文件列表。
步骤s325,从所述当前日志文件列表中的最后一个日志文件开始扫描,并从所述最后一个日志文件的最后一个事件中获取所述本机数据库的最后位置。
具体地,从最后一个binlog日志文件开始扫描,扫描找到这个binlog文件的最后一个gtid事件(gtid_log_event),获取最后一个gtid即为last_pos。
步骤s326,若无法从所述最后一个日志文件找到所述最后一个事件,则扫描所述最后一个日志文件的上一个日志文件,直到找到所述最后一个事件。
具体地,如果当前binlog没有找到gtid事件,即没有事务提交记录在这个binlog文件中,那么就扫描上一个binlog文件,循环往复,直到找到最后一个gtid。
进一步,通过binlog日志文件查找指定gtid_current_pos位置的方法同上述查找last_pos方法。
另外,如图8所示,为mariadb主备切换操作前后,主备数据库相应的binlog日志位置变换情况。
其中,posa是原主数据库最后一次上报的正常心跳消息中的gtid_current_pos位置;last_pos是原主数据库最后一个写事务实际写入binlog二进制日志中的最大gtid位置;posb为原备机数据库从主数据库复制binlog日志的最后一个事务对应的gtid位置;当last_pos、posb两者重合相等时,主备数据完全一致,可自动进行主备切换;当last_pos未知(掉电断网等物理机异常情况),posb大于等于posa时主备数据是否一致未知;此时进行主备切换后,待原主机恢复异常后需要重新确认last_pos位置与posb的关系,如果last_pos大于posb,则主备机之间有差异化binlog,否则主备机数据一致;当last_pos未知(掉电断网等物理机异常情况),posb小于posa时,原备机数据明显落后原主机,主备机数据 不一致。
通过上述方案,本发明提供了一种主备数据库切换方法,更好地实现了实时监控掌握主备数据库同步差距情况,简化操作,保证数据一致性,同时避免误切换。
基于上述方法实施例的实现,本发明还提供相应的装置实施例。
如图9所示,本发明第一实施例提出一种主备数据库切换装置,包括:
连接模块100,用于执行连接本机数据库服务操作。
其中,本发明主要通过利用mariadb和binlog日志保障数据库主备数据同步过程可监控,保证数据库异常时快速自动切换。
其中,在具体实现时,可以在主备数据库所在设备上部署数据库代理软件dbagent(或其他能够实现相同功能的软件),dbagent是一种数据库代理软件,可以用于监控数据库服务运行情况,解析binlog日志文件,在出现故障时可以用于切换控制进程;其中,在mariadb数据库运行过程中,会将执行过的相关动作记录到binlog日志文件中,以备从数据库读取同步数据,mariadb数据库执行过程中,产生binlog日志文件时,会相应给出binlog位置,即当前日志位置(长整形值)。
具体地,主备数据库的dbagent定时监控本机数据库运行情况及当前binlog日志中的最新gtid,同时,主备数据库之间互相共享主备机数据库运行情况。
当本机数据库为主数据库,对端数据库为备数据库时:
主数据库的dbagent定时通过mysql协议,用特定的用户连接主数据库服务端口,查询并获取本机数据库当前位置(当前gtid_current_pos),并进行记录更新,通过心跳消息接口发送给备数据库的dbagent进行记录。
当本机数据库为备数据库,对端数据库为主数据库时:
备数据库的dbagent定时通过mysql协议,用特定的用户连接备数据库服务端口,查询并获取本机数据库当前位置(当前gtid_current_pos),并进行记录更新,通过心跳消息接口发送给主数据库的dbagent进行记录。
位置模块200,用于接收对端数据库发送的对端数据库当前位置。
具体地,当本机数据库为主数据库,对端数据库为备数据库时:
主数据库的dbagent接收备数据库的dbagent发送的心跳消息,记录备数 据库当前gtid_current_pos位置。
当本机数据库为备数据库,对端数据库为主数据库时:
备数据库的dbagent接收主数据库的dbagent发送的心跳消息,记录主数据库当前gtid_current_pos位置。
执行模块300,用于若所述连接本机数据库服务操作的失败次数超过预设的次数,则判定所述本机数据库异常,并执行告警操作或在所述本机数据库和所述对端数据库之间进行主备切换操作,或者,若所述接收对端数据库发送的对端数据库当前位置的失败次数超过预设的次数,则执行告警操作或在所述本机数据库和所述对端数据库之间进行主备切换操作。
具体地,当本机数据库为备数据库,对端数据库为主数据库时:
若备数据库的dbagent连接数据库服务失败超出规定次数(比如10次,该次数可以是系统预先设置的,也可以由用户根据实际使用情况进行修改),判定当前主数据库异常,继续执行连接检测操作。
当本机数据库为主数据库,对端数据库为备数据库时:
若备数据库的dbagent连接数据库服务失败超出规定次数(比如10次,该次数可以是系统预先设置的,也可以由用户根据实际使用情况进行修改),判定当前主数据库异常,解析主数据库的日志文件,获取主数据库的最后位置,并根据最后位置执行主备切换操作,在具体实现时,可以采取如下方式:
1、通过解析数据库binlog日志文件的方式,获取主数据库最后的gtid_current_pos位置,记录为last_pos位置;
2、主数据库的dbagent发送切换请求消息至备数据库的dbagent,该消息中包括主数据库的last_pos位置;
3、主数据库的dbagent继续定时检测数据库服务是否正常,直至数据库服务恢复;
4、主数据库的dbagent根据切换请求中的主数据库的last_pos位置,发起主备切换流程,其中:
若主数据库的最后位置不为空,则对比主数据库的最后位置与备数据库当前位置,其中,若备数据库当前位置等于主数据库的最后位置,则执行自动切换操作,若备数据库当前位置小于主数据库的最后位置,则根据业务要求决策是否执行自动切换操作;
若主数据库的最后位置为空,则对比主数据库的当前位置与备数据库当前位置,其中,若备数据库当前位置大于或等于主数据库的当前位置,则执行自动切换操作,否则,则根据业务要求决策是否执行自动切换操作。
上述自动切换操作具体为:切换备数据库为主数据库,并在备数据库服务恢复后,重新恢复主备复制关系。
或者,当主机数据库为主数据库,对端数据库为备数据库时:
如果主数据库的dbagent超出规定次数未接收到主数据库的dbagent发送的心跳消息,则执行告警告警操作。
当主机数据库为备数据库,对端数据库为主数据库时:
如果备数据库的dbagent超出规定次数未接收到主数据库的dbagent发送的心跳消息,则通过mysql协议连接主数据库服务端口获取主数据库当前位置gtid_current_pos,如果获取成功说明主数据库的dbagent进程运行异常,数据库服务正常,无须发起主备切换,只需告警并记录相关日志,如果获取失败,说明主数据库dbagent进程和数据库服务均异常,此时可以发起主备切换请求。
另外,如图2所示,为主从复制监控管理平台架构图,具体描述如下:
主数据库执行ddl语句或包含更新sql的事务时,为该事务分配一个全局唯一的顺序的gtid编号,事务提交前写入二进制binlog日志文件同时同步给从数据库,从数据库读取主数据库的binlog日志信息同步数据,回复执行对应的sql语句,从而达到与主数据库数据同步;
数据库代理软件dbagent定时监测本机数据库服务运行情况,通过mysql协议连接访问本机数据库监控数据库运行是否正常,同时获取本机数据库当前gtid_current_pos位置定时发送心跳消息给对端dbagent,dbagent接收到对端的心跳消息后解析记录对端数据库的gtid_current_pos位置,比对本机数据库与对端数据库的gtid_current_pos位置,根据差值判断主从数据库的数据同步情况,当主从数据库gtid_current_pos差距超过设定范围进行实时告警等相关措施。
进一步,数据库代理软件dbagent一定时间内接收不到对端dbagent发送的心跳消息后,主动通过mysql协议连接对端数据库服务,判断对端数据库服务是否正常,同时获取对端数据库的gtid_current_pos位置,如果连接失败则判定对端数据库异常,根据数据库的主从角色决策是否发起主备切换。
通过上述方案,本发明提供了一种主备数据库切换装置,该方法能够实时监 控掌握主从数据同步差距情况,间接了解系统的写事务负载变化情况;去掉了第三方管理组件,直接规避了第三方管理组件故障引起的整个系统不可用问题;简化处理逻辑的同时也简化了安装部署,dbagent可以与db进行软件捆绑,各数据库节点部署统一简便;快速识别主备机数据库数据不一致,数据一致时能自动进行主备切换,并构建新主从复制关系。数据不一致时能自动化生成差异化sql脚本,为人工干预节约时间,并高度保证数据一致性;在dbagent本身进程异常数据库服务正常情况下,避免不必要的误切换。
如图10所示,本发明第二实施例提出一种主备数据库切换装置,其中:
上述连接模块100,还用于执行连接本机数据库服务操作,定时获取本机数据库当前位置。
具体地,主备数据库的dbagent定时监控本机数据库运行情况及当前binlog日志中的最新gtid,同时,主备数据库之间互相共享主备机数据库运行情况。
当本机数据库为主数据库,对端数据库为备数据库时:
主数据库的dbagent定时通过mysql协议,用特定的用户连接主数据库服务端口,查询并获取本机数据库当前位置(当前gtid_current_pos),并进行记录更新,通过心跳消息接口发送给备数据库的dbagent进行记录。
当本机数据库为备数据库,对端数据库为主数据库时:
备数据库的dbagent定时通过mysql协议,用特定的用户连接备数据库服务端口,查询并获取本机数据库当前位置(当前gtid_current_pos),并进行记录更新,通过心跳消息接口发送给主数据库的dbagent进行记录。
上述位置模块200,还用于接收对端数据库发送的对端数据库当前位置,将所述本机数据库当前位置与所述对端数据库当前位置进行比对。
具体地,当本机数据库为主数据库,对端数据库为备数据库时:
主数据库的dbagent接收备数据库的dbagent发送的心跳消息,记录备数据库当前gtid_current_pos位置,比对主数据库的当前gtid_current_pos位置和备数据库的当前gtid_current_pos位置。
当本机数据库为备数据库,对端数据库为主数据库时:
备数据库的dbagent接收主数据库的dbagent发送的心跳消息,记录主数据库当前gtid_current_pos位置,比对主数据库的当前gtid_current_pos位置和备 数据库的当前gtid_current_pos位置。
该装置还包括:
告警模块400,用于当所述本机数据库当前位置与所述对端数据库当前位置的差值大于预设的阈值时,执行告警操作。
具体地,当主数据库的当前gtid_current_pos位置和备数据库的当前gtid_current_pos位置差值大于配置的阈值时(该阈值可以是系统预先设置的,也可以由用户根据实际使用情况进行修改),采取相应措施,如告警等。
通过上述方案,本发明提供了一种主备数据库切换装置,该方法能够实时监控掌握主从数据同步差距情况,间接了解系统的写事务负载变化情况;去掉了第三方管理组件,直接规避了第三方管理组件故障引起的整个系统不可用问题;简化处理逻辑的同时也简化了安装部署,dbagent可以与db进行软件捆绑,各数据库节点部署统一简便;快速识别主备机数据库数据不一致,数据一致时能自动进行主备切换,并构建新主从复制关系。数据不一致时能自动化生成差异化sql脚本,为人工干预节约时间,并高度保证数据一致性;在dbagent本身进程异常数据库服务正常情况下,避免不必要的误切换。
进一步的,为了更好地保证贮备数据库切换时数据的一致性,上述执行模块300,还用于若所述本机数据库为备数据库,所述对端数据库为主数据库,则执行告警操作,并继续执行连接检测操作;若所述本机数据库为主数据库,所述对端数据库为备数据库,则解析所述本机数据库的日志文件,获取所述本机数据库的最后位置,并根据所述最后位置执行主备切换操作。
具体地,当本机数据库为备数据库,对端数据库为主数据库时:
若备数据库的dbagent连接数据库服务失败超出规定次数(比如10次,该次数可以是系统预先设置的,也可以由用户根据实际使用情况进行修改),判定当前主数据库异常,继续执行连接检测操作。
然后,当本机数据库为主数据库,对端数据库为备数据库时:
若备数据库的dbagent连接数据库服务失败超出规定次数(比如10次,该次数可以是系统预先设置的,也可以由用户根据实际使用情况进行修改),判定当前主数据库异常,解析主数据库的日志文件,获取主数据库的最后位置,并根据最后位置执行主备切换操作,在具体实现时,可以采取如下方式:
1、通过解析数据库binlog日志文件的方式,获取主数据库最后的gtid_current_pos位置,记录为last_pos位置;
2、主数据库的dbagent发送切换请求消息至备数据库的dbagent,该消息中包括主数据库的last_pos位置;
3、主数据库的dbagent继续定时检测数据库服务是否正常,直至数据库服务恢复;
4、主数据库的dbagent根据切换请求中的主数据库的last_pos位置,发起主备切换流程,其中:
若主数据库的最后位置不为空,则对比主数据库的最后位置与备数据库当前位置,其中,若备数据库当前位置等于主数据库的最后位置,则执行自动切换操作,若备数据库当前位置小于主数据库的最后位置,则根据业务要求决策是否执行自动切换操作;
若主数据库的最后位置为空,则对比主数据库的当前位置与备数据库当前位置,其中,若备数据库当前位置大于或等于主数据库的当前位置,则执行自动切换操作,否则,则根据业务要求决策是否执行自动切换操作。
通过上述方案,本发明提供了一种主备数据库切换装置,该方法通过在本机数据库异常时,主备数据库执行的不同处理方式,更好地实现了实时监控掌握主备数据库同步差距情况,简化操作,保证数据一致性,同时避免误切换。
进一步的,为了更好地保证贮备数据库切换时数据的一致性,上述执行模块300,还用于若所述主数据库的最后位置不为空,则对比所述主数据库的最后位置与所述备数据库当前位置,其中,若所述备数据库当前位置等于所述主数据库的最后位置,则执行自动切换操作,若所述备数据库当前位置小于所述主数据库的最后位置,则根据业务要求决策是否执行所述自动切换操作;若所述主数据库的最后位置为空,则对比所述主数据库的当前位置与所述备数据库当前位置,其中,若所述备数据库当前位置大于或等于所述主数据库的当前位置,则执行所述自动切换操作,否则,则根据业务要求决策是否执行所述自动切换操作。
具体地,如果主数据库的last_pos位置不为空,则比较主数据库最后的gtid位置last_pos和备数据库的当前gtid_current_pos是否一致,如果备数据库gtid_current_pos等于主数据库last_pos则进行自动切换操作,如果备数据库 gtid_current_pos小于主数据库last_pos说明主数据库的数据尚未完全同步至主数据库,主备数据库数据不一致,此时,可以根据业务要求决策是否需要自动切换并记录相关的日志信息。
其中,根据mariadb的复制原理,不可能出现备数据库gtid_current_pos大于主数据库last_pos的情况。
然后,如果主数据库last_pos位置为空,则比较主数据库当前的gtid位置gtid_current_pos和备数据库的当前gtid_current_pos是否一致,如果备数据库大于等于主数据库gtid_current_pos位置,则进行自动切换操作,否则,则说明主数据库的数据尚未完全同步至备数据库,主备数据库数据不一致,此时,可以根据业务要求决策是否需要自动切换并记录相关的日志信息。
通过上述方案,本发明提供了一种主备数据库切换装置,该方法通过根据不同情况执行相应的主备切换操作,更好地实现了实时监控掌握主备数据库同步差距情况,简化操作,保证数据一致性,同时避免误切换。
进一步的,为了更好地保证贮备数据库切换时数据的一致性,上述执行模块300,还用于切换所述备数据库为主数据库,并在所述备数据库服务恢复后,重新恢复主备复制关系。
具体地,dbagent切换备数据库为主数据库,将主原数据库设置为备数据库,待备数据库服务恢复后,dbagent重新恢复主备数据库复制关系;当主备数据库数据不一致时,则需要解析原主数据库的binlog日志文件,从备数据库的gtid_current_pos位置处解析之后的所有gtid涉及的sql语句,生成正向sql语句后,在原备数据库补充执行完毕后使得原主备数据库数据恢复一致。
通过上述方案,本发明提供了一种主备数据库切换装置,该方法通过执行自动切换操作,更好地实现了实时监控掌握主备数据库同步差距情况,简化操作,保证数据一致性,同时避免误切换。
进一步的,为了更好地保证贮备数据库切换时数据的一致性,上述执行模块300,还用于获取所述本机数据库的当前日志文件列表;从所述当前日志文件列表中的最后一个日志文件开始扫描,并从所述最后一个日志文件的最后一个事件中获取所述本机数据库的最后位置;若无法从所述最后一个日志文件找到所述最 后一个事件,则扫描所述最后一个日志文件的上一个日志文件,直到找到所述最后一个事件。
具体地,当主机数据库服务异常时,dbagent通过调用mysqlbinlog工具获取数据库最后的gtid位置last_pos。
其中,通过数据库binlog二进制日志文件夹下的index文件获取当前binlog文件列表。
然后,从最后一个binlog日志文件开始扫描,扫描找到这个binlog文件的最后一个gtid事件(gtid_log_event),获取最后一个gtid即为last_pos。
然后,如果当前binlog没有找到gtid事件,即没有事务提交记录在这个binlog文件中,那么就扫描上一个binlog文件,循环往复,直到找到最后一个gtid。
进一步,通过binlog日志文件查找指定gtid_current_pos位置的方法同上述查找last_pos方法。
另外,如图8所示,为mariadb主备切换操作前后,主备数据库相应的binlog日志位置变换情况。
其中,posa是原主数据库最后一次上报的正常心跳消息中的gtid_current_pos位置;last_pos是原主数据库最后一个写事务实际写入binlog二进制日志中的最大gtid位置;posb为原备机数据库从主数据库复制binlog日志的最后一个事务对应的gtid位置;当last_pos、posb两者重合相等时,主备数据完全一致,可自动进行主备切换;当last_pos未知(掉电断网等物理机异常情况),posb大于等于posa时主备数据是否一致未知;此时进行主备切换后,待原主机恢复异常后需要重新确认last_pos位置与posb的关系,如果last_pos大于posb,则主备机之间有差异化binlog,否则主备机数据一致;当last_pos未知(掉电断网等物理机异常情况),posb小于posa时,原备机数据明显落后原主机,主备机数据不一致。
通过上述方案,本发明提供了一种主备数据库切换装置,更好地实现了实时监控掌握主备数据库同步差距情况,简化操作,保证数据一致性,同时避免误切换。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在 其他相关的技术领域,均同理包括在本发明的专利保护范围内。